blob: e5dbe9bae0cd8a15a9060e75d871c3e07db9c3d5 [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;
Tim Northoverd88ecb32016-01-27 19:32:40 +0000701 ABI = Triple.isWatchABI() ? FloatABI::Hard : ABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000702 break;
703 }
Tim Northover756447a2015-10-30 16:30:36 +0000704 case llvm::Triple::WatchOS:
705 ABI = FloatABI::Hard;
706 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000707
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000708 // FIXME: this is invalid for WindowsCE
709 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000710 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000711 break;
712
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000713 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000714 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000715 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000716 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000717 break;
718 default:
719 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000720 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000721 break;
722 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000723 break;
724
Daniel Dunbar78485922009-09-10 23:00:09 +0000725 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000726 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000727 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000728 case llvm::Triple::EABIHF:
729 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000730 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000731 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000732 case llvm::Triple::EABI:
733 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000734 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000735 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000736 case llvm::Triple::Android:
737 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000738 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000739 default:
740 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000741 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000742 if (Triple.getOS() != llvm::Triple::UnknownOS ||
743 !Triple.isOSBinFormatMachO())
744 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000745 break;
746 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000747 }
748 }
749
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000750 assert(ABI != FloatABI::Invalid && "must select an ABI");
751 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000752}
753
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000754static void getARMTargetFeatures(const ToolChain &TC,
755 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000756 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000757 std::vector<const char *> &Features,
758 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000759 const Driver &D = TC.getDriver();
760
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000761 bool KernelOrKext =
762 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000763 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000764 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
765 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
766
Nico Weber6e0ebae2015-04-29 21:16:40 +0000767 if (!ForAS) {
768 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
769 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
770 // stripped out by the ARM target. We should probably pass this a new
771 // -target-option, which is handled by the -cc1/-cc1as invocation.
772 //
773 // FIXME2: For consistency, it would be ideal if we set up the target
774 // machine state the same when using the frontend or the assembler. We don't
775 // currently do that for the assembler, we pass the options directly to the
776 // backend and never even instantiate the frontend TargetInfo. If we did,
777 // and used its handleTargetFeatures hook, then we could ensure the
778 // assembler and the frontend behave the same.
779
780 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000781 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000782 Features.push_back("+soft-float");
783
784 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000785 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000786 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000787 } else {
788 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
789 // to the assembler correctly.
790 for (const Arg *A :
791 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
792 StringRef Value = A->getValue();
793 if (Value.startswith("-mfpu=")) {
794 WaFPU = A;
795 } else if (Value.startswith("-mcpu=")) {
796 WaCPU = A;
797 } else if (Value.startswith("-mhwdiv=")) {
798 WaHDiv = A;
799 } else if (Value.startswith("-march=")) {
800 WaArch = A;
801 }
802 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000803 }
804
Renato Golin7c542b42015-07-27 23:44:45 +0000805 // Check -march. ClangAs gives preference to -Wa,-march=.
806 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000807 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000808 if (WaArch) {
809 if (ArchArg)
810 D.Diag(clang::diag::warn_drv_unused_argument)
811 << ArchArg->getAsString(Args);
812 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000813 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000814 // FIXME: Set Arch.
815 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
816 } else if (ArchArg) {
817 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000818 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000819 }
820
Renato Golin7c542b42015-07-27 23:44:45 +0000821 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
822 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000823 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000824 if (WaCPU) {
825 if (CPUArg)
826 D.Diag(clang::diag::warn_drv_unused_argument)
827 << CPUArg->getAsString(Args);
828 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000829 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000830 } else if (CPUArg) {
831 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000832 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000833 }
John Brawna95c1a82015-05-08 12:52:18 +0000834
Renato Golin23459c62015-07-30 16:40:17 +0000835 // Add CPU features for generic CPUs
836 if (CPUName == "native") {
837 llvm::StringMap<bool> HostFeatures;
838 if (llvm::sys::getHostCPUFeatures(HostFeatures))
839 for (auto &F : HostFeatures)
840 Features.push_back(
841 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
842 }
843
844 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
845 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
846 if (WaFPU) {
847 if (FPUArg)
848 D.Diag(clang::diag::warn_drv_unused_argument)
849 << FPUArg->getAsString(Args);
850 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
851 Features);
852 } else if (FPUArg) {
853 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
854 }
855
856 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
857 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
858 if (WaHDiv) {
859 if (HDivArg)
860 D.Diag(clang::diag::warn_drv_unused_argument)
861 << HDivArg->getAsString(Args);
862 getARMHWDivFeatures(D, WaHDiv, Args,
863 StringRef(WaHDiv->getValue()).substr(8), Features);
864 } else if (HDivArg)
865 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
866
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000867 // Setting -msoft-float effectively disables NEON because of the GCC
868 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000869 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000870 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000871 // Also need to explicitly disable features which imply NEON.
872 Features.push_back("-crypto");
873 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000874
Eric Christopher269c2a22015-04-04 03:34:43 +0000875 // En/disable crc code generation.
876 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000877 if (A->getOption().matches(options::OPT_mcrc))
878 Features.push_back("+crc");
879 else
880 Features.push_back("-crc");
881 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000882
Akira Hatanakac2694822015-07-07 08:28:42 +0000883 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
884 // neither options are specified, see if we are compiling for kernel/kext and
885 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000886 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
887 options::OPT_mno_long_calls)) {
888 if (A->getOption().matches(options::OPT_mlong_calls))
889 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000890 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
891 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000892 Features.push_back("+long-calls");
893 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000894
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000895 // Kernel code has more strict alignment requirements.
896 if (KernelOrKext)
897 Features.push_back("+strict-align");
898 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
899 options::OPT_munaligned_access)) {
900 if (A->getOption().matches(options::OPT_munaligned_access)) {
901 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
902 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
903 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
904 } else
905 Features.push_back("+strict-align");
906 } else {
907 // Assume pre-ARMv6 doesn't support unaligned accesses.
908 //
909 // ARMv6 may or may not support unaligned accesses depending on the
910 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
911 // Darwin and NetBSD targets support unaligned accesses, and others don't.
912 //
913 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
914 // which raises an alignment fault on unaligned accesses. Linux
915 // defaults this bit to 0 and handles it as a system-wide (not
916 // per-process) setting. It is therefore safe to assume that ARMv7+
917 // Linux targets support unaligned accesses. The same goes for NaCl.
918 //
919 // The above behavior is consistent with GCC.
920 int VersionNum = getARMSubArchVersionNumber(Triple);
921 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000922 if (VersionNum < 6 ||
923 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000924 Features.push_back("+strict-align");
925 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
926 if (VersionNum < 7)
927 Features.push_back("+strict-align");
928 } else
929 Features.push_back("+strict-align");
930 }
931
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000932 // llvm does not support reserving registers in general. There is support
933 // for reserving r9 on ARM though (defined as a platform-specific register
934 // in ARM EABI).
935 if (Args.hasArg(options::OPT_ffixed_r9))
936 Features.push_back("+reserve-r9");
937
Dimitry Andric08107392016-01-06 07:42:18 +0000938 // The kext linker doesn't know how to deal with movw/movt.
939 if (KernelOrKext || Args.hasArg(options::OPT_mno_movt))
Akira Hatanaka580efb22015-07-16 00:43:00 +0000940 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000941}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000942
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000943void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
944 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000945 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000946 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000947 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000948 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000949 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000950 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000951 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000952 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000953 ABIName = "aapcs";
Tim Northoverd88ecb32016-01-27 19:32:40 +0000954 } else if (Triple.isWatchABI()) {
Tim Northover756447a2015-10-30 16:30:36 +0000955 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000956 } else {
957 ABIName = "apcs-gnu";
958 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000959 } else if (Triple.isOSWindows()) {
960 // FIXME: this is invalid for WindowsCE
961 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000962 } else {
963 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000964 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000965 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000966 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000967 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000968 ABIName = "aapcs-linux";
969 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000970 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000971 case llvm::Triple::EABI:
972 ABIName = "aapcs";
973 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000974 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000975 if (Triple.getOS() == llvm::Triple::NetBSD)
976 ABIName = "apcs-gnu";
977 else
978 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000979 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000980 }
981 }
982 CmdArgs.push_back("-target-abi");
983 CmdArgs.push_back(ABIName);
984
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000985 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000986 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000987 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000988 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000989 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000990 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000991 CmdArgs.push_back("-mfloat-abi");
992 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000993 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000994 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000995 CmdArgs.push_back("-mfloat-abi");
996 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000997 } else {
998 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000999 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +00001000 CmdArgs.push_back("-mfloat-abi");
1001 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +00001002 }
Daniel Dunbar893d4752009-12-19 04:15:38 +00001003
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001004 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +00001005 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1006 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001007 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001008 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001009 CmdArgs.push_back("-arm-global-merge=false");
1010 else
1011 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +00001012 }
Chad Rosierf1985d22012-05-16 20:40:09 +00001013
Bob Wilson9c8af452013-04-11 18:53:25 +00001014 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001015 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001016 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001017}
Renato Goline17c5802015-07-27 23:44:42 +00001018// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001019
Tim Northover573cbee2014-05-24 12:52:07 +00001020/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1021/// targeting.
1022static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001023 Arg *A;
1024 std::string CPU;
1025 // If we have -mtune or -mcpu, use that.
1026 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001027 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001028 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001029 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001030 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001031 }
1032
Kevin Qin110db6f2014-07-18 07:03:22 +00001033 // Handle CPU name is 'native'.
1034 if (CPU == "native")
1035 return llvm::sys::getHostCPUName();
1036 else if (CPU.size())
1037 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001038
James Molloy9b1586b2014-04-17 12:51:17 +00001039 // Make sure we pick "cyclone" if -arch is used.
1040 // FIXME: Should this be picked by checking the target triple instead?
1041 if (Args.getLastArg(options::OPT_arch))
1042 return "cyclone";
1043
1044 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001045}
1046
Tim Northover573cbee2014-05-24 12:52:07 +00001047void Clang::AddAArch64TargetArgs(const ArgList &Args,
1048 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001049 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1050 llvm::Triple Triple(TripleStr);
1051
1052 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1053 Args.hasArg(options::OPT_mkernel) ||
1054 Args.hasArg(options::OPT_fapple_kext))
1055 CmdArgs.push_back("-disable-red-zone");
1056
1057 if (!Args.hasFlag(options::OPT_mimplicit_float,
1058 options::OPT_mno_implicit_float, true))
1059 CmdArgs.push_back("-no-implicit-float");
1060
Craig Topper92fc2df2014-05-17 16:56:41 +00001061 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001062 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1063 ABIName = A->getValue();
1064 else if (Triple.isOSDarwin())
1065 ABIName = "darwinpcs";
1066 else
1067 ABIName = "aapcs";
1068
1069 CmdArgs.push_back("-target-abi");
1070 CmdArgs.push_back(ABIName);
1071
Bradley Smith9ff64332014-10-13 10:16:06 +00001072 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1073 options::OPT_mno_fix_cortex_a53_835769)) {
1074 CmdArgs.push_back("-backend-option");
1075 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1076 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1077 else
1078 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001079 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001080 // Enabled A53 errata (835769) workaround by default on android
1081 CmdArgs.push_back("-backend-option");
1082 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001083 }
1084
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001085 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001086 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1087 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001088 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001089 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001090 CmdArgs.push_back("-aarch64-global-merge=false");
1091 else
1092 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001093 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001094}
1095
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001096// Get CPU and ABI names. They are not independent
1097// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001098void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1099 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001100 const char *DefMips32CPU = "mips32r2";
1101 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001102
Daniel Sanders2bf13662014-07-10 14:40:57 +00001103 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1104 // default for mips64(el)?-img-linux-gnu.
1105 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1106 Triple.getEnvironment() == llvm::Triple::GNU) {
1107 DefMips32CPU = "mips32r6";
1108 DefMips64CPU = "mips64r6";
1109 }
Renato Golin7c542b42015-07-27 23:44:45 +00001110
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001111 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001112 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001113 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001114
Brad Smithba26f582015-01-06 02:53:17 +00001115 // MIPS3 is the default for mips64*-unknown-openbsd.
1116 if (Triple.getOS() == llvm::Triple::OpenBSD)
1117 DefMips64CPU = "mips3";
1118
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001119 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001120 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001121
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001122 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001123 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001124 // Convert a GNU style Mips ABI name to the name
1125 // accepted by LLVM Mips backend.
1126 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001127 .Case("32", "o32")
1128 .Case("64", "n64")
1129 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001130 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001131
1132 // Setup default CPU and ABI names.
1133 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001134 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001135 default:
1136 llvm_unreachable("Unexpected triple arch name");
1137 case llvm::Triple::mips:
1138 case llvm::Triple::mipsel:
1139 CPUName = DefMips32CPU;
1140 break;
1141 case llvm::Triple::mips64:
1142 case llvm::Triple::mips64el:
1143 CPUName = DefMips64CPU;
1144 break;
1145 }
1146 }
1147
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001148 if (ABIName.empty()) {
1149 // Deduce ABI name from the target triple.
1150 if (Triple.getArch() == llvm::Triple::mips ||
1151 Triple.getArch() == llvm::Triple::mipsel)
1152 ABIName = "o32";
1153 else
1154 ABIName = "n64";
1155 }
1156
1157 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001158 // Deduce CPU name from ABI name.
1159 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001160 .Cases("o32", "eabi", DefMips32CPU)
1161 .Cases("n32", "n64", DefMips64CPU)
1162 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001163 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001164
1165 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001166}
1167
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001168std::string mips::getMipsABILibSuffix(const ArgList &Args,
1169 const llvm::Triple &Triple) {
1170 StringRef CPUName, ABIName;
1171 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1172 return llvm::StringSwitch<std::string>(ABIName)
1173 .Case("o32", "")
1174 .Case("n32", "32")
1175 .Case("n64", "64");
1176}
1177
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001178// Convert ABI name to the GNU tools acceptable variant.
1179static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1180 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001181 .Case("o32", "32")
1182 .Case("n64", "64")
1183 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001184}
1185
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001186// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1187// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001188static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1189 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001190 if (Arg *A =
1191 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1192 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001193 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001194 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001195 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001196 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001197 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001198 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1199 .Case("soft", mips::FloatABI::Soft)
1200 .Case("hard", mips::FloatABI::Hard)
1201 .Default(mips::FloatABI::Invalid);
1202 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001203 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001204 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001205 }
1206 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001207 }
1208
1209 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001210 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001211 // Assume "hard", because it's a default value used by gcc.
1212 // When we start to recognize specific target MIPS processors,
1213 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001214 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001215 }
1216
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001217 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1218 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001219}
1220
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001221static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001222 std::vector<const char *> &Features,
1223 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001224 StringRef FeatureName) {
1225 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001226 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001227 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001228 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001229 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001230 }
1231}
1232
Daniel Sanders379d44b2014-07-16 11:52:23 +00001233static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1234 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001235 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001236 StringRef CPUName;
1237 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001238 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001239 ABIName = getGnuCompatibleMipsABIName(ABIName);
1240
Daniel Sandersfeb61302014-08-08 15:47:17 +00001241 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1242 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001243
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001244 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1245 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001246 // FIXME: Note, this is a hack. We need to pass the selected float
1247 // mode to the MipsTargetInfoBase to define appropriate macros there.
1248 // Now it is the only method.
1249 Features.push_back("+soft-float");
1250 }
1251
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001252 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001253 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001254 if (Val == "2008") {
1255 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1256 Features.push_back("+nan2008");
1257 else {
1258 Features.push_back("-nan2008");
1259 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1260 }
1261 } else if (Val == "legacy") {
1262 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1263 Features.push_back("-nan2008");
1264 else {
1265 Features.push_back("+nan2008");
1266 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1267 }
1268 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001269 D.Diag(diag::err_drv_unsupported_option_argument)
1270 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001271 }
1272
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001273 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1274 options::OPT_mdouble_float, "single-float");
1275 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1276 "mips16");
1277 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1278 options::OPT_mno_micromips, "micromips");
1279 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1280 "dsp");
1281 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1282 "dspr2");
1283 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1284 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001285
1286 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1287 // pass -mfpxx
1288 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1289 options::OPT_mfp64)) {
1290 if (A->getOption().matches(options::OPT_mfp32))
1291 Features.push_back(Args.MakeArgString("-fp64"));
1292 else if (A->getOption().matches(options::OPT_mfpxx)) {
1293 Features.push_back(Args.MakeArgString("+fpxx"));
1294 Features.push_back(Args.MakeArgString("+nooddspreg"));
1295 } else
1296 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001297 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001298 Features.push_back(Args.MakeArgString("+fpxx"));
1299 Features.push_back(Args.MakeArgString("+nooddspreg"));
1300 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001301
Daniel Sanders28e5d392014-07-10 10:39:51 +00001302 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1303 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001304}
1305
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001306void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001307 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001308 const Driver &D = getToolChain().getDriver();
1309 StringRef CPUName;
1310 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001311 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001312 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001313
1314 CmdArgs.push_back("-target-abi");
1315 CmdArgs.push_back(ABIName.data());
1316
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001317 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1318 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001319 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001320 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001321 CmdArgs.push_back("-mfloat-abi");
1322 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001323 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001324 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001325 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001326 CmdArgs.push_back("-mfloat-abi");
1327 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001328 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001329
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001330 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1331 if (A->getOption().matches(options::OPT_mxgot)) {
1332 CmdArgs.push_back("-mllvm");
1333 CmdArgs.push_back("-mxgot");
1334 }
1335 }
1336
Simon Atanasyanc580b322013-05-11 06:33:44 +00001337 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1338 options::OPT_mno_ldc1_sdc1)) {
1339 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1340 CmdArgs.push_back("-mllvm");
1341 CmdArgs.push_back("-mno-ldc1-sdc1");
1342 }
1343 }
1344
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001345 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1346 options::OPT_mno_check_zero_division)) {
1347 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1348 CmdArgs.push_back("-mllvm");
1349 CmdArgs.push_back("-mno-check-zero-division");
1350 }
1351 }
1352
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001353 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001354 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001355 CmdArgs.push_back("-mllvm");
1356 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1357 A->claim();
1358 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001359}
1360
Hal Finkel8eb59282012-06-11 22:35:19 +00001361/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1362static std::string getPPCTargetCPU(const ArgList &Args) {
1363 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001364 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001365
1366 if (CPUName == "native") {
1367 std::string CPU = llvm::sys::getHostCPUName();
1368 if (!CPU.empty() && CPU != "generic")
1369 return CPU;
1370 else
1371 return "";
1372 }
1373
1374 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001375 .Case("common", "generic")
1376 .Case("440", "440")
1377 .Case("440fp", "440")
1378 .Case("450", "450")
1379 .Case("601", "601")
1380 .Case("602", "602")
1381 .Case("603", "603")
1382 .Case("603e", "603e")
1383 .Case("603ev", "603ev")
1384 .Case("604", "604")
1385 .Case("604e", "604e")
1386 .Case("620", "620")
1387 .Case("630", "pwr3")
1388 .Case("G3", "g3")
1389 .Case("7400", "7400")
1390 .Case("G4", "g4")
1391 .Case("7450", "7450")
1392 .Case("G4+", "g4+")
1393 .Case("750", "750")
1394 .Case("970", "970")
1395 .Case("G5", "g5")
1396 .Case("a2", "a2")
1397 .Case("a2q", "a2q")
1398 .Case("e500mc", "e500mc")
1399 .Case("e5500", "e5500")
1400 .Case("power3", "pwr3")
1401 .Case("power4", "pwr4")
1402 .Case("power5", "pwr5")
1403 .Case("power5x", "pwr5x")
1404 .Case("power6", "pwr6")
1405 .Case("power6x", "pwr6x")
1406 .Case("power7", "pwr7")
1407 .Case("power8", "pwr8")
1408 .Case("pwr3", "pwr3")
1409 .Case("pwr4", "pwr4")
1410 .Case("pwr5", "pwr5")
1411 .Case("pwr5x", "pwr5x")
1412 .Case("pwr6", "pwr6")
1413 .Case("pwr6x", "pwr6x")
1414 .Case("pwr7", "pwr7")
1415 .Case("pwr8", "pwr8")
1416 .Case("powerpc", "ppc")
1417 .Case("powerpc64", "ppc64")
1418 .Case("powerpc64le", "ppc64le")
1419 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001420 }
1421
1422 return "";
1423}
1424
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001425static void getPPCTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1426 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001427 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00001428 handleTargetFeaturesGroup(Args, Features, options::OPT_m_ppc_Features_Group);
Eric Christopher643bb6a2013-10-16 20:40:08 +00001429
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001430 ppc::FloatABI FloatABI = ppc::getPPCFloatABI(D, Args);
1431 if (FloatABI == ppc::FloatABI::Soft &&
1432 !(Triple.getArch() == llvm::Triple::ppc64 ||
1433 Triple.getArch() == llvm::Triple::ppc64le))
1434 Features.push_back("+soft-float");
1435 else if (FloatABI == ppc::FloatABI::Soft &&
1436 (Triple.getArch() == llvm::Triple::ppc64 ||
1437 Triple.getArch() == llvm::Triple::ppc64le))
Eric Christopherbce27882015-12-28 21:57:05 +00001438 D.Diag(diag::err_drv_invalid_mfloat_abi)
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001439 << "soft float is not supported for ppc64";
1440
Eric Christopher643bb6a2013-10-16 20:40:08 +00001441 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001442 AddTargetFeature(Args, Features, options::OPT_faltivec,
1443 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001444}
1445
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001446ppc::FloatABI ppc::getPPCFloatABI(const Driver &D, const ArgList &Args) {
1447 ppc::FloatABI ABI = ppc::FloatABI::Invalid;
1448 if (Arg *A =
1449 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1450 options::OPT_mfloat_abi_EQ)) {
1451 if (A->getOption().matches(options::OPT_msoft_float))
1452 ABI = ppc::FloatABI::Soft;
1453 else if (A->getOption().matches(options::OPT_mhard_float))
1454 ABI = ppc::FloatABI::Hard;
1455 else {
1456 ABI = llvm::StringSwitch<ppc::FloatABI>(A->getValue())
1457 .Case("soft", ppc::FloatABI::Soft)
1458 .Case("hard", ppc::FloatABI::Hard)
1459 .Default(ppc::FloatABI::Invalid);
1460 if (ABI == ppc::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
1461 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
1462 ABI = ppc::FloatABI::Hard;
1463 }
1464 }
1465 }
1466
1467 // If unspecified, choose the default based on the platform.
1468 if (ABI == ppc::FloatABI::Invalid) {
1469 ABI = ppc::FloatABI::Hard;
1470 }
1471
1472 return ABI;
1473}
1474
Ulrich Weigand8afad612014-07-28 13:17:52 +00001475void Clang::AddPPCTargetArgs(const ArgList &Args,
1476 ArgStringList &CmdArgs) const {
1477 // Select the ABI to use.
1478 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001479 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001480 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001481 case llvm::Triple::ppc64: {
1482 // When targeting a processor that supports QPX, or if QPX is
1483 // specifically enabled, default to using the ABI that supports QPX (so
1484 // long as it is not specifically disabled).
1485 bool HasQPX = false;
1486 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1487 HasQPX = A->getValue() == StringRef("a2q");
1488 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1489 if (HasQPX) {
1490 ABIName = "elfv1-qpx";
1491 break;
1492 }
1493
Ulrich Weigand8afad612014-07-28 13:17:52 +00001494 ABIName = "elfv1";
1495 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001496 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001497 case llvm::Triple::ppc64le:
1498 ABIName = "elfv2";
1499 break;
1500 default:
1501 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001502 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001503
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001504 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1505 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1506 // the option if given as we don't have backend support for any targets
1507 // that don't use the altivec abi.
1508 if (StringRef(A->getValue()) != "altivec")
1509 ABIName = A->getValue();
1510
Petar Jovanovic88a328f2015-12-14 17:51:50 +00001511 ppc::FloatABI FloatABI =
1512 ppc::getPPCFloatABI(getToolChain().getDriver(), Args);
1513
1514 if (FloatABI == ppc::FloatABI::Soft) {
1515 // Floating point operations and argument passing are soft.
1516 CmdArgs.push_back("-msoft-float");
1517 CmdArgs.push_back("-mfloat-abi");
1518 CmdArgs.push_back("soft");
1519 } else {
1520 // Floating point operations and argument passing are hard.
1521 assert(FloatABI == ppc::FloatABI::Hard && "Invalid float abi!");
1522 CmdArgs.push_back("-mfloat-abi");
1523 CmdArgs.push_back("hard");
1524 }
1525
Ulrich Weigand8afad612014-07-28 13:17:52 +00001526 if (ABIName) {
1527 CmdArgs.push_back("-target-abi");
1528 CmdArgs.push_back(ABIName);
1529 }
1530}
1531
1532bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1533 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1534 return A && (A->getValue() == StringRef(Value));
1535}
1536
Tom Stellard6674c702013-04-01 20:56:53 +00001537/// Get the (LLVM) name of the R600 gpu we are targeting.
1538static std::string getR600TargetGPU(const ArgList &Args) {
1539 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001540 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001541 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001542 .Cases("rv630", "rv635", "r600")
1543 .Cases("rv610", "rv620", "rs780", "rs880")
1544 .Case("rv740", "rv770")
1545 .Case("palm", "cedar")
1546 .Cases("sumo", "sumo2", "sumo")
1547 .Case("hemlock", "cypress")
1548 .Case("aruba", "cayman")
1549 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001550 }
1551 return "";
1552}
1553
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001554void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001555 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001556 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001557 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001558
James Y Knightb2406522015-06-15 20:51:24 +00001559 bool SoftFloatABI = false;
1560 if (Arg *A =
1561 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001562 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001563 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001564 }
1565
James Y Knightb2406522015-06-15 20:51:24 +00001566 // Only the hard-float ABI on Sparc is standardized, and it is the
1567 // default. GCC also supports a nonstandard soft-float ABI mode, and
1568 // perhaps LLVM should implement that, too. However, since llvm
1569 // currently does not support Sparc soft-float, at all, display an
1570 // error if it's requested.
1571 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001572 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1573 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001574 }
1575}
1576
Richard Sandiford4652d892013-07-19 16:51:51 +00001577static const char *getSystemZTargetCPU(const ArgList &Args) {
1578 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1579 return A->getValue();
1580 return "z10";
1581}
1582
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001583static void getSystemZTargetFeatures(const ArgList &Args,
1584 std::vector<const char *> &Features) {
1585 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001586 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001587 if (A->getOption().matches(options::OPT_mhtm))
1588 Features.push_back("+transactional-execution");
1589 else
1590 Features.push_back("-transactional-execution");
1591 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001592 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001593 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001594 if (A->getOption().matches(options::OPT_mvx))
1595 Features.push_back("+vector");
1596 else
1597 Features.push_back("-vector");
1598 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001599}
1600
Chandler Carruth953fb082013-01-13 11:46:33 +00001601static const char *getX86TargetCPU(const ArgList &Args,
1602 const llvm::Triple &Triple) {
1603 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001604 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001605 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001606 return "core-avx2";
1607
Chandler Carruth953fb082013-01-13 11:46:33 +00001608 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001609 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001610
1611 // FIXME: Reject attempts to use -march=native unless the target matches
1612 // the host.
1613 //
1614 // FIXME: We should also incorporate the detected target features for use
1615 // with -native.
1616 std::string CPU = llvm::sys::getHostCPUName();
1617 if (!CPU.empty() && CPU != "generic")
1618 return Args.MakeArgString(CPU);
1619 }
1620
Reid Kleckner3123eff2015-06-30 16:32:04 +00001621 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1622 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1623 StringRef Arch = A->getValue();
1624 const char *CPU;
1625 if (Triple.getArch() == llvm::Triple::x86) {
1626 CPU = llvm::StringSwitch<const char *>(Arch)
1627 .Case("IA32", "i386")
1628 .Case("SSE", "pentium3")
1629 .Case("SSE2", "pentium4")
1630 .Case("AVX", "sandybridge")
1631 .Case("AVX2", "haswell")
1632 .Default(nullptr);
1633 } else {
1634 CPU = llvm::StringSwitch<const char *>(Arch)
1635 .Case("AVX", "sandybridge")
1636 .Case("AVX2", "haswell")
1637 .Default(nullptr);
1638 }
1639 if (CPU)
1640 return CPU;
1641 }
1642
Chandler Carruth953fb082013-01-13 11:46:33 +00001643 // Select the default CPU if none was given (or detection failed).
1644
1645 if (Triple.getArch() != llvm::Triple::x86_64 &&
1646 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001647 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001648
1649 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1650
1651 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001652 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001653 if (Triple.getArchName() == "x86_64h")
1654 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001655 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001656 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001657
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001658 // Set up default CPU name for PS4 compilers.
1659 if (Triple.isPS4CPU())
1660 return "btver2";
1661
Alexey Bataev286d1b92014-01-31 04:07:13 +00001662 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001663 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001664 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001665
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001666 // Everything else goes to x86-64 in 64-bit mode.
1667 if (Is64Bit)
1668 return "x86-64";
1669
1670 switch (Triple.getOS()) {
1671 case llvm::Triple::FreeBSD:
1672 case llvm::Triple::NetBSD:
1673 case llvm::Triple::OpenBSD:
1674 return "i486";
1675 case llvm::Triple::Haiku:
1676 return "i586";
1677 case llvm::Triple::Bitrig:
1678 return "i686";
1679 default:
1680 // Fallback to p4.
1681 return "pentium4";
1682 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001683}
1684
Dan Gohmanc2853072015-09-03 22:51:53 +00001685/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1686static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1687 // If we have -mcpu=, use that.
1688 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1689 StringRef CPU = A->getValue();
1690
1691#ifdef __wasm__
1692 // Handle "native" by examining the host. "native" isn't meaningful when
1693 // cross compiling, so only support this when the host is also WebAssembly.
1694 if (CPU == "native")
1695 return llvm::sys::getHostCPUName();
1696#endif
1697
1698 return CPU;
1699 }
1700
1701 return "generic";
1702}
1703
Renato Golin7c542b42015-07-27 23:44:45 +00001704static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1705 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001706 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001707 default:
1708 return "";
1709
Amara Emerson703da2e2013-10-31 09:32:33 +00001710 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001711 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001712 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001713
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001714 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001715 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001716 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001717 case llvm::Triple::thumbeb: {
1718 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001719 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001720 return arm::getARMTargetCPU(MCPU, MArch, T);
1721 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001722 case llvm::Triple::mips:
1723 case llvm::Triple::mipsel:
1724 case llvm::Triple::mips64:
1725 case llvm::Triple::mips64el: {
1726 StringRef CPUName;
1727 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001728 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001729 return CPUName;
1730 }
1731
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001732 case llvm::Triple::nvptx:
1733 case llvm::Triple::nvptx64:
1734 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1735 return A->getValue();
1736 return "";
1737
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001738 case llvm::Triple::ppc:
1739 case llvm::Triple::ppc64:
1740 case llvm::Triple::ppc64le: {
1741 std::string TargetCPUName = getPPCTargetCPU(Args);
1742 // LLVM may default to generating code for the native CPU,
1743 // but, like gcc, we default to a more generic option for
1744 // each architecture. (except on Darwin)
1745 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1746 if (T.getArch() == llvm::Triple::ppc64)
1747 TargetCPUName = "ppc64";
1748 else if (T.getArch() == llvm::Triple::ppc64le)
1749 TargetCPUName = "ppc64le";
1750 else
1751 TargetCPUName = "ppc";
1752 }
1753 return TargetCPUName;
1754 }
1755
1756 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001757 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001758 case llvm::Triple::sparcv9:
1759 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001760 return A->getValue();
1761 return "";
1762
1763 case llvm::Triple::x86:
1764 case llvm::Triple::x86_64:
1765 return getX86TargetCPU(Args, T);
1766
1767 case llvm::Triple::hexagon:
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00001768 return "hexagon" +
1769 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001770
1771 case llvm::Triple::systemz:
1772 return getSystemZTargetCPU(Args);
1773
1774 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001775 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001776 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001777
1778 case llvm::Triple::wasm32:
1779 case llvm::Triple::wasm64:
1780 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001781 }
1782}
1783
Alp Tokerce365ca2013-12-02 12:43:03 +00001784static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001785 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001786 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1787 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1788 // forward.
1789 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001790 std::string Plugin =
1791 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001792 CmdArgs.push_back(Args.MakeArgString(Plugin));
1793
1794 // Try to pass driver level flags relevant to LTO code generation down to
1795 // the plugin.
1796
1797 // Handle flags for selecting CPU variants.
1798 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1799 if (!CPU.empty())
1800 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001801
James Molloyf97fdae2015-12-21 10:44:36 +00001802 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
1803 StringRef OOpt;
1804 if (A->getOption().matches(options::OPT_O4) ||
1805 A->getOption().matches(options::OPT_Ofast))
1806 OOpt = "3";
1807 else if (A->getOption().matches(options::OPT_O))
1808 OOpt = A->getValue();
1809 else if (A->getOption().matches(options::OPT_O0))
1810 OOpt = "0";
1811 if (!OOpt.empty())
1812 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=O") + OOpt));
1813 }
1814
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001815 if (IsThinLTO)
1816 CmdArgs.push_back("-plugin-opt=thinlto");
Paul Robinson4391d092016-01-25 19:46:40 +00001817
1818 // If an explicit debugger tuning argument appeared, pass it along.
1819 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
1820 options::OPT_ggdbN_Group)) {
1821 if (A->getOption().matches(options::OPT_glldb))
1822 CmdArgs.push_back("-plugin-opt=-debugger-tune=lldb");
1823 else if (A->getOption().matches(options::OPT_gsce))
1824 CmdArgs.push_back("-plugin-opt=-debugger-tune=sce");
1825 else
1826 CmdArgs.push_back("-plugin-opt=-debugger-tune=gdb");
1827 }
Alp Tokerce365ca2013-12-02 12:43:03 +00001828}
1829
Sanjay Patel2987c292015-06-11 14:53:41 +00001830/// This is a helper function for validating the optional refinement step
1831/// parameter in reciprocal argument strings. Return false if there is an error
1832/// parsing the refinement step. Otherwise, return true and set the Position
1833/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001834static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001835 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001836 const char RefinementStepToken = ':';
1837 Position = In.find(RefinementStepToken);
1838 if (Position != StringRef::npos) {
1839 StringRef Option = A.getOption().getName();
1840 StringRef RefStep = In.substr(Position + 1);
1841 // Allow exactly one numeric character for the additional refinement
1842 // step parameter. This is reasonable for all currently-supported
1843 // operations and architectures because we would expect that a larger value
1844 // of refinement steps would cause the estimate "optimization" to
1845 // under-perform the native operation. Also, if the estimate does not
1846 // converge quickly, it probably will not ever converge, so further
1847 // refinement steps will not produce a better answer.
1848 if (RefStep.size() != 1) {
1849 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1850 return false;
1851 }
1852 char RefStepChar = RefStep[0];
1853 if (RefStepChar < '0' || RefStepChar > '9') {
1854 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1855 return false;
1856 }
1857 }
1858 return true;
1859}
1860
1861/// The -mrecip flag requires processing of many optional parameters.
1862static void ParseMRecip(const Driver &D, const ArgList &Args,
1863 ArgStringList &OutStrings) {
1864 StringRef DisabledPrefixIn = "!";
1865 StringRef DisabledPrefixOut = "!";
1866 StringRef EnabledPrefixOut = "";
1867 StringRef Out = "-mrecip=";
1868
1869 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1870 if (!A)
1871 return;
1872
1873 unsigned NumOptions = A->getNumValues();
1874 if (NumOptions == 0) {
1875 // No option is the same as "all".
1876 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1877 return;
1878 }
1879
1880 // Pass through "all", "none", or "default" with an optional refinement step.
1881 if (NumOptions == 1) {
1882 StringRef Val = A->getValue(0);
1883 size_t RefStepLoc;
1884 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1885 return;
1886 StringRef ValBase = Val.slice(0, RefStepLoc);
1887 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1888 OutStrings.push_back(Args.MakeArgString(Out + Val));
1889 return;
1890 }
1891 }
1892
1893 // Each reciprocal type may be enabled or disabled individually.
1894 // Check each input value for validity, concatenate them all back together,
1895 // and pass through.
1896
1897 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001898 OptionStrings.insert(std::make_pair("divd", false));
1899 OptionStrings.insert(std::make_pair("divf", false));
1900 OptionStrings.insert(std::make_pair("vec-divd", false));
1901 OptionStrings.insert(std::make_pair("vec-divf", false));
1902 OptionStrings.insert(std::make_pair("sqrtd", false));
1903 OptionStrings.insert(std::make_pair("sqrtf", false));
1904 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1905 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001906
1907 for (unsigned i = 0; i != NumOptions; ++i) {
1908 StringRef Val = A->getValue(i);
1909
1910 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1911 // Ignore the disablement token for string matching.
1912 if (IsDisabled)
1913 Val = Val.substr(1);
1914
1915 size_t RefStep;
1916 if (!getRefinementStep(Val, D, *A, RefStep))
1917 return;
1918
1919 StringRef ValBase = Val.slice(0, RefStep);
1920 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1921 if (OptionIter == OptionStrings.end()) {
1922 // Try again specifying float suffix.
1923 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1924 if (OptionIter == OptionStrings.end()) {
1925 // The input name did not match any known option string.
1926 D.Diag(diag::err_drv_unknown_argument) << Val;
1927 return;
1928 }
1929 // The option was specified without a float or double suffix.
1930 // Make sure that the double entry was not already specified.
1931 // The float entry will be checked below.
1932 if (OptionStrings[ValBase.str() + 'd']) {
1933 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1934 return;
1935 }
1936 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001937
Sanjay Patel2987c292015-06-11 14:53:41 +00001938 if (OptionIter->second == true) {
1939 // Duplicate option specified.
1940 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1941 return;
1942 }
1943
1944 // Mark the matched option as found. Do not allow duplicate specifiers.
1945 OptionIter->second = true;
1946
1947 // If the precision was not specified, also mark the double entry as found.
1948 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1949 OptionStrings[ValBase.str() + 'd'] = true;
1950
1951 // Build the output string.
1952 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1953 Out = Args.MakeArgString(Out + Prefix + Val);
1954 if (i != NumOptions - 1)
1955 Out = Args.MakeArgString(Out + ",");
1956 }
1957
1958 OutStrings.push_back(Args.MakeArgString(Out));
1959}
1960
Eric Christopherc54920a2015-03-23 19:26:05 +00001961static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001962 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001963 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001964 // If -march=native, autodetect the feature list.
1965 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1966 if (StringRef(A->getValue()) == "native") {
1967 llvm::StringMap<bool> HostFeatures;
1968 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1969 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001970 Features.push_back(
1971 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001972 }
1973 }
1974
Jim Grosbach82eee262013-11-16 00:53:35 +00001975 if (Triple.getArchName() == "x86_64h") {
1976 // x86_64h implies quite a few of the more modern subtarget features
1977 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1978 Features.push_back("-rdrnd");
1979 Features.push_back("-aes");
1980 Features.push_back("-pclmul");
1981 Features.push_back("-rtm");
1982 Features.push_back("-hle");
1983 Features.push_back("-fsgsbase");
1984 }
1985
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001986 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001987 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001988 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001989 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001990 Features.push_back("+sse4.2");
1991 Features.push_back("+popcnt");
1992 } else
1993 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001994 }
1995
Eric Christopherc54920a2015-03-23 19:26:05 +00001996 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001997 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1998 StringRef Arch = A->getValue();
1999 bool ArchUsed = false;
2000 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002001 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002002 if (Arch == "AVX" || Arch == "AVX2") {
2003 ArchUsed = true;
2004 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2005 }
2006 }
2007 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00002008 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002009 if (Arch == "IA32") {
2010 ArchUsed = true;
2011 } else if (Arch == "SSE" || Arch == "SSE2") {
2012 ArchUsed = true;
2013 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
2014 }
2015 }
2016 if (!ArchUsed)
2017 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
2018 }
2019
Jim Grosbach82eee262013-11-16 00:53:35 +00002020 // Now add any that the user explicitly requested on the command line,
2021 // which may override the defaults.
Eric Christopher49062a52015-12-22 03:12:34 +00002022 handleTargetFeaturesGroup(Args, Features, options::OPT_m_x86_Features_Group);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002023}
2024
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002025void Clang::AddX86TargetArgs(const ArgList &Args,
2026 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002027 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002028 Args.hasArg(options::OPT_mkernel) ||
2029 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002030 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00002031
Bob Wilson2616e2e2013-02-10 16:01:41 +00002032 // Default to avoid implicit floating-point for kernel/kext code, but allow
2033 // that to be overridden with -mno-soft-float.
2034 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
2035 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002036 if (Arg *A = Args.getLastArg(
2037 options::OPT_msoft_float, options::OPT_mno_soft_float,
2038 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00002039 const Option &O = A->getOption();
2040 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
2041 O.matches(options::OPT_msoft_float));
2042 }
2043 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00002044 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00002045
2046 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
2047 StringRef Value = A->getValue();
2048 if (Value == "intel" || Value == "att") {
2049 CmdArgs.push_back("-mllvm");
2050 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
2051 } else {
2052 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
2053 << A->getOption().getName() << Value;
2054 }
2055 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002056}
2057
Tony Linthicum76329bf2011-12-12 21:14:55 +00002058void Clang::AddHexagonTargetArgs(const ArgList &Args,
2059 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00002060 CmdArgs.push_back("-mqdsp6-compat");
2061 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002062
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002063 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
2064 std::string N = llvm::utostr(G.getValue());
2065 std::string Opt = std::string("-hexagon-small-data-threshold=") + N;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002066 CmdArgs.push_back("-mllvm");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002067 CmdArgs.push_back(Args.MakeArgString(Opt));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002068 }
2069
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002070 if (!Args.hasArg(options::OPT_fno_short_enums))
2071 CmdArgs.push_back("-fshort-enums");
2072 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002073 CmdArgs.push_back("-mllvm");
2074 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002075 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002076 CmdArgs.push_back("-mllvm");
2077 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002078}
2079
Dan Gohmane3d71e12016-01-07 01:00:21 +00002080void Clang::AddWebAssemblyTargetArgs(const ArgList &Args,
2081 ArgStringList &CmdArgs) const {
2082 // Default to "hidden" visibility.
2083 if (!Args.hasArg(options::OPT_fvisibility_EQ,
2084 options::OPT_fvisibility_ms_compat)) {
2085 CmdArgs.push_back("-fvisibility");
2086 CmdArgs.push_back("hidden");
2087 }
2088}
2089
Kevin Qin110db6f2014-07-18 07:03:22 +00002090// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002091static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002092 std::vector<const char *> &Features) {
2093 SmallVector<StringRef, 8> Split;
2094 text.split(Split, StringRef("+"), -1, false);
2095
Benjamin Kramer72e64312015-09-24 14:48:49 +00002096 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002097 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002098 .Case("fp", "+fp-armv8")
2099 .Case("simd", "+neon")
2100 .Case("crc", "+crc")
2101 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002102 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002103 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002104 .Case("nofp", "-fp-armv8")
2105 .Case("nosimd", "-neon")
2106 .Case("nocrc", "-crc")
2107 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002108 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002109 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002110 .Default(nullptr);
2111 if (result)
2112 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002113 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002114 D.Diag(diag::err_drv_no_neon_modifier);
2115 else
2116 return false;
2117 }
2118 return true;
2119}
2120
2121// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2122// decode CPU and feature.
2123static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2124 std::vector<const char *> &Features) {
2125 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2126 CPU = Split.first;
Tim Northover2279b5f2016-02-24 17:57:48 +00002127 if (CPU == "cortex-a53" || CPU == "cortex-a57" ||
Chad Rosierb0ce1952016-02-11 18:09:31 +00002128 CPU == "cortex-a72" || CPU == "cortex-a35" || CPU == "exynos-m1" ||
2129 CPU == "kryo") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002130 Features.push_back("+neon");
2131 Features.push_back("+crc");
2132 Features.push_back("+crypto");
Tim Northover2279b5f2016-02-24 17:57:48 +00002133 } else if (CPU == "cyclone") {
2134 Features.push_back("+neon");
2135 Features.push_back("+crypto");
Kevin Qin110db6f2014-07-18 07:03:22 +00002136 } else if (CPU == "generic") {
2137 Features.push_back("+neon");
2138 } else {
2139 return false;
2140 }
2141
2142 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2143 return false;
2144
2145 return true;
2146}
2147
2148static bool
2149getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2150 const ArgList &Args,
2151 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002152 std::string MarchLowerCase = March.lower();
2153 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002154
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002155 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002156 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002157 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002158 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002159 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2160 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002161 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002162 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002163 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002164
2165 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2166 return false;
2167
2168 return true;
2169}
2170
2171static bool
2172getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2173 const ArgList &Args,
2174 std::vector<const char *> &Features) {
2175 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002176 std::string McpuLowerCase = Mcpu.lower();
2177 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002178 return false;
2179
2180 return true;
2181}
2182
2183static bool
2184getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2185 const ArgList &Args,
2186 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002187 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002188 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002189 if (MtuneLowerCase == "native")
2190 MtuneLowerCase = llvm::sys::getHostCPUName();
2191 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002192 Features.push_back("+zcm");
2193 Features.push_back("+zcz");
2194 }
2195 return true;
2196}
2197
2198static bool
2199getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2200 const ArgList &Args,
2201 std::vector<const char *> &Features) {
2202 StringRef CPU;
2203 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002204 std::string McpuLowerCase = Mcpu.lower();
2205 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002206 return false;
2207
2208 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2209}
2210
Justin Bognerf9052562015-11-13 23:07:31 +00002211static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002212 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002213 Arg *A;
2214 bool success = true;
2215 // Enable NEON by default.
2216 Features.push_back("+neon");
2217 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2218 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2219 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2220 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002221 else if (Args.hasArg(options::OPT_arch))
2222 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2223 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002224
2225 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2226 success =
2227 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2228 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2229 success =
2230 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002231 else if (Args.hasArg(options::OPT_arch))
2232 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2233 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002234
2235 if (!success)
2236 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002237
2238 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2239 Features.push_back("-fp-armv8");
2240 Features.push_back("-crypto");
2241 Features.push_back("-neon");
2242 }
Bradley Smith418c5932014-05-02 15:17:51 +00002243
2244 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002245 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002246 if (A->getOption().matches(options::OPT_mcrc))
2247 Features.push_back("+crc");
2248 else
2249 Features.push_back("-crc");
2250 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002251
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002252 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2253 options::OPT_munaligned_access))
2254 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2255 Features.push_back("+strict-align");
2256
Justin Bognerf9052562015-11-13 23:07:31 +00002257 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002258 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002259}
2260
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002261static void getHexagonTargetFeatures(const ArgList &Args,
2262 std::vector<const char *> &Features) {
2263 bool HasHVX = false, HasHVXD = false;
2264
Eric Christopher49062a52015-12-22 03:12:34 +00002265 // FIXME: This should be able to use handleTargetFeaturesGroup except it is
2266 // doing dependent option handling here rather than in initFeatureMap or a
2267 // similar handler.
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002268 for (auto &A : Args) {
2269 auto &Opt = A->getOption();
2270 if (Opt.matches(options::OPT_mhexagon_hvx))
2271 HasHVX = true;
2272 else if (Opt.matches(options::OPT_mno_hexagon_hvx))
2273 HasHVXD = HasHVX = false;
2274 else if (Opt.matches(options::OPT_mhexagon_hvx_double))
2275 HasHVXD = HasHVX = true;
2276 else if (Opt.matches(options::OPT_mno_hexagon_hvx_double))
2277 HasHVXD = false;
2278 else
2279 continue;
2280 A->claim();
2281 }
2282
2283 Features.push_back(HasHVX ? "+hvx" : "-hvx");
2284 Features.push_back(HasHVXD ? "+hvx-double" : "-hvx-double");
2285}
2286
Dan Gohmanc2853072015-09-03 22:51:53 +00002287static void getWebAssemblyTargetFeatures(const ArgList &Args,
2288 std::vector<const char *> &Features) {
Eric Christopher49062a52015-12-22 03:12:34 +00002289 handleTargetFeaturesGroup(Args, Features, options::OPT_m_wasm_Features_Group);
Dan Gohmanc2853072015-09-03 22:51:53 +00002290}
2291
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002292static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002293 const ArgList &Args, ArgStringList &CmdArgs,
2294 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002295 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002296 std::vector<const char *> Features;
2297 switch (Triple.getArch()) {
2298 default:
2299 break;
2300 case llvm::Triple::mips:
2301 case llvm::Triple::mipsel:
2302 case llvm::Triple::mips64:
2303 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002304 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002305 break;
2306
2307 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002308 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002309 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002310 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002311 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002312 break;
2313
2314 case llvm::Triple::ppc:
2315 case llvm::Triple::ppc64:
2316 case llvm::Triple::ppc64le:
Petar Jovanovic88a328f2015-12-14 17:51:50 +00002317 getPPCTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002318 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002319 case llvm::Triple::systemz:
2320 getSystemZTargetFeatures(Args, Features);
2321 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002322 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002323 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002324 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002325 break;
2326 case llvm::Triple::x86:
2327 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002328 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002329 break;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00002330 case llvm::Triple::hexagon:
2331 getHexagonTargetFeatures(Args, Features);
2332 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002333 case llvm::Triple::wasm32:
2334 case llvm::Triple::wasm64:
2335 getWebAssemblyTargetFeatures(Args, Features);
2336 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002337 }
Rafael Espindola43964802013-08-21 17:34:32 +00002338
2339 // Find the last of each feature.
2340 llvm::StringMap<unsigned> LastOpt;
2341 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2342 const char *Name = Features[I];
2343 assert(Name[0] == '-' || Name[0] == '+');
2344 LastOpt[Name + 1] = I;
2345 }
2346
2347 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2348 // If this feature was overridden, ignore it.
2349 const char *Name = Features[I];
2350 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2351 assert(LastI != LastOpt.end());
2352 unsigned Last = LastI->second;
2353 if (Last != I)
2354 continue;
2355
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002356 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002357 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002358 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002359}
2360
David Majnemerae394812014-12-09 00:12:30 +00002361static bool
2362shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2363 const llvm::Triple &Triple) {
2364 // We use the zero-cost exception tables for Objective-C if the non-fragile
2365 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2366 // later.
2367 if (runtime.isNonFragile())
2368 return true;
2369
2370 if (!Triple.isMacOSX())
2371 return false;
2372
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002373 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002374 (Triple.getArch() == llvm::Triple::x86_64 ||
2375 Triple.getArch() == llvm::Triple::arm));
2376}
2377
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002378/// Adds exception related arguments to the driver command arguments. There's a
2379/// master flag, -fexceptions and also language specific flags to enable/disable
2380/// C++ and Objective-C exceptions. This makes it possible to for example
2381/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002382static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002383 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002384 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002385 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002386 const Driver &D = TC.getDriver();
2387 const llvm::Triple &Triple = TC.getTriple();
2388
Chad Rosier4fab82c2012-03-26 22:04:46 +00002389 if (KernelOrKext) {
2390 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2391 // arguments now to avoid warnings about unused arguments.
2392 Args.ClaimAllArgs(options::OPT_fexceptions);
2393 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2394 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2395 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2396 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2397 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002398 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002399 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002400
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002401 // See if the user explicitly enabled exceptions.
2402 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2403 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002404
David Majnemerae394812014-12-09 00:12:30 +00002405 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2406 // is not necessarily sensible, but follows GCC.
2407 if (types::isObjC(InputType) &&
2408 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002409 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002410 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002411
David Majnemerae394812014-12-09 00:12:30 +00002412 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002413 }
2414
2415 if (types::isCXX(InputType)) {
David Majnemer59729392016-02-18 08:15:05 +00002416 // Disable C++ EH by default on XCore and PS4.
2417 bool CXXExceptionsEnabled =
2418 Triple.getArch() != llvm::Triple::xcore && !Triple.isPS4CPU();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002419 Arg *ExceptionArg = Args.getLastArg(
2420 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2421 options::OPT_fexceptions, options::OPT_fno_exceptions);
2422 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002423 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002424 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2425 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002426
2427 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002428 if (Triple.isPS4CPU()) {
2429 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2430 assert(ExceptionArg &&
2431 "On the PS4 exceptions should only be enabled if passing "
2432 "an argument");
2433 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2434 const Arg *RTTIArg = TC.getRTTIArg();
2435 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2436 D.Diag(diag::err_drv_argument_not_allowed_with)
2437 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2438 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2439 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2440 } else
2441 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2442
Anders Carlssone96ab552011-02-28 02:27:16 +00002443 CmdArgs.push_back("-fcxx-exceptions");
2444
David Majnemer8de68642014-12-05 08:11:58 +00002445 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002446 }
2447 }
2448
David Majnemer8de68642014-12-05 08:11:58 +00002449 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002450 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002451}
2452
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002453static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002454 bool Default = true;
2455 if (TC.getTriple().isOSDarwin()) {
2456 // The native darwin assembler doesn't support the linker_option directives,
2457 // so we disable them if we think the .s file will be passed to it.
2458 Default = TC.useIntegratedAs();
2459 }
2460 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2461 Default);
2462}
2463
Ted Kremenek62093662013-03-12 17:02:12 +00002464static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2465 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002466 bool UseDwarfDirectory =
2467 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2468 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002469 return !UseDwarfDirectory;
2470}
2471
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002472/// \brief Check whether the given input tree contains any compilation actions.
2473static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002474 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002475 return true;
2476
Nico Weber5a459f82016-02-23 19:30:43 +00002477 for (const auto &AI : A->inputs())
2478 if (ContainsCompileAction(AI))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002479 return true;
2480
2481 return false;
2482}
2483
2484/// \brief Check if -relax-all should be passed to the internal assembler.
2485/// This is done by default when compiling non-assembler source with -O0.
2486static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2487 bool RelaxDefault = true;
2488
2489 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2490 RelaxDefault = A->getOption().matches(options::OPT_O0);
2491
2492 if (RelaxDefault) {
2493 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002494 for (const auto &Act : C.getActions()) {
2495 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002496 RelaxDefault = true;
2497 break;
2498 }
2499 }
2500 }
2501
2502 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002503 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002504}
2505
Paul Robinson0334a042015-12-19 19:41:48 +00002506// Convert an arg of the form "-gN" or "-ggdbN" or one of their aliases
2507// to the corresponding DebugInfoKind.
Benjamin Kramer8c305922016-02-02 11:06:51 +00002508static codegenoptions::DebugInfoKind DebugLevelToInfoKind(const Arg &A) {
Paul Robinson0334a042015-12-19 19:41:48 +00002509 assert(A.getOption().matches(options::OPT_gN_Group) &&
2510 "Not a -g option that specifies a debug-info level");
2511 if (A.getOption().matches(options::OPT_g0) ||
2512 A.getOption().matches(options::OPT_ggdb0))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002513 return codegenoptions::NoDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002514 if (A.getOption().matches(options::OPT_gline_tables_only) ||
2515 A.getOption().matches(options::OPT_ggdb1))
Benjamin Kramer8c305922016-02-02 11:06:51 +00002516 return codegenoptions::DebugLineTablesOnly;
2517 return codegenoptions::LimitedDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00002518}
2519
Douglas Katzman3459ce22015-10-08 04:24:12 +00002520// Extract the integer N from a string spelled "-dwarf-N", returning 0
2521// on mismatch. The StringRef input (rather than an Arg) allows
2522// for use by the "-Xassembler" option parser.
2523static unsigned DwarfVersionNum(StringRef ArgValue) {
2524 return llvm::StringSwitch<unsigned>(ArgValue)
2525 .Case("-gdwarf-2", 2)
2526 .Case("-gdwarf-3", 3)
2527 .Case("-gdwarf-4", 4)
Eric Christopher3cb592d2015-12-28 19:58:44 +00002528 .Case("-gdwarf-5", 5)
Douglas Katzman3459ce22015-10-08 04:24:12 +00002529 .Default(0);
2530}
2531
2532static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00002533 codegenoptions::DebugInfoKind DebugInfoKind,
Paul Robinson0334a042015-12-19 19:41:48 +00002534 unsigned DwarfVersion,
2535 llvm::DebuggerKind DebuggerTuning) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002536 switch (DebugInfoKind) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002537 case codegenoptions::DebugLineTablesOnly:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002538 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2539 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002540 case codegenoptions::LimitedDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002541 CmdArgs.push_back("-debug-info-kind=limited");
2542 break;
Benjamin Kramer8c305922016-02-02 11:06:51 +00002543 case codegenoptions::FullDebugInfo:
Douglas Katzman3459ce22015-10-08 04:24:12 +00002544 CmdArgs.push_back("-debug-info-kind=standalone");
2545 break;
2546 default:
2547 break;
2548 }
2549 if (DwarfVersion > 0)
2550 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002551 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Paul Robinson0334a042015-12-19 19:41:48 +00002552 switch (DebuggerTuning) {
2553 case llvm::DebuggerKind::GDB:
2554 CmdArgs.push_back("-debugger-tuning=gdb");
2555 break;
2556 case llvm::DebuggerKind::LLDB:
2557 CmdArgs.push_back("-debugger-tuning=lldb");
2558 break;
2559 case llvm::DebuggerKind::SCE:
2560 CmdArgs.push_back("-debugger-tuning=sce");
2561 break;
2562 default:
2563 break;
2564 }
Douglas Katzman3459ce22015-10-08 04:24:12 +00002565}
2566
David Blaikie9260ed62013-07-25 21:19:01 +00002567static void CollectArgsForIntegratedAssembler(Compilation &C,
2568 const ArgList &Args,
2569 ArgStringList &CmdArgs,
2570 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002571 if (UseRelaxAll(C, Args))
2572 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002573
David Majnemer2b9349d2015-12-21 22:09:34 +00002574 // Only default to -mincremental-linker-compatible if we think we are
2575 // targeting the MSVC linker.
2576 bool DefaultIncrementalLinkerCompatible =
2577 C.getDefaultToolChain().getTriple().isWindowsMSVCEnvironment();
2578 if (Args.hasFlag(options::OPT_mincremental_linker_compatible,
2579 options::OPT_mno_incremental_linker_compatible,
2580 DefaultIncrementalLinkerCompatible))
2581 CmdArgs.push_back("-mincremental-linker-compatible");
2582
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002583 // When passing -I arguments to the assembler we sometimes need to
2584 // unconditionally take the next argument. For example, when parsing
2585 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2586 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2587 // arg after parsing the '-I' arg.
2588 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002589
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002590 // When using an integrated assembler, translate -Wa, and -Xassembler
2591 // options.
2592 bool CompressDebugSections = false;
Scott Egertonb67d4692016-01-14 13:01:48 +00002593 const char *MipsTargetFeature = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002594 for (const Arg *A :
2595 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2596 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002597
Benjamin Kramer72e64312015-09-24 14:48:49 +00002598 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002599 if (TakeNextArg) {
2600 CmdArgs.push_back(Value.data());
2601 TakeNextArg = false;
2602 continue;
2603 }
David Blaikie9260ed62013-07-25 21:19:01 +00002604
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002605 switch (C.getDefaultToolChain().getArch()) {
2606 default:
2607 break;
2608 case llvm::Triple::mips:
2609 case llvm::Triple::mipsel:
2610 case llvm::Triple::mips64:
2611 case llvm::Triple::mips64el:
2612 if (Value == "--trap") {
2613 CmdArgs.push_back("-target-feature");
2614 CmdArgs.push_back("+use-tcc-in-div");
2615 continue;
2616 }
2617 if (Value == "--break") {
2618 CmdArgs.push_back("-target-feature");
2619 CmdArgs.push_back("-use-tcc-in-div");
2620 continue;
2621 }
2622 if (Value.startswith("-msoft-float")) {
2623 CmdArgs.push_back("-target-feature");
2624 CmdArgs.push_back("+soft-float");
2625 continue;
2626 }
2627 if (Value.startswith("-mhard-float")) {
2628 CmdArgs.push_back("-target-feature");
2629 CmdArgs.push_back("-soft-float");
2630 continue;
2631 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002632
2633 MipsTargetFeature = llvm::StringSwitch<const char *>(Value)
2634 .Case("-mips1", "+mips1")
2635 .Case("-mips2", "+mips2")
2636 .Case("-mips3", "+mips3")
2637 .Case("-mips4", "+mips4")
2638 .Case("-mips5", "+mips5")
2639 .Case("-mips32", "+mips32")
2640 .Case("-mips32r2", "+mips32r2")
2641 .Case("-mips32r3", "+mips32r3")
2642 .Case("-mips32r5", "+mips32r5")
2643 .Case("-mips32r6", "+mips32r6")
2644 .Case("-mips64", "+mips64")
2645 .Case("-mips64r2", "+mips64r2")
2646 .Case("-mips64r3", "+mips64r3")
2647 .Case("-mips64r5", "+mips64r5")
2648 .Case("-mips64r6", "+mips64r6")
2649 .Default(nullptr);
2650 if (MipsTargetFeature)
2651 continue;
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002652 }
2653
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002654 if (Value == "-force_cpusubtype_ALL") {
2655 // Do nothing, this is the default and we don't support anything else.
2656 } else if (Value == "-L") {
2657 CmdArgs.push_back("-msave-temp-labels");
2658 } else if (Value == "--fatal-warnings") {
2659 CmdArgs.push_back("-massembler-fatal-warnings");
2660 } else if (Value == "--noexecstack") {
2661 CmdArgs.push_back("-mnoexecstack");
2662 } else if (Value == "-compress-debug-sections" ||
2663 Value == "--compress-debug-sections") {
2664 CompressDebugSections = true;
2665 } else if (Value == "-nocompress-debug-sections" ||
2666 Value == "--nocompress-debug-sections") {
2667 CompressDebugSections = false;
2668 } else if (Value.startswith("-I")) {
2669 CmdArgs.push_back(Value.data());
2670 // We need to consume the next argument if the current arg is a plain
2671 // -I. The next arg will be the include directory.
2672 if (Value == "-I")
2673 TakeNextArg = true;
2674 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002675 // "-gdwarf-N" options are not cc1as options.
2676 unsigned DwarfVersion = DwarfVersionNum(Value);
2677 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2678 CmdArgs.push_back(Value.data());
2679 } else {
Benjamin Kramer8c305922016-02-02 11:06:51 +00002680 RenderDebugEnablingArgs(Args, CmdArgs,
2681 codegenoptions::LimitedDebugInfo,
2682 DwarfVersion, llvm::DebuggerKind::Default);
Douglas Katzman3459ce22015-10-08 04:24:12 +00002683 }
Renato Golin7c542b42015-07-27 23:44:45 +00002684 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2685 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2686 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002687 } else {
2688 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002689 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002690 }
2691 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002692 }
2693 if (CompressDebugSections) {
2694 if (llvm::zlib::isAvailable())
2695 CmdArgs.push_back("-compress-debug-sections");
2696 else
2697 D.Diag(diag::warn_debug_compression_unavailable);
2698 }
Scott Egertonb67d4692016-01-14 13:01:48 +00002699 if (MipsTargetFeature != nullptr) {
2700 CmdArgs.push_back("-target-feature");
2701 CmdArgs.push_back(MipsTargetFeature);
2702 }
David Blaikie9260ed62013-07-25 21:19:01 +00002703}
2704
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002705// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002706// FIXME: Make sure we can also emit shared objects if they're requested
2707// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002708static void addClangRT(const ToolChain &TC, const ArgList &Args,
2709 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002710 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002711}
2712
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002713namespace {
2714enum OpenMPRuntimeKind {
2715 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2716 /// without knowing what runtime to target.
2717 OMPRT_Unknown,
2718
2719 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2720 /// the default for Clang.
2721 OMPRT_OMP,
2722
2723 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2724 /// this runtime but can swallow the pragmas, and find and link against the
2725 /// runtime library itself.
2726 OMPRT_GOMP,
2727
Chandler Carruthc6625c62015-05-28 21:10:31 +00002728 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002729 /// OpenMP runtime. We support this mode for users with existing dependencies
2730 /// on this runtime library name.
2731 OMPRT_IOMP5
2732};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002733}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002734
2735/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002736static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2737 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002738 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2739
2740 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2741 if (A)
2742 RuntimeName = A->getValue();
2743
2744 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002745 .Case("libomp", OMPRT_OMP)
2746 .Case("libgomp", OMPRT_GOMP)
2747 .Case("libiomp5", OMPRT_IOMP5)
2748 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002749
2750 if (RT == OMPRT_Unknown) {
2751 if (A)
2752 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002753 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002754 else
2755 // FIXME: We could use a nicer diagnostic here.
2756 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2757 }
2758
2759 return RT;
2760}
2761
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002762static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2763 const ArgList &Args) {
2764 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2765 options::OPT_fno_openmp, false))
2766 return;
2767
2768 switch (getOpenMPRuntime(TC, Args)) {
2769 case OMPRT_OMP:
2770 CmdArgs.push_back("-lomp");
2771 break;
2772 case OMPRT_GOMP:
2773 CmdArgs.push_back("-lgomp");
2774 break;
2775 case OMPRT_IOMP5:
2776 CmdArgs.push_back("-liomp5");
2777 break;
2778 case OMPRT_Unknown:
2779 // Already diagnosed.
2780 break;
2781 }
2782}
2783
Alexey Samsonov52550342014-09-15 19:58:40 +00002784static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2785 ArgStringList &CmdArgs, StringRef Sanitizer,
Peter Collingbournedc134532016-01-16 00:31:22 +00002786 bool IsShared, bool IsWhole) {
2787 // Wrap any static runtimes that must be forced into executable in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002788 // whole-archive.
Peter Collingbournedc134532016-01-16 00:31:22 +00002789 if (IsWhole) CmdArgs.push_back("-whole-archive");
Xinliang David Li69306c02015-10-22 06:15:31 +00002790 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
Peter Collingbournedc134532016-01-16 00:31:22 +00002791 if (IsWhole) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002792}
2793
Alexey Samsonov52550342014-09-15 19:58:40 +00002794// Tries to use a file with the list of dynamic symbols that need to be exported
2795// from the runtime library. Returns true if the file was found.
2796static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2797 ArgStringList &CmdArgs,
2798 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002799 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002800 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2801 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002802 return true;
2803 }
2804 return false;
2805}
2806
2807static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2808 ArgStringList &CmdArgs) {
2809 // Force linking against the system libraries sanitizers depends on
2810 // (see PR15823 why this is necessary).
2811 CmdArgs.push_back("--no-as-needed");
2812 CmdArgs.push_back("-lpthread");
2813 CmdArgs.push_back("-lrt");
2814 CmdArgs.push_back("-lm");
2815 // There's no libdl on FreeBSD.
2816 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2817 CmdArgs.push_back("-ldl");
2818}
2819
2820static void
2821collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2822 SmallVectorImpl<StringRef> &SharedRuntimes,
2823 SmallVectorImpl<StringRef> &StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002824 SmallVectorImpl<StringRef> &NonWholeStaticRuntimes,
2825 SmallVectorImpl<StringRef> &HelperStaticRuntimes,
2826 SmallVectorImpl<StringRef> &RequiredSymbols) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002827 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2828 // Collect shared runtimes.
2829 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2830 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002831 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002832 // The stats_client library is also statically linked into DSOs.
2833 if (SanArgs.needsStatsRt())
2834 StaticRuntimes.push_back("stats_client");
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002835
Alexey Samsonov52550342014-09-15 19:58:40 +00002836 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002837 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002838 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002839 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002840 }
2841 if (SanArgs.needsAsanRt()) {
2842 if (SanArgs.needsSharedAsanRt()) {
2843 HelperStaticRuntimes.push_back("asan-preinit");
2844 } else {
2845 StaticRuntimes.push_back("asan");
2846 if (SanArgs.linkCXXRuntimes())
2847 StaticRuntimes.push_back("asan_cxx");
2848 }
2849 }
2850 if (SanArgs.needsDfsanRt())
2851 StaticRuntimes.push_back("dfsan");
2852 if (SanArgs.needsLsanRt())
2853 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002854 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002855 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002856 if (SanArgs.linkCXXRuntimes())
2857 StaticRuntimes.push_back("msan_cxx");
2858 }
2859 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002860 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002861 if (SanArgs.linkCXXRuntimes())
2862 StaticRuntimes.push_back("tsan_cxx");
2863 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002864 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002865 StaticRuntimes.push_back("ubsan_standalone");
2866 if (SanArgs.linkCXXRuntimes())
2867 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002868 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002869 if (SanArgs.needsSafeStackRt())
2870 StaticRuntimes.push_back("safestack");
Evgeniy Stepanovfd6f92d2015-12-15 23:00:20 +00002871 if (SanArgs.needsCfiRt())
2872 StaticRuntimes.push_back("cfi");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002873 if (SanArgs.needsCfiDiagRt()) {
Evgeniy Stepanove3fb51c2015-12-16 00:38:42 +00002874 StaticRuntimes.push_back("cfi_diag");
Evgeniy Stepanov3fd61df2016-01-25 23:34:52 +00002875 if (SanArgs.linkCXXRuntimes())
2876 StaticRuntimes.push_back("ubsan_standalone_cxx");
2877 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002878 if (SanArgs.needsStatsRt()) {
2879 NonWholeStaticRuntimes.push_back("stats");
2880 RequiredSymbols.push_back("__sanitizer_stats_register");
2881 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002882}
2883
Alexey Samsonov52550342014-09-15 19:58:40 +00002884// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2885// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2886static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002887 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002888 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002889 NonWholeStaticRuntimes, HelperStaticRuntimes, RequiredSymbols;
Alexey Samsonov52550342014-09-15 19:58:40 +00002890 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
Peter Collingbournedc134532016-01-16 00:31:22 +00002891 NonWholeStaticRuntimes, HelperStaticRuntimes,
2892 RequiredSymbols);
Alexey Samsonov52550342014-09-15 19:58:40 +00002893 for (auto RT : SharedRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002894 addSanitizerRuntime(TC, Args, CmdArgs, RT, true, false);
Alexey Samsonov52550342014-09-15 19:58:40 +00002895 for (auto RT : HelperStaticRuntimes)
Peter Collingbournedc134532016-01-16 00:31:22 +00002896 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002897 bool AddExportDynamic = false;
2898 for (auto RT : StaticRuntimes) {
Peter Collingbournedc134532016-01-16 00:31:22 +00002899 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, true);
Alexey Samsonov52550342014-09-15 19:58:40 +00002900 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2901 }
Peter Collingbournedc134532016-01-16 00:31:22 +00002902 for (auto RT : NonWholeStaticRuntimes) {
2903 addSanitizerRuntime(TC, Args, CmdArgs, RT, false, false);
2904 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2905 }
2906 for (auto S : RequiredSymbols) {
2907 CmdArgs.push_back("-u");
2908 CmdArgs.push_back(Args.MakeArgString(S));
2909 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002910 // If there is a static runtime with no dynamic list, force all the symbols
2911 // to be dynamic to be sure we export sanitizer interface functions.
2912 if (AddExportDynamic)
2913 CmdArgs.push_back("-export-dynamic");
2914 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002915}
2916
Reid Kleckner86ea7702015-02-04 23:45:07 +00002917static bool areOptimizationsEnabled(const ArgList &Args) {
2918 // Find the last -O arg and see if it is non-zero.
2919 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2920 return !A->getOption().matches(options::OPT_O0);
2921 // Defaults to -O0.
2922 return false;
2923}
2924
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002925static bool shouldUseFramePointerForTarget(const ArgList &Args,
2926 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002927 switch (Triple.getArch()) {
2928 case llvm::Triple::xcore:
2929 case llvm::Triple::wasm32:
2930 case llvm::Triple::wasm64:
2931 // XCore never wants frame pointers, regardless of OS.
2932 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002933 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002934 default:
2935 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002936 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002937
2938 if (Triple.isOSLinux()) {
2939 switch (Triple.getArch()) {
2940 // Don't use a frame pointer on linux if optimizing for certain targets.
2941 case llvm::Triple::mips64:
2942 case llvm::Triple::mips64el:
2943 case llvm::Triple::mips:
2944 case llvm::Triple::mipsel:
2945 case llvm::Triple::systemz:
2946 case llvm::Triple::x86:
2947 case llvm::Triple::x86_64:
2948 return !areOptimizationsEnabled(Args);
2949 default:
2950 return true;
2951 }
2952 }
2953
2954 if (Triple.isOSWindows()) {
2955 switch (Triple.getArch()) {
2956 case llvm::Triple::x86:
2957 return !areOptimizationsEnabled(Args);
Akira Hatanaka8f5866a2016-02-26 05:07:00 +00002958 case llvm::Triple::x86_64:
2959 return Triple.isOSBinFormatMachO();
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002960 case llvm::Triple::arm:
2961 case llvm::Triple::thumb:
2962 // Windows on ARM builds with FPO disabled to aid fast stack walking
2963 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002964 default:
2965 // All other supported Windows ISAs use xdata unwind information, so frame
2966 // pointers are not generally useful.
2967 return false;
2968 }
2969 }
2970
2971 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002972}
2973
Rafael Espindola224dd632011-12-14 21:02:23 +00002974static bool shouldUseFramePointer(const ArgList &Args,
2975 const llvm::Triple &Triple) {
2976 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2977 options::OPT_fomit_frame_pointer))
2978 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002979 if (Args.hasArg(options::OPT_pg))
2980 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002981
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002982 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002983}
2984
Eric Christopherb7d97e92013-04-03 01:58:53 +00002985static bool shouldUseLeafFramePointer(const ArgList &Args,
2986 const llvm::Triple &Triple) {
2987 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2988 options::OPT_momit_leaf_frame_pointer))
2989 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002990 if (Args.hasArg(options::OPT_pg))
2991 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002992
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002993 if (Triple.isPS4CPU())
2994 return false;
2995
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002996 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002997}
2998
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002999/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003000static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00003001 SmallString<128> cwd;
3002 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00003003 CmdArgs.push_back("-fdebug-compilation-dir");
3004 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003005 }
3006}
3007
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003008static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00003009 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
3010 if (FinalOutput && Args.hasArg(options::OPT_c)) {
3011 SmallString<128> T(FinalOutput->getValue());
3012 llvm::sys::path::replace_extension(T, "dwo");
3013 return Args.MakeArgString(T);
3014 } else {
3015 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00003016 SmallString<128> T(
3017 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00003018 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00003019 llvm::sys::path::replace_extension(F, "dwo");
3020 T += F;
3021 return Args.MakeArgString(F);
3022 }
3023}
3024
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003025static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
3026 const JobAction &JA, const ArgList &Args,
3027 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00003028 ArgStringList ExtractArgs;
3029 ExtractArgs.push_back("--extract-dwo");
3030
3031 ArgStringList StripArgs;
3032 StripArgs.push_back("--strip-dwo");
3033
3034 // Grabbing the output of the earlier compile step.
3035 StripArgs.push_back(Output.getFilename());
3036 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003037 ExtractArgs.push_back(OutFile);
3038
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003039 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Lebard98cea82016-01-11 23:15:21 +00003040 InputInfo II(types::TY_Object, Output.getFilename(), Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00003041
3042 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00003043 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003044
3045 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00003046 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00003047}
3048
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003049/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003050/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
3051static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003052 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00003053 if (A->getOption().matches(options::OPT_O4) ||
3054 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003055 return true;
3056
3057 if (A->getOption().matches(options::OPT_O0))
3058 return false;
3059
3060 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
3061
Rafael Espindola91780de2013-08-26 14:05:41 +00003062 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003063 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00003064 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003065 return true;
3066
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003067 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003068 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00003069 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00003070
3071 unsigned OptLevel = 0;
3072 if (S.getAsInteger(10, OptLevel))
3073 return false;
3074
3075 return OptLevel > 1;
3076 }
3077
3078 return false;
3079}
3080
Ben Langmuir2cb4a782014-02-05 22:21:15 +00003081/// Add -x lang to \p CmdArgs for \p Input.
3082static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
3083 ArgStringList &CmdArgs) {
3084 // When using -verify-pch, we don't want to provide the type
3085 // 'precompiled-header' if it was inferred from the file extension
3086 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
3087 return;
3088
3089 CmdArgs.push_back("-x");
3090 if (Args.hasArg(options::OPT_rewrite_objc))
3091 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
3092 else
3093 CmdArgs.push_back(types::getTypeName(Input.getType()));
3094}
3095
David Majnemerc371ff02015-03-22 08:39:22 +00003096static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003097 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00003098 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003099
3100 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00003101 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003102
3103 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003104 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003105 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00003106 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00003107}
3108
Rafael Espindola577637a2015-01-03 00:06:04 +00003109// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00003110// options that build systems might add but are unused when assembling or only
3111// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00003112static void claimNoWarnArgs(const ArgList &Args) {
3113 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00003114 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00003115 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00003116 Args.ClaimAllArgs(options::OPT_flto);
3117 Args.ClaimAllArgs(options::OPT_fno_lto);
3118}
3119
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003120static void appendUserToPath(SmallVectorImpl<char> &Result) {
3121#ifdef LLVM_ON_UNIX
3122 const char *Username = getenv("LOGNAME");
3123#else
3124 const char *Username = getenv("USERNAME");
3125#endif
3126 if (Username) {
3127 // Validate that LoginName can be used in a path, and get its length.
3128 size_t Len = 0;
3129 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00003130 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003131 Username = nullptr;
3132 break;
3133 }
3134 }
3135
3136 if (Username && Len > 0) {
3137 Result.append(Username, Username + Len);
3138 return;
3139 }
3140 }
3141
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003142// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00003143#ifdef LLVM_ON_UNIX
3144 std::string UID = llvm::utostr(getuid());
3145#else
3146 // FIXME: Windows seems to have an 'SID' that might work.
3147 std::string UID = "9999";
3148#endif
3149 Result.append(UID.begin(), UID.end());
3150}
3151
David Majnemere11d3732015-06-08 00:22:46 +00003152VersionTuple visualstudio::getMSVCVersion(const Driver *D,
3153 const llvm::Triple &Triple,
3154 const llvm::opt::ArgList &Args,
3155 bool IsWindowsMSVC) {
3156 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
3157 IsWindowsMSVC) ||
3158 Args.hasArg(options::OPT_fmsc_version) ||
3159 Args.hasArg(options::OPT_fms_compatibility_version)) {
3160 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
3161 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003162 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00003163
3164 if (MSCVersion && MSCompatibilityVersion) {
3165 if (D)
3166 D->Diag(diag::err_drv_argument_not_allowed_with)
3167 << MSCVersion->getAsString(Args)
3168 << MSCompatibilityVersion->getAsString(Args);
3169 return VersionTuple();
3170 }
3171
3172 if (MSCompatibilityVersion) {
3173 VersionTuple MSVT;
3174 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
3175 D->Diag(diag::err_drv_invalid_value)
3176 << MSCompatibilityVersion->getAsString(Args)
3177 << MSCompatibilityVersion->getValue();
3178 return MSVT;
3179 }
3180
3181 if (MSCVersion) {
3182 unsigned Version = 0;
3183 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3184 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3185 << MSCVersion->getValue();
3186 return getMSCompatibilityVersion(Version);
3187 }
3188
3189 unsigned Major, Minor, Micro;
3190 Triple.getEnvironmentVersion(Major, Minor, Micro);
3191 if (Major || Minor || Micro)
3192 return VersionTuple(Major, Minor, Micro);
3193
3194 return VersionTuple(18);
3195 }
3196 return VersionTuple();
3197}
3198
Diego Novilloa0545962015-07-10 18:00:07 +00003199static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3200 const InputInfo &Output, const ArgList &Args,
3201 ArgStringList &CmdArgs) {
3202 auto *ProfileGenerateArg = Args.getLastArg(
3203 options::OPT_fprofile_instr_generate,
3204 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003205 options::OPT_fprofile_generate_EQ,
3206 options::OPT_fno_profile_instr_generate);
3207 if (ProfileGenerateArg &&
3208 ProfileGenerateArg->getOption().matches(
3209 options::OPT_fno_profile_instr_generate))
3210 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003211
3212 auto *ProfileUseArg = Args.getLastArg(
3213 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003214 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3215 options::OPT_fno_profile_instr_use);
3216 if (ProfileUseArg &&
3217 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3218 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003219
3220 if (ProfileGenerateArg && ProfileUseArg)
3221 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003222 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003223
Diego Novillo758f3f52015-08-05 21:49:51 +00003224 if (ProfileGenerateArg) {
3225 if (ProfileGenerateArg->getOption().matches(
3226 options::OPT_fprofile_instr_generate_EQ))
Rong Xu9837ef52016-02-04 18:39:09 +00003227 CmdArgs.push_back(Args.MakeArgString(Twine("-fprofile-instrument-path=") +
3228 ProfileGenerateArg->getValue()));
Diego Novillo758f3f52015-08-05 21:49:51 +00003229 else if (ProfileGenerateArg->getOption().matches(
3230 options::OPT_fprofile_generate_EQ)) {
3231 SmallString<128> Path(ProfileGenerateArg->getValue());
3232 llvm::sys::path::append(Path, "default.profraw");
3233 CmdArgs.push_back(
Rong Xu9837ef52016-02-04 18:39:09 +00003234 Args.MakeArgString(Twine("-fprofile-instrument-path=") + Path));
3235 }
3236 // The default is to use Clang Instrumentation.
3237 CmdArgs.push_back("-fprofile-instrument=clang");
Diego Novillo758f3f52015-08-05 21:49:51 +00003238 }
Diego Novilloa0545962015-07-10 18:00:07 +00003239
Diego Novillo758f3f52015-08-05 21:49:51 +00003240 if (ProfileUseArg) {
3241 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3242 ProfileUseArg->render(Args, CmdArgs);
3243 else if ((ProfileUseArg->getOption().matches(
3244 options::OPT_fprofile_use_EQ) ||
3245 ProfileUseArg->getOption().matches(
3246 options::OPT_fprofile_instr_use))) {
3247 SmallString<128> Path(
3248 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3249 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3250 llvm::sys::path::append(Path, "default.profdata");
3251 CmdArgs.push_back(
3252 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3253 }
Diego Novilloa0545962015-07-10 18:00:07 +00003254 }
3255
3256 if (Args.hasArg(options::OPT_ftest_coverage) ||
3257 Args.hasArg(options::OPT_coverage))
3258 CmdArgs.push_back("-femit-coverage-notes");
3259 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3260 false) ||
3261 Args.hasArg(options::OPT_coverage))
3262 CmdArgs.push_back("-femit-coverage-data");
3263
Diego Novilloc4b94da2015-08-05 23:27:40 +00003264 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3265 options::OPT_fno_coverage_mapping, false) &&
3266 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003267 D.Diag(diag::err_drv_argument_only_allowed_with)
3268 << "-fcoverage-mapping"
3269 << "-fprofile-instr-generate";
3270
Diego Novilloc4b94da2015-08-05 23:27:40 +00003271 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3272 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003273 CmdArgs.push_back("-fcoverage-mapping");
3274
3275 if (C.getArgs().hasArg(options::OPT_c) ||
3276 C.getArgs().hasArg(options::OPT_S)) {
3277 if (Output.isFilename()) {
3278 CmdArgs.push_back("-coverage-file");
3279 SmallString<128> CoverageFilename;
3280 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3281 CoverageFilename = FinalOutput->getValue();
3282 } else {
3283 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3284 }
3285 if (llvm::sys::path::is_relative(CoverageFilename)) {
3286 SmallString<128> Pwd;
3287 if (!llvm::sys::fs::current_path(Pwd)) {
3288 llvm::sys::path::append(Pwd, CoverageFilename);
3289 CoverageFilename.swap(Pwd);
3290 }
3291 }
3292 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3293 }
3294 }
3295}
3296
Paul Robinsond083b9a2015-12-16 17:25:27 +00003297static void addPS4ProfileRTArgs(const ToolChain &TC, const ArgList &Args,
3298 ArgStringList &CmdArgs) {
3299 if ((Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3300 false) ||
3301 Args.hasFlag(options::OPT_fprofile_generate,
3302 options::OPT_fno_profile_instr_generate, false) ||
3303 Args.hasFlag(options::OPT_fprofile_generate_EQ,
3304 options::OPT_fno_profile_instr_generate, false) ||
3305 Args.hasFlag(options::OPT_fprofile_instr_generate,
3306 options::OPT_fno_profile_instr_generate, false) ||
3307 Args.hasFlag(options::OPT_fprofile_instr_generate_EQ,
3308 options::OPT_fno_profile_instr_generate, false) ||
3309 Args.hasArg(options::OPT_fcreate_profile) ||
3310 Args.hasArg(options::OPT_coverage)))
3311 CmdArgs.push_back("--dependent-lib=libclang_rt.profile-x86_64.a");
3312}
3313
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003314/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3315/// smooshes them together with platform defaults, to decide whether
3316/// this compile should be using PIC mode or not. Returns a tuple of
3317/// (RelocationModel, PICLevel, IsPIE).
3318static std::tuple<llvm::Reloc::Model, unsigned, bool>
3319ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3320 const ArgList &Args) {
3321 // FIXME: why does this code...and so much everywhere else, use both
3322 // ToolChain.getTriple() and Triple?
3323 bool PIE = ToolChain.isPIEDefault();
3324 bool PIC = PIE || ToolChain.isPICDefault();
Bob Wilson0a15e6c2016-01-13 01:19:02 +00003325 // The Darwin/MachO default to use PIC does not apply when using -static.
3326 if (ToolChain.getTriple().isOSBinFormatMachO() &&
3327 Args.hasArg(options::OPT_static))
Bob Wilson2b2a0ae2015-12-18 20:37:54 +00003328 PIE = PIC = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003329 bool IsPICLevelTwo = PIC;
3330
3331 bool KernelOrKext =
3332 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3333
3334 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003335 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003336 switch (ToolChain.getArch()) {
3337 case llvm::Triple::arm:
3338 case llvm::Triple::armeb:
3339 case llvm::Triple::thumb:
3340 case llvm::Triple::thumbeb:
3341 case llvm::Triple::aarch64:
3342 case llvm::Triple::mips:
3343 case llvm::Triple::mipsel:
3344 case llvm::Triple::mips64:
3345 case llvm::Triple::mips64el:
3346 PIC = true; // "-fpic"
3347 break;
3348
3349 case llvm::Triple::x86:
3350 case llvm::Triple::x86_64:
3351 PIC = true; // "-fPIC"
3352 IsPICLevelTwo = true;
3353 break;
3354
3355 default:
3356 break;
3357 }
3358 }
3359
3360 // OpenBSD-specific defaults for PIE
3361 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3362 switch (ToolChain.getArch()) {
3363 case llvm::Triple::mips64:
3364 case llvm::Triple::mips64el:
3365 case llvm::Triple::sparcel:
3366 case llvm::Triple::x86:
3367 case llvm::Triple::x86_64:
3368 IsPICLevelTwo = false; // "-fpie"
3369 break;
3370
3371 case llvm::Triple::ppc:
3372 case llvm::Triple::sparc:
3373 case llvm::Triple::sparcv9:
3374 IsPICLevelTwo = true; // "-fPIE"
3375 break;
3376
3377 default:
3378 break;
3379 }
3380 }
3381
3382 // The last argument relating to either PIC or PIE wins, and no
3383 // other argument is used. If the last argument is any flavor of the
3384 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3385 // option implicitly enables PIC at the same level.
3386 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3387 options::OPT_fpic, options::OPT_fno_pic,
3388 options::OPT_fPIE, options::OPT_fno_PIE,
3389 options::OPT_fpie, options::OPT_fno_pie);
3390 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3391 // is forced, then neither PIC nor PIE flags will have no effect.
3392 if (!ToolChain.isPICDefaultForced()) {
3393 if (LastPICArg) {
3394 Option O = LastPICArg->getOption();
3395 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3396 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3397 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3398 PIC =
3399 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3400 IsPICLevelTwo =
3401 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3402 } else {
3403 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003404 if (Triple.isPS4CPU()) {
3405 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3406 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3407 if (Model != "kernel") {
3408 PIC = true;
3409 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3410 << LastPICArg->getSpelling();
3411 }
3412 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003413 }
3414 }
3415 }
3416
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003417 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3418 // PIC level would've been set to level 1, force it back to level 2 PIC
3419 // instead.
3420 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003421 IsPICLevelTwo |= ToolChain.isPICDefault();
3422
James Y Knightc4015d32015-08-21 04:14:55 +00003423 // This kernel flags are a trump-card: they will disable PIC/PIE
3424 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003425 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3426 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003427 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003428
3429 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3430 // This is a very special mode. It trumps the other modes, almost no one
3431 // uses it, and it isn't even valid on any OS but Darwin.
3432 if (!ToolChain.getTriple().isOSDarwin())
3433 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3434 << A->getSpelling() << ToolChain.getTriple().str();
3435
3436 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3437
3438 // Only a forced PIC mode can cause the actual compile to have PIC defines
3439 // etc., no flags are sufficient. This behavior was selected to closely
3440 // match that of llvm-gcc and Apple GCC before that.
3441 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3442
3443 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3444 }
3445
3446 if (PIC)
3447 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3448
3449 return std::make_tuple(llvm::Reloc::Static, 0, false);
3450}
3451
3452static const char *RelocationModelName(llvm::Reloc::Model Model) {
3453 switch (Model) {
3454 case llvm::Reloc::Default:
3455 return nullptr;
3456 case llvm::Reloc::Static:
3457 return "static";
3458 case llvm::Reloc::PIC_:
3459 return "pic";
3460 case llvm::Reloc::DynamicNoPIC:
3461 return "dynamic-no-pic";
3462 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003463 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003464}
3465
3466static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3467 ArgStringList &CmdArgs) {
3468 llvm::Reloc::Model RelocationModel;
3469 unsigned PICLevel;
3470 bool IsPIE;
3471 std::tie(RelocationModel, PICLevel, IsPIE) =
3472 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3473
3474 if (RelocationModel != llvm::Reloc::Static)
3475 CmdArgs.push_back("-KPIC");
3476}
3477
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003478void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003479 const InputInfo &Output, const InputInfoList &Inputs,
3480 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003481 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3482 const llvm::Triple Triple(TripleStr);
3483
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003484 bool KernelOrKext =
3485 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003486 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003487 ArgStringList CmdArgs;
3488
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003489 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003490 bool IsWindowsCygnus =
3491 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003492 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003493 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003494
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003495 // Check number of inputs for sanity. We need at least one input.
3496 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003497 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003498 // CUDA compilation may have multiple inputs (source file + results of
3499 // device-side compilations). All other jobs are expected to have exactly one
3500 // input.
3501 bool IsCuda = types::isCuda(Input.getType());
3502 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003503
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003504 // Invoke ourselves in -cc1 mode.
3505 //
3506 // FIXME: Implement custom jobs for internal actions.
3507 CmdArgs.push_back("-cc1");
3508
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003509 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003510 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003511 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003512
Artem Belevichfa11ab52015-11-17 22:28:46 +00003513 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003514 if (IsCuda) {
3515 // FIXME: We need a (better) way to pass information about
3516 // particular compilation pass we're constructing here. For now we
3517 // can check which toolchain we're using and pick the other one to
3518 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003519 if (&getToolChain() == C.getCudaDeviceToolChain())
3520 AuxToolChain = C.getCudaHostToolChain();
3521 else if (&getToolChain() == C.getCudaHostToolChain())
3522 AuxToolChain = C.getCudaDeviceToolChain();
3523 else
3524 llvm_unreachable("Can't figure out CUDA compilation mode.");
3525 assert(AuxToolChain != nullptr && "No aux toolchain.");
3526 CmdArgs.push_back("-aux-triple");
3527 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003528 CmdArgs.push_back("-fcuda-target-overloads");
3529 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003530 }
3531
James Y Knight2db38f32015-08-15 03:45:25 +00003532 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3533 Triple.getArch() == llvm::Triple::thumb)) {
3534 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003535 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003536 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003537 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003538 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003539 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003540 }
3541
Tim Northover336f1892014-03-29 13:16:12 +00003542 // Push all default warning arguments that are specific to
3543 // the given target. These come before user provided warning options
3544 // are provided.
3545 getToolChain().addClangWarningOptions(CmdArgs);
3546
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003547 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003548 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003549
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003550 if (isa<AnalyzeJobAction>(JA)) {
3551 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3552 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003553 } else if (isa<MigrateJobAction>(JA)) {
3554 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003555 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003556 if (Output.getType() == types::TY_Dependencies)
3557 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003558 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003559 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003560 if (Args.hasArg(options::OPT_rewrite_objc) &&
3561 !Args.hasArg(options::OPT_g_Group))
3562 CmdArgs.push_back("-P");
3563 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003564 } else if (isa<AssembleJobAction>(JA)) {
3565 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003566
David Blaikie9260ed62013-07-25 21:19:01 +00003567 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003568
3569 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003570 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003571 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003572 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003573 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003574
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003575 if (JA.getType() == types::TY_Nothing)
3576 CmdArgs.push_back("-fsyntax-only");
3577 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003578 CmdArgs.push_back("-emit-pch");
3579 else
3580 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003581 } else if (isa<VerifyPCHJobAction>(JA)) {
3582 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003583 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003584 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3585 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003586 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003587 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003588 } else if (JA.getType() == types::TY_LLVM_IR ||
3589 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003590 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003591 } else if (JA.getType() == types::TY_LLVM_BC ||
3592 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003593 CmdArgs.push_back("-emit-llvm-bc");
3594 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003595 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003596 } else if (JA.getType() == types::TY_AST) {
3597 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003598 } else if (JA.getType() == types::TY_ModuleFile) {
3599 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003600 } else if (JA.getType() == types::TY_RewrittenObjC) {
3601 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003602 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003603 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3604 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003605 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003606 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003607 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003608 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003609
3610 // Preserve use-list order by default when emitting bitcode, so that
3611 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3612 // same result as running passes here. For LTO, we don't need to preserve
3613 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003614 if (JA.getType() == types::TY_LLVM_BC)
3615 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003616
3617 if (D.isUsingLTO())
3618 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003619 }
3620
Teresa Johnsonaff22322015-12-07 19:21:34 +00003621 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3622 if (!types::isLLVMIR(Input.getType()))
3623 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3624 << "-x ir";
3625 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3626 }
3627
Justin Bognera88f0122014-06-20 22:59:50 +00003628 // We normally speed up the clang process a bit by skipping destructors at
3629 // exit, but when we're generating diagnostics we can rely on some of the
3630 // cleanup.
3631 if (!C.isForDiagnostics())
3632 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003633
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003634// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003635#ifdef NDEBUG
3636 CmdArgs.push_back("-disable-llvm-verifier");
3637#endif
3638
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003639 // Set the main file name, so that debug info works even with
3640 // -save-temps.
3641 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003642 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003643
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003644 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003645 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003646 if (Args.hasArg(options::OPT_static))
3647 CmdArgs.push_back("-static-define");
3648
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003649 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003650 // Enable region store model by default.
3651 CmdArgs.push_back("-analyzer-store=region");
3652
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003653 // Treat blocks as analysis entry points.
3654 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3655
Ted Kremenek49c79792011-03-24 00:28:47 +00003656 CmdArgs.push_back("-analyzer-eagerly-assume");
3657
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003658 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003659 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003660 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003661
Devin Coughlin65c77082016-01-21 20:09:49 +00003662 if (!IsWindowsMSVC) {
3663 CmdArgs.push_back("-analyzer-checker=unix");
3664 } else {
3665 // Enable "unix" checkers that also work on Windows.
3666 CmdArgs.push_back("-analyzer-checker=unix.API");
3667 CmdArgs.push_back("-analyzer-checker=unix.Malloc");
3668 CmdArgs.push_back("-analyzer-checker=unix.MallocSizeof");
3669 CmdArgs.push_back("-analyzer-checker=unix.MismatchedDeallocator");
3670 CmdArgs.push_back("-analyzer-checker=unix.cstring.BadSizeArg");
3671 CmdArgs.push_back("-analyzer-checker=unix.cstring.NullArg");
3672 }
Ted Kremenek49c79792011-03-24 00:28:47 +00003673
Sean Evesonb38c32b2016-01-06 10:03:58 +00003674 // Disable some unix checkers for PS4.
3675 if (IsPS4CPU) {
3676 CmdArgs.push_back("-analyzer-disable-checker=unix.API");
3677 CmdArgs.push_back("-analyzer-disable-checker=unix.Vfork");
3678 }
3679
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003680 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003681 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003682
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003683 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003684
Artem Belevichba558952015-05-06 18:20:23 +00003685 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003686 CmdArgs.push_back("-analyzer-checker=cplusplus");
3687
Sean Evesonb38c32b2016-01-06 10:03:58 +00003688 if (!IsPS4CPU) {
3689 CmdArgs.push_back(
3690 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
3691 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3692 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
3693 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
3694 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3695 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
3696 }
Gabor Horvathe3085992015-09-14 20:34:06 +00003697
3698 // Default nullability checks.
3699 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3700 CmdArgs.push_back(
3701 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003702 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003703
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003704 // Set the output format. The default is plist, for (lame) historical
3705 // reasons.
3706 CmdArgs.push_back("-analyzer-output");
3707 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003708 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003709 else
3710 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003711
Ted Kremenekfe449a22010-03-22 22:32:05 +00003712 // Disable the presentation of standard compiler warnings when
3713 // using --analyze. We only want to show static analyzer diagnostics
3714 // or frontend errors.
3715 CmdArgs.push_back("-w");
3716
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003717 // Add -Xanalyzer arguments when running as analyzer.
3718 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003719 }
3720
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003721 CheckCodeGenerationOptions(D, Args);
3722
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003723 llvm::Reloc::Model RelocationModel;
3724 unsigned PICLevel;
3725 bool IsPIE;
3726 std::tie(RelocationModel, PICLevel, IsPIE) =
3727 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003728
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003729 const char *RMName = RelocationModelName(RelocationModel);
3730 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003731 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003732 CmdArgs.push_back(RMName);
3733 }
3734 if (PICLevel > 0) {
3735 CmdArgs.push_back("-pic-level");
3736 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3737 if (IsPIE) {
3738 CmdArgs.push_back("-pie-level");
3739 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003740 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003741 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003742
Renato Golin4854d802015-11-09 12:40:41 +00003743 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3744 CmdArgs.push_back("-meabi");
3745 CmdArgs.push_back(A->getValue());
3746 }
3747
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003748 CmdArgs.push_back("-mthread-model");
3749 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3750 CmdArgs.push_back(A->getValue());
3751 else
3752 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3753
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003754 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3755
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003756 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3757 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003758 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003759
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003760 // LLVM Code Generator Options.
3761
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003762 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3763 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003764 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3765 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003766 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003767 CmdArgs.push_back(A->getValue());
3768 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003769 }
3770 }
3771
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003772 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3773 StringRef v = A->getValue();
3774 CmdArgs.push_back("-mllvm");
3775 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3776 A->claim();
3777 }
3778
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003779 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3780 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003781 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003782 }
3783
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003784 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3785 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003786 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003787 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003788 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003789 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3790 CmdArgs.push_back("-fpcc-struct-return");
3791 } else {
3792 assert(A->getOption().matches(options::OPT_freg_struct_return));
3793 CmdArgs.push_back("-freg-struct-return");
3794 }
3795 }
3796
Roman Divacky65b88cd2011-03-01 17:40:53 +00003797 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3798 CmdArgs.push_back("-mrtd");
3799
Rafael Espindola224dd632011-12-14 21:02:23 +00003800 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003801 CmdArgs.push_back("-mdisable-fp-elim");
3802 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3803 options::OPT_fno_zero_initialized_in_bss))
3804 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003805
3806 bool OFastEnabled = isOptimizationLevelFast(Args);
3807 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3808 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003809 OptSpecifier StrictAliasingAliasOption =
3810 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003811 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3812 // doesn't do any TBAA.
3813 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003814 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003815 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003816 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003817 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3818 options::OPT_fno_struct_path_tbaa))
3819 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003820 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3821 false))
3822 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003823 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3824 options::OPT_fno_strict_vtable_pointers,
3825 false))
3826 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003827 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3828 options::OPT_fno_optimize_sibling_calls))
3829 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003830
Eric Christopher006208c2013-04-04 06:29:47 +00003831 // Handle segmented stacks.
3832 if (Args.hasArg(options::OPT_fsplit_stack))
3833 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003834
3835 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3836 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003837 OptSpecifier FastMathAliasOption =
3838 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3839
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003840 // Handle various floating point optimization flags, mapping them to the
3841 // appropriate LLVM code generation flags. The pattern for all of these is to
3842 // default off the codegen optimizations, and if any flag enables them and no
3843 // flag disables them after the flag enabling them, enable the codegen
3844 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003845 if (Arg *A = Args.getLastArg(
3846 options::OPT_ffast_math, FastMathAliasOption,
3847 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3848 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3849 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003850 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3851 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003852 A->getOption().getID() != options::OPT_fhonor_infinities)
3853 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003854 if (Arg *A = Args.getLastArg(
3855 options::OPT_ffast_math, FastMathAliasOption,
3856 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3857 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3858 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003859 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3860 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003861 A->getOption().getID() != options::OPT_fhonor_nans)
3862 CmdArgs.push_back("-menable-no-nans");
3863
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003864 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3865 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003866 if (Arg *A =
3867 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3868 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3869 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003870 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3871 // However, turning *off* -ffast_math merely restores the toolchain default
3872 // (which may be false).
3873 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3874 A->getOption().getID() == options::OPT_ffast_math ||
3875 A->getOption().getID() == options::OPT_Ofast)
3876 MathErrno = false;
3877 else if (A->getOption().getID() == options::OPT_fmath_errno)
3878 MathErrno = true;
3879 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003880 if (MathErrno)
3881 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003882
3883 // There are several flags which require disabling very specific
3884 // optimizations. Any of these being disabled forces us to turn off the
3885 // entire set of LLVM optimizations, so collect them through all the flag
3886 // madness.
3887 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003888 if (Arg *A = Args.getLastArg(
3889 options::OPT_ffast_math, FastMathAliasOption,
3890 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3891 options::OPT_fno_unsafe_math_optimizations,
3892 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003893 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3894 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003895 A->getOption().getID() != options::OPT_fno_associative_math)
3896 AssociativeMath = true;
3897 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003898 if (Arg *A = Args.getLastArg(
3899 options::OPT_ffast_math, FastMathAliasOption,
3900 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3901 options::OPT_fno_unsafe_math_optimizations,
3902 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003903 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3904 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003905 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3906 ReciprocalMath = true;
3907 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003908 if (Arg *A = Args.getLastArg(
3909 options::OPT_ffast_math, FastMathAliasOption,
3910 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3911 options::OPT_fno_unsafe_math_optimizations,
3912 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003913 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3914 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003915 A->getOption().getID() != options::OPT_fsigned_zeros)
3916 SignedZeros = false;
3917 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003918 if (Arg *A = Args.getLastArg(
3919 options::OPT_ffast_math, FastMathAliasOption,
3920 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3921 options::OPT_fno_unsafe_math_optimizations,
3922 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003923 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3924 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003925 A->getOption().getID() != options::OPT_ftrapping_math)
3926 TrappingMath = false;
3927 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3928 !TrappingMath)
3929 CmdArgs.push_back("-menable-unsafe-fp-math");
3930
Sanjay Patel76c9e092015-01-23 16:40:50 +00003931 if (!SignedZeros)
3932 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003933
Sanjay Patel359b1052015-04-09 15:03:23 +00003934 if (ReciprocalMath)
3935 CmdArgs.push_back("-freciprocal-math");
3936
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003937 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003938 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003939 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003940 options::OPT_ffp_contract)) {
3941 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003942 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003943 if (Val == "fast" || Val == "on" || Val == "off") {
3944 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3945 } else {
3946 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003947 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003948 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003949 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3950 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003951 // If fast-math is set then set the fp-contract mode to fast.
3952 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3953 }
3954 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003955
Sanjay Patel2987c292015-06-11 14:53:41 +00003956 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003957
Bob Wilson6a039162012-07-19 03:52:53 +00003958 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3959 // and if we find them, tell the frontend to provide the appropriate
3960 // preprocessor macros. This is distinct from enabling any optimizations as
3961 // these options induce language changes which must survive serialization
3962 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003963 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3964 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003965 if (!A->getOption().matches(options::OPT_fno_fast_math))
3966 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003967 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3968 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003969 if (A->getOption().matches(options::OPT_ffinite_math_only))
3970 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003971
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003972 // Decide whether to use verbose asm. Verbose assembly is the default on
3973 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003974 bool IsIntegratedAssemblerDefault =
3975 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003976 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003977 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003978 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003979 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003980
Rafael Espindolab8a12932015-05-22 20:44:03 +00003981 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3982 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003983 CmdArgs.push_back("-no-integrated-as");
3984
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003985 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3986 CmdArgs.push_back("-mdebug-pass");
3987 CmdArgs.push_back("Structure");
3988 }
3989 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3990 CmdArgs.push_back("-mdebug-pass");
3991 CmdArgs.push_back("Arguments");
3992 }
3993
Justin Lebar710a35f2016-01-25 22:36:35 +00003994 // Enable -mconstructor-aliases except on darwin, where we have to work around
3995 // a linker bug (see <rdar://problem/7651567>), and CUDA device code, where
3996 // aliases aren't supported.
3997 if (!getToolChain().getTriple().isOSDarwin() &&
3998 !getToolChain().getTriple().isNVPTX())
John McCall8517abc2010-02-19 02:45:38 +00003999 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004000
John McCall7ef5cb32011-03-18 02:56:14 +00004001 // Darwin's kernel doesn't support guard variables; just die if we
4002 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00004003 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00004004 CmdArgs.push_back("-fforbid-guard-variables");
4005
Akira Hatanaka02028482015-11-12 17:21:22 +00004006 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
4007 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00004008 CmdArgs.push_back("-mms-bitfields");
4009 }
John McCall8517abc2010-02-19 02:45:38 +00004010
Daniel Dunbar306945d2009-09-16 06:17:29 +00004011 // This is a coarse approximation of what llvm-gcc actually does, both
4012 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
4013 // complicated ways.
4014 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00004015 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
4016 options::OPT_fno_asynchronous_unwind_tables,
4017 (getToolChain().IsUnwindTablesDefault() ||
4018 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
4019 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00004020 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
4021 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004022 CmdArgs.push_back("-munwind-tables");
4023
Chandler Carruth05fb5852012-11-21 23:40:23 +00004024 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00004025
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004026 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
4027 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00004028 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004029 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00004030
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004031 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004032 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00004033
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004034 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00004035 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00004036 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00004037 }
4038
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004039 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00004040 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004041 if (!CPU.empty()) {
4042 CmdArgs.push_back("-target-cpu");
4043 CmdArgs.push_back(Args.MakeArgString(CPU));
4044 }
4045
Rafael Espindolaeb265472013-08-21 21:59:03 +00004046 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
4047 CmdArgs.push_back("-mfpmath");
4048 CmdArgs.push_back(A->getValue());
4049 }
4050
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004051 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00004052 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004053
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004054 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004055 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004056 default:
4057 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00004058
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004059 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004060 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004061 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00004062 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00004063 // Use the effective triple, which takes into account the deployment target.
4064 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00004065 break;
4066
Tim Northover573cbee2014-05-24 12:52:07 +00004067 case llvm::Triple::aarch64:
4068 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00004069 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00004070 break;
4071
Eric Christopher0b26a612010-03-02 02:41:08 +00004072 case llvm::Triple::mips:
4073 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00004074 case llvm::Triple::mips64:
4075 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00004076 AddMIPSTargetArgs(Args, CmdArgs);
4077 break;
4078
Ulrich Weigand8afad612014-07-28 13:17:52 +00004079 case llvm::Triple::ppc:
4080 case llvm::Triple::ppc64:
4081 case llvm::Triple::ppc64le:
4082 AddPPCTargetArgs(Args, CmdArgs);
4083 break;
4084
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004085 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00004086 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00004087 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00004088 AddSparcTargetArgs(Args, CmdArgs);
4089 break;
4090
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00004091 case llvm::Triple::x86:
4092 case llvm::Triple::x86_64:
4093 AddX86TargetArgs(Args, CmdArgs);
4094 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004095
4096 case llvm::Triple::hexagon:
4097 AddHexagonTargetArgs(Args, CmdArgs);
4098 break;
Dan Gohmane3d71e12016-01-07 01:00:21 +00004099
4100 case llvm::Triple::wasm32:
4101 case llvm::Triple::wasm64:
4102 AddWebAssemblyTargetArgs(Args, CmdArgs);
4103 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00004104 }
4105
Douglas Katzman3459ce22015-10-08 04:24:12 +00004106 // The 'g' groups options involve a somewhat intricate sequence of decisions
4107 // about what to pass from the driver to the frontend, but by the time they
Paul Robinson0334a042015-12-19 19:41:48 +00004108 // reach cc1 they've been factored into three well-defined orthogonal choices:
Douglas Katzman3459ce22015-10-08 04:24:12 +00004109 // * what level of debug info to generate
4110 // * what dwarf version to write
Paul Robinson0334a042015-12-19 19:41:48 +00004111 // * what debugger tuning to use
Douglas Katzman3459ce22015-10-08 04:24:12 +00004112 // This avoids having to monkey around further in cc1 other than to disable
4113 // codeview if not running in a Windows environment. Perhaps even that
4114 // decision should be made in the driver as well though.
Paul Robinson0334a042015-12-19 19:41:48 +00004115 unsigned DwarfVersion = 0;
4116 llvm::DebuggerKind DebuggerTuning = getToolChain().getDefaultDebuggerTuning();
4117 // These two are potentially updated by AddClangCLArgs.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004118 codegenoptions::DebugInfoKind DebugInfoKind = codegenoptions::NoDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00004119 bool EmitCodeView = false;
4120
Hans Wennborg75958c42013-08-08 00:17:41 +00004121 // Add clang-cl arguments.
David Majnemercd5855e2016-02-29 01:40:36 +00004122 types::ID InputType = Input.getType();
Hans Wennborg75958c42013-08-08 00:17:41 +00004123 if (getToolChain().getDriver().IsCLMode())
David Majnemercd5855e2016-02-29 01:40:36 +00004124 AddClangCLArgs(Args, InputType, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00004125
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004126 // Pass the linker version in use.
4127 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
4128 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00004129 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00004130 }
4131
Eric Christopherb7d97e92013-04-03 01:58:53 +00004132 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00004133 CmdArgs.push_back("-momit-leaf-frame-pointer");
4134
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004135 // Explicitly error on some things we know we don't support and can't just
4136 // ignore.
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004137 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
4138 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004139 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004140 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00004141 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
4142 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004143 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004144 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00004145 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00004146 }
4147
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004148 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00004149 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00004150 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00004151 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004152 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
4153 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00004154 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004155 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00004156 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004157
Chad Rosierbe10f982011-08-02 17:58:04 +00004158 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004159 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004160 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
4161 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00004162 }
4163
Rafael Espindola08a692a2010-03-07 04:46:18 +00004164 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00004165 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004166 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00004167 // If the last option explicitly specified a debug-info level, use it.
4168 if (A->getOption().matches(options::OPT_gN_Group)) {
4169 DebugInfoKind = DebugLevelToInfoKind(*A);
4170 // If you say "-gsplit-dwarf -gline-tables-only", -gsplit-dwarf loses.
4171 // But -gsplit-dwarf is not a g_group option, hence we have to check the
4172 // order explicitly. (If -gsplit-dwarf wins, we fix DebugInfoKind later.)
Benjamin Kramer8c305922016-02-02 11:06:51 +00004173 if (SplitDwarfArg && DebugInfoKind < codegenoptions::LimitedDebugInfo &&
Paul Robinson0334a042015-12-19 19:41:48 +00004174 A->getIndex() > SplitDwarfArg->getIndex())
4175 SplitDwarfArg = nullptr;
4176 } else
4177 // For any other 'g' option, use Limited.
Benjamin Kramer8c305922016-02-02 11:06:51 +00004178 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00004179 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004180
Paul Robinson0334a042015-12-19 19:41:48 +00004181 // If a debugger tuning argument appeared, remember it.
4182 if (Arg *A = Args.getLastArg(options::OPT_gTune_Group,
4183 options::OPT_ggdbN_Group)) {
4184 if (A->getOption().matches(options::OPT_glldb))
4185 DebuggerTuning = llvm::DebuggerKind::LLDB;
4186 else if (A->getOption().matches(options::OPT_gsce))
4187 DebuggerTuning = llvm::DebuggerKind::SCE;
4188 else
4189 DebuggerTuning = llvm::DebuggerKind::GDB;
4190 }
4191
4192 // If a -gdwarf argument appeared, remember it.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004193 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
Eric Christopher3cb592d2015-12-28 19:58:44 +00004194 options::OPT_gdwarf_4, options::OPT_gdwarf_5))
Douglas Katzman3459ce22015-10-08 04:24:12 +00004195 DwarfVersion = DwarfVersionNum(A->getSpelling());
4196
Reid Kleckner124955a2015-08-05 18:51:13 +00004197 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00004198 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
4199 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
4200 // DwarfVersion remains at 0 if no explicit choice was made.
4201 CmdArgs.push_back("-gcodeview");
4202 } else if (DwarfVersion == 0 &&
Benjamin Kramer8c305922016-02-02 11:06:51 +00004203 DebugInfoKind != codegenoptions::NoDebugInfo) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00004204 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
4205 }
Reid Kleckner124955a2015-08-05 18:51:13 +00004206
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004207 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
4208 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004209
4210 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00004211 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004212 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00004213 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00004214
Eric Christopher138c32b2013-09-13 22:37:55 +00004215 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004216 if (Args.hasArg(options::OPT_gmodules)) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004217 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00004218 CmdArgs.push_back("-dwarf-ext-refs");
4219 CmdArgs.push_back("-fmodule-format=obj");
4220 }
4221
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004222 // -gsplit-dwarf should turn on -g and enable the backend dwarf
4223 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00004224 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00004225 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Benjamin Kramer8c305922016-02-02 11:06:51 +00004226 DebugInfoKind = codegenoptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00004227 CmdArgs.push_back("-backend-option");
4228 CmdArgs.push_back("-split-dwarf=Enable");
4229 }
4230
Douglas Katzman3459ce22015-10-08 04:24:12 +00004231 // After we've dealt with all combinations of things that could
4232 // make DebugInfoKind be other than None or DebugLineTablesOnly,
4233 // figure out if we need to "upgrade" it to standalone debug info.
4234 // We parse these two '-f' options whether or not they will be used,
4235 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4236 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4237 options::OPT_fno_standalone_debug,
4238 getToolChain().GetDefaultStandaloneDebug());
Benjamin Kramer8c305922016-02-02 11:06:51 +00004239 if (DebugInfoKind == codegenoptions::LimitedDebugInfo && NeedFullDebug)
4240 DebugInfoKind = codegenoptions::FullDebugInfo;
Paul Robinson0334a042015-12-19 19:41:48 +00004241 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion,
4242 DebuggerTuning);
Douglas Katzman3459ce22015-10-08 04:24:12 +00004243
Eric Christopher138c32b2013-09-13 22:37:55 +00004244 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4245 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4246 CmdArgs.push_back("-backend-option");
4247 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4248 }
Eric Christophereec89c22013-06-18 00:03:50 +00004249
Eric Christopher0d403d22014-02-14 01:27:03 +00004250 // -gdwarf-aranges turns on the emission of the aranges section in the
4251 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004252 // Always enabled on the PS4.
4253 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004254 CmdArgs.push_back("-backend-option");
4255 CmdArgs.push_back("-generate-arange-section");
4256 }
4257
David Blaikief36d9ba2014-01-27 18:52:43 +00004258 if (Args.hasFlag(options::OPT_fdebug_types_section,
4259 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004260 CmdArgs.push_back("-backend-option");
4261 CmdArgs.push_back("-generate-type-units");
4262 }
Eric Christophereec89c22013-06-18 00:03:50 +00004263
Dan Gohmana5b804b2016-01-07 00:50:27 +00004264 // CloudABI and WebAssembly use -ffunction-sections and -fdata-sections by
4265 // default.
4266 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI ||
4267 Triple.getArch() == llvm::Triple::wasm32 ||
4268 Triple.getArch() == llvm::Triple::wasm64;
Ed Schouten6e576152015-03-26 17:50:28 +00004269
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004270 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004271 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004272 CmdArgs.push_back("-ffunction-sections");
4273 }
4274
Peter Collingbourneceef1452016-02-24 22:03:06 +00004275 if (Args.hasFlag(options::OPT_fwhole_program_vtables,
4276 options::OPT_fno_whole_program_vtables, false)) {
Peter Collingbournefb532b92016-02-24 20:46:36 +00004277 if (!D.isUsingLTO())
4278 D.Diag(diag::err_drv_argument_only_allowed_with)
4279 << "-fwhole-program-vtables"
4280 << "-flto";
4281 CmdArgs.push_back("-fwhole-program-vtables");
4282
4283 clang::SmallString<64> Path(D.ResourceDir);
4284 llvm::sys::path::append(Path, "vtables_blacklist.txt");
4285 if (llvm::sys::fs::exists(Path)) {
4286 SmallString<64> BlacklistOpt("-fwhole-program-vtables-blacklist=");
4287 BlacklistOpt += Path.str();
4288 CmdArgs.push_back(Args.MakeArgString(BlacklistOpt));
4289 }
4290
4291 for (const Arg *A :
4292 Args.filtered(options::OPT_fwhole_program_vtables_blacklist_EQ)) {
4293 A->claim();
4294 if (!llvm::sys::fs::exists(A->getValue()))
4295 D.Diag(clang::diag::err_drv_no_such_file) << A->getValue();
4296 }
4297
4298 Args.AddAllArgs(CmdArgs, options::OPT_fwhole_program_vtables_blacklist_EQ);
4299 }
4300
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004301 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4302 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004303 CmdArgs.push_back("-fdata-sections");
4304 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004305
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004306 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004307 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004308 CmdArgs.push_back("-fno-unique-section-names");
4309
Chris Lattner3c77a352010-06-22 00:03:40 +00004310 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4311
Diego Novilloa0545962015-07-10 18:00:07 +00004312 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004313
Paul Robinsond083b9a2015-12-16 17:25:27 +00004314 // Add runtime flag for PS4 when PGO or Coverage are enabled.
4315 if (getToolChain().getTriple().isPS4CPU())
4316 addPS4ProfileRTArgs(getToolChain(), Args, CmdArgs);
4317
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004318 // Pass options for controlling the default header search paths.
4319 if (Args.hasArg(options::OPT_nostdinc)) {
4320 CmdArgs.push_back("-nostdsysteminc");
4321 CmdArgs.push_back("-nobuiltininc");
4322 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004323 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004324 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004325 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4326 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4327 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004328
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004329 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004330 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004331 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004332
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004333 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4334
Ted Kremenekf7639e12012-03-06 20:06:33 +00004335 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004336 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004337 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004338 options::OPT_ccc_arcmt_modify,
4339 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004340 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004341 switch (A->getOption().getID()) {
4342 default:
4343 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004344 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004345 CmdArgs.push_back("-arcmt-check");
4346 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004347 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004348 CmdArgs.push_back("-arcmt-modify");
4349 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004350 case options::OPT_ccc_arcmt_migrate:
4351 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004352 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004353 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004354
4355 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4356 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004357 break;
John McCalld70fb982011-06-15 23:25:17 +00004358 }
4359 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004360 } else {
4361 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4362 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4363 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004364 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004365
Ted Kremenekf7639e12012-03-06 20:06:33 +00004366 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4367 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004368 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4369 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004370 }
4371 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004372 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004373
4374 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004375 options::OPT_objcmt_migrate_subscripting,
4376 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004377 // None specified, means enable them all.
4378 CmdArgs.push_back("-objcmt-migrate-literals");
4379 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004380 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004381 } else {
4382 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4383 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004384 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004385 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004386 } else {
4387 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4388 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4389 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4390 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4391 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4392 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004393 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004394 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4395 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4396 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4397 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4398 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4399 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4400 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004401 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004402 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004403 }
4404
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004405 // Add preprocessing options like -I, -D, etc. if we are using the
4406 // preprocessor.
4407 //
4408 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004409 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004410 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4411 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004412
Rafael Espindolaa7431922011-07-21 23:40:37 +00004413 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4414 // that "The compiler can only warn and ignore the option if not recognized".
4415 // When building with ccache, it will pass -D options to clang even on
4416 // preprocessed inputs and configure concludes that -fPIC is not supported.
4417 Args.ClaimAllArgs(options::OPT_D);
4418
Alp Toker7874bdc2013-11-15 20:40:58 +00004419 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004420 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4421 if (A->getOption().matches(options::OPT_O4)) {
4422 CmdArgs.push_back("-O3");
4423 D.Diag(diag::warn_O4_is_O3);
4424 } else {
4425 A->render(Args, CmdArgs);
4426 }
4427 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004428
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004429 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004430 for (const Arg *A :
4431 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4432 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004433 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004434 }
4435
Rafael Espindola577637a2015-01-03 00:06:04 +00004436 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004437
Richard Smith3be1cb22014-08-07 00:24:21 +00004438 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004439 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004440 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4441 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004442 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004443 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004444
4445 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004446 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004447 //
4448 // If a std is supplied, only add -trigraphs if it follows the
4449 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004450 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004451 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4452 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004453 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004454 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004455 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004456 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004457 else
4458 Std->render(Args, CmdArgs);
4459
Nico Weber00721502014-12-23 22:32:37 +00004460 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004461 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004462 options::OPT_ftrigraphs,
4463 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004464 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004465 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004466 } else {
4467 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004468 //
4469 // FIXME: Clang doesn't correctly handle -std= when the input language
4470 // doesn't match. For the time being just ignore this for C++ inputs;
4471 // eventually we want to do all the standard defaulting here instead of
4472 // splitting it between the driver and clang -cc1.
4473 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004474 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4475 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004476 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004477 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004478
Nico Weber00721502014-12-23 22:32:37 +00004479 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4480 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004481 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004482
Richard Smith282b4492013-09-04 22:50:31 +00004483 // GCC's behavior for -Wwrite-strings is a bit strange:
4484 // * In C, this "warning flag" changes the types of string literals from
4485 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4486 // for the discarded qualifier.
4487 // * In C++, this is just a normal warning flag.
4488 //
4489 // Implementing this warning correctly in C is hard, so we follow GCC's
4490 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4491 // a non-const char* in C, rather than using this crude hack.
4492 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004493 // FIXME: This should behave just like a warning flag, and thus should also
4494 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4495 Arg *WriteStrings =
4496 Args.getLastArg(options::OPT_Wwrite_strings,
4497 options::OPT_Wno_write_strings, options::OPT_w);
4498 if (WriteStrings &&
4499 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004500 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004501 }
4502
Chandler Carruth61fbf622011-04-23 09:27:53 +00004503 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004504 // during C++ compilation, which it is by default. GCC keeps this define even
4505 // in the presence of '-w', match this behavior bug-for-bug.
4506 if (types::isCXX(InputType) &&
4507 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4508 true)) {
4509 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004510 }
4511
Chandler Carruthe0391482010-05-22 02:21:53 +00004512 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4513 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4514 if (Asm->getOption().matches(options::OPT_fasm))
4515 CmdArgs.push_back("-fgnu-keywords");
4516 else
4517 CmdArgs.push_back("-fno-gnu-keywords");
4518 }
4519
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004520 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4521 CmdArgs.push_back("-fno-dwarf-directory-asm");
4522
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004523 if (ShouldDisableAutolink(Args, getToolChain()))
4524 CmdArgs.push_back("-fno-autolink");
4525
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004526 // Add in -fdebug-compilation-dir if necessary.
4527 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004528
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004529 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4530 StringRef Map = A->getValue();
4531 if (Map.find('=') == StringRef::npos)
4532 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4533 else
4534 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4535 A->claim();
4536 }
4537
Richard Smith9a568822011-11-21 19:36:32 +00004538 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4539 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004540 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004541 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004542 }
4543
Richard Smith79c927b2013-11-06 19:31:51 +00004544 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4545 CmdArgs.push_back("-foperator-arrow-depth");
4546 CmdArgs.push_back(A->getValue());
4547 }
4548
Richard Smith9a568822011-11-21 19:36:32 +00004549 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4550 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004551 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004552 }
4553
Richard Smitha3d3bd22013-05-08 02:12:03 +00004554 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4555 CmdArgs.push_back("-fconstexpr-steps");
4556 CmdArgs.push_back(A->getValue());
4557 }
4558
Richard Smithb3a14522013-02-22 01:59:51 +00004559 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4560 CmdArgs.push_back("-fbracket-depth");
4561 CmdArgs.push_back(A->getValue());
4562 }
4563
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004564 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4565 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004566 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004567 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004568 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4569 } else
4570 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004571 }
4572
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004573 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004574 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004575
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004576 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4577 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004578 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004579 }
David Chisnall5778fce2009-08-31 16:41:57 +00004580
Chris Lattnere23003d2010-01-09 21:54:33 +00004581 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4582 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004583 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004584 }
4585
Chris Lattnerb35583d2010-04-07 20:49:23 +00004586 CmdArgs.push_back("-ferror-limit");
4587 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004588 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004589 else
4590 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004591
Chandler Carrutha77a7272010-05-06 04:55:18 +00004592 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4593 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004594 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004595 }
4596
4597 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4598 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004599 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004600 }
4601
Richard Smithf6f003a2011-12-16 19:06:07 +00004602 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4603 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004604 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004605 }
4606
Nick Lewycky24653262014-12-16 21:39:02 +00004607 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4608 CmdArgs.push_back("-fspell-checking-limit");
4609 CmdArgs.push_back(A->getValue());
4610 }
4611
Daniel Dunbar2c978472009-11-04 06:24:47 +00004612 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004613 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004614 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004615 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004616 } else {
4617 // If -fmessage-length=N was not specified, determine whether this is a
4618 // terminal and, if so, implicitly define -fmessage-length appropriately.
4619 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004620 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004621 }
4622
John McCallb4a99d32013-02-19 01:57:35 +00004623 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4624 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4625 options::OPT_fvisibility_ms_compat)) {
4626 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4627 CmdArgs.push_back("-fvisibility");
4628 CmdArgs.push_back(A->getValue());
4629 } else {
4630 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4631 CmdArgs.push_back("-fvisibility");
4632 CmdArgs.push_back("hidden");
4633 CmdArgs.push_back("-ftype-visibility");
4634 CmdArgs.push_back("default");
4635 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004636 }
4637
Douglas Gregor08329632010-06-15 17:05:35 +00004638 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004639
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004640 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4641
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004642 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004643 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4644 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004645 CmdArgs.push_back("-ffreestanding");
4646
Daniel Dunbare357d562009-12-03 18:42:11 +00004647 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004648 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004649 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004650 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004651 // Emulated TLS is enabled by default on Android, and can be enabled manually
4652 // with -femulated-tls.
NAKAMURA Takumi33ff1dd2016-01-16 03:44:52 +00004653 bool EmulatedTLSDefault = Triple.isAndroid() || Triple.isWindowsCygwinEnvironment();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004654 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4655 EmulatedTLSDefault))
4656 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004657 // AltiVec-like language extensions aren't relevant for assembling.
4658 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004659 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004660 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4661 }
Richard Trieu91844232012-06-26 18:18:47 +00004662 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4663 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004664
Alexey Bataevdb390212015-05-20 04:24:19 +00004665 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004666 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4667 options::OPT_fno_openmp, false))
4668 switch (getOpenMPRuntime(getToolChain(), Args)) {
4669 case OMPRT_OMP:
4670 case OMPRT_IOMP5:
4671 // Clang can generate useful OpenMP code for these two runtime libraries.
4672 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004673
4674 // If no option regarding the use of TLS in OpenMP codegeneration is
4675 // given, decide a default based on the target. Otherwise rely on the
4676 // options and pass the right information to the frontend.
4677 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004678 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004679 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004680 break;
4681 default:
4682 // By default, if Clang doesn't know how to generate useful OpenMP code
4683 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4684 // down to the actual compilation.
4685 // FIXME: It would be better to have a mode which *only* omits IR
4686 // generation based on the OpenMP support so that we get consistent
4687 // semantic analysis, etc.
4688 break;
4689 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004690
Peter Collingbourne32701642013-11-01 18:16:25 +00004691 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004692 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004693
Eric Christopher459d2712013-02-19 06:16:53 +00004694 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004695 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4696 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4697 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4698 Arch == llvm::Triple::ppc64le))
4699 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4700 << "ppc/ppc64/ppc64le";
4701 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004702
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004703 // -fzvector is incompatible with -faltivec.
4704 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4705 if (Args.hasArg(options::OPT_faltivec))
4706 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4707 << "-faltivec";
4708
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004709 if (getToolChain().SupportsProfiling())
4710 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004711
4712 // -flax-vector-conversions is default.
4713 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4714 options::OPT_fno_lax_vector_conversions))
4715 CmdArgs.push_back("-fno-lax-vector-conversions");
4716
John Brawna7b4ec02015-08-10 11:11:28 +00004717 if (Args.getLastArg(options::OPT_fapple_kext) ||
4718 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004719 CmdArgs.push_back("-fapple-kext");
4720
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004721 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004722 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004723 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004724 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4725 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004726
4727 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4728 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004729 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004730 }
4731
Bob Wilson14adb362012-02-03 06:27:22 +00004732 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004733
Chandler Carruth6e501032011-03-27 00:04:55 +00004734 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4735 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004736 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004737 if (A->getOption().matches(options::OPT_fwrapv))
4738 CmdArgs.push_back("-fwrapv");
4739 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4740 options::OPT_fno_strict_overflow)) {
4741 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4742 CmdArgs.push_back("-fwrapv");
4743 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004744
4745 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4746 options::OPT_fno_reroll_loops))
4747 if (A->getOption().matches(options::OPT_freroll_loops))
4748 CmdArgs.push_back("-freroll-loops");
4749
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004750 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004751 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4752 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004753
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004754 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4755
Daniel Dunbar4930e332009-11-17 08:07:36 +00004756 // -stack-protector=0 is default.
4757 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004758 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4759 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4760 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4761 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4762 Args.ClaimAllArgs(options::OPT_fstack_protector);
4763 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004764 options::OPT_fstack_protector_all,
4765 options::OPT_fstack_protector_strong,
4766 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004767 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004768 StackProtectorLevel = std::max<unsigned>(
4769 LangOptions::SSPOn,
4770 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004771 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004772 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004773 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004774 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004775 } else {
4776 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004777 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004778 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004779 if (StackProtectorLevel) {
4780 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004781 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004782 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004783
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004784 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004785 for (const Arg *A : Args.filtered(options::OPT__param)) {
4786 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004787 if (Str.startswith("ssp-buffer-size=")) {
4788 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004789 CmdArgs.push_back("-stack-protector-buffer-size");
4790 // FIXME: Verify the argument is a valid integer.
4791 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004792 }
Sean Silva14facf32015-06-09 01:57:17 +00004793 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004794 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004795 }
4796
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004797 // Translate -mstackrealign
4798 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004799 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004800 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004801
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004802 if (Args.hasArg(options::OPT_mstack_alignment)) {
4803 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4804 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004805 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004806
Hans Wennborg77dc2362015-01-20 19:45:50 +00004807 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4808 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4809
4810 if (!Size.empty())
4811 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4812 else
4813 CmdArgs.push_back("-mstack-probe-size=0");
4814 }
4815
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004816 switch (getToolChain().getArch()) {
4817 case llvm::Triple::aarch64:
4818 case llvm::Triple::aarch64_be:
4819 case llvm::Triple::arm:
4820 case llvm::Triple::armeb:
4821 case llvm::Triple::thumb:
4822 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004823 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004824 break;
4825
4826 default:
4827 break;
4828 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004829
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004830 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4831 options::OPT_mno_restrict_it)) {
4832 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4833 CmdArgs.push_back("-backend-option");
4834 CmdArgs.push_back("-arm-restrict-it");
4835 } else {
4836 CmdArgs.push_back("-backend-option");
4837 CmdArgs.push_back("-arm-no-restrict-it");
4838 }
James Y Knight2db38f32015-08-15 03:45:25 +00004839 } else if (Triple.isOSWindows() &&
4840 (Triple.getArch() == llvm::Triple::arm ||
4841 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004842 // Windows on ARM expects restricted IT blocks
4843 CmdArgs.push_back("-backend-option");
4844 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004845 }
4846
Daniel Dunbard18049a2009-04-07 21:16:11 +00004847 // Forward -f options with positive and negative forms; we translate
4848 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004849 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4850 StringRef fname = A->getValue();
4851 if (!llvm::sys::fs::exists(fname))
4852 D.Diag(diag::err_drv_no_such_file) << fname;
4853 else
4854 A->render(Args, CmdArgs);
4855 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004856
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004857 // -fbuiltin is default unless -mkernel is used.
4858 bool UseBuiltins =
4859 Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4860 !Args.hasArg(options::OPT_mkernel));
4861 if (!UseBuiltins)
Daniel Dunbar484afa22009-11-19 04:55:23 +00004862 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004863
Chad Rosier7dbc9cf2016-01-06 14:35:46 +00004864 // -ffreestanding implies -fno-builtin.
4865 if (Args.hasArg(options::OPT_ffreestanding))
4866 UseBuiltins = false;
4867
4868 // Process the -fno-builtin-* options.
4869 for (const auto &Arg : Args) {
4870 const Option &O = Arg->getOption();
4871 if (!O.matches(options::OPT_fno_builtin_))
4872 continue;
4873
4874 Arg->claim();
4875 // If -fno-builtin is specified, then there's no need to pass the option to
4876 // the frontend.
4877 if (!UseBuiltins)
4878 continue;
4879
4880 StringRef FuncName = Arg->getValue();
4881 CmdArgs.push_back(Args.MakeArgString("-fno-builtin-" + FuncName));
4882 }
4883
Nuno Lopes13c88c72009-12-16 16:59:22 +00004884 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4885 options::OPT_fno_assume_sane_operator_new))
4886 CmdArgs.push_back("-fno-assume-sane-operator-new");
4887
Daniel Dunbar4930e332009-11-17 08:07:36 +00004888 // -fblocks=0 is default.
4889 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004890 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004891 (Args.hasArg(options::OPT_fgnu_runtime) &&
4892 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4893 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004894 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004895
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004896 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004897 !getToolChain().hasBlocksRuntime())
4898 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004899 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004900
Richard Smith47972af2015-06-16 00:08:24 +00004901 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004902 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004903 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004904 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004905 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004906 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4907 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004908 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004909 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004910 HaveModules = true;
4911 }
4912 }
4913
Richard Smith47972af2015-06-16 00:08:24 +00004914 // -fmodule-maps enables implicit reading of module map files. By default,
4915 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004916 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4917 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004918 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004919 }
4920
Daniel Jasperac42b752013-10-21 06:34:34 +00004921 // -fmodules-decluse checks that modules used are declared so (off by
4922 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004923 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004924 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004925 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004926 }
4927
Daniel Jasper962b38e2014-04-11 11:47:45 +00004928 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4929 // all #included headers are part of modules.
4930 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004931 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004932 CmdArgs.push_back("-fmodules-strict-decluse");
4933 }
4934
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004935 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4936 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4937 options::OPT_fno_implicit_modules)) {
4938 CmdArgs.push_back("-fno-implicit-modules");
4939 }
4940
Daniel Jasperac42b752013-10-21 06:34:34 +00004941 // -fmodule-name specifies the module that is currently being built (or
4942 // used for header checking by -fmodule-maps).
Richard Smith7e82e012016-02-19 22:25:36 +00004943 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name_EQ);
Daniel Jasperac42b752013-10-21 06:34:34 +00004944
Richard Smith9887d792014-10-17 01:42:53 +00004945 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004946 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004947 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004948
Richard Smithe842a472014-10-22 02:05:46 +00004949 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004950 if (HaveModules)
4951 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4952 else
4953 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004954
4955 // -fmodule-cache-path specifies where our implicitly-built module files
4956 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004957 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004958 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004959 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004960 if (HaveModules) {
4961 if (C.isForDiagnostics()) {
4962 // When generating crash reports, we want to emit the modules along with
4963 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004964 Path = Output.getFilename();
4965 llvm::sys::path::replace_extension(Path, ".cache");
4966 llvm::sys::path::append(Path, "modules");
4967 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004968 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004969 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004970 llvm::sys::path::append(Path, "org.llvm.clang.");
4971 appendUserToPath(Path);
4972 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004973 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004974 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004975 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4976 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004977 }
4978
4979 // When building modules and generating crashdumps, we need to dump a module
4980 // dependency VFS alongside the output.
4981 if (HaveModules && C.isForDiagnostics()) {
4982 SmallString<128> VFSDir(Output.getFilename());
4983 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004984 // Add the cache directory as a temp so the crash diagnostics pick it up.
4985 C.addTempFile(Args.MakeArgString(VFSDir));
4986
Justin Bognera88f0122014-06-20 22:59:50 +00004987 llvm::sys::path::append(VFSDir, "vfs");
4988 CmdArgs.push_back("-module-dependency-dir");
4989 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004990 }
4991
Richard Smith9887d792014-10-17 01:42:53 +00004992 if (HaveModules)
4993 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004994
Douglas Gregor35b04d62013-02-07 19:01:24 +00004995 // Pass through all -fmodules-ignore-macro arguments.
4996 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004997 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4998 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004999
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005000 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
5001
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005002 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
5003 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
5004 D.Diag(diag::err_drv_argument_not_allowed_with)
5005 << A->getAsString(Args) << "-fbuild-session-timestamp";
5006
5007 llvm::sys::fs::file_status Status;
5008 if (llvm::sys::fs::status(A->getValue(), Status))
5009 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00005010 CmdArgs.push_back(Args.MakeArgString(
5011 "-fbuild-session-timestamp=" +
5012 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005013 }
5014
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005015 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00005016 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
5017 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00005018 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
5019
5020 Args.AddLastArg(CmdArgs,
5021 options::OPT_fmodules_validate_once_per_build_session);
5022 }
5023
Ben Langmuirdcf73862014-03-12 00:06:17 +00005024 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
5025
John McCalldfea9982010-04-09 19:12:06 +00005026 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00005027 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005028 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00005029 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00005030
Anders Carlssond470fef2010-11-21 00:09:52 +00005031 // -felide-constructors is the default.
5032 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005033 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00005034 CmdArgs.push_back("-fno-elide-constructors");
5035
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005036 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00005037
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00005038 if (KernelOrKext || (types::isCXX(InputType) &&
5039 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
5040 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00005041 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00005042
Tony Linthicum76329bf2011-12-12 21:14:55 +00005043 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005044 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
5045 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00005046 CmdArgs.push_back("-fshort-enums");
5047
Daniel Dunbard609b7b2009-11-17 06:37:03 +00005048 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00005049 if (Arg *A = Args.getLastArg(
5050 options::OPT_fsigned_char, options::OPT_fno_signed_char,
5051 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
5052 if (A->getOption().matches(options::OPT_funsigned_char) ||
5053 A->getOption().matches(options::OPT_fno_signed_char)) {
5054 CmdArgs.push_back("-fno-signed-char");
5055 }
5056 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00005057 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00005058 }
Eli Friedman327f0b52009-06-05 07:21:14 +00005059
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005060 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00005061 if (!Args.hasFlag(
5062 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
5063 !IsWindowsCygnus && !IsWindowsGNU &&
5064 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
5065 getToolChain().getArch() != llvm::Triple::hexagon &&
5066 getToolChain().getArch() != llvm::Triple::xcore &&
5067 ((getToolChain().getTriple().getVendor() !=
5068 llvm::Triple::MipsTechnologies) ||
5069 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00005070 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00005071 CmdArgs.push_back("-fno-use-cxa-atexit");
5072
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005073 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00005074 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005075 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00005076 CmdArgs.push_back("-fms-extensions");
5077
Reid Kleckner1df0fea2015-02-26 00:17:25 +00005078 // -fno-use-line-directives is default.
5079 if (Args.hasFlag(options::OPT_fuse_line_directives,
5080 options::OPT_fno_use_line_directives, false))
5081 CmdArgs.push_back("-fuse-line-directives");
5082
Francois Pichet1b4f1632011-09-17 04:32:15 +00005083 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005084 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00005085 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005086 (IsWindowsMSVC &&
5087 Args.hasFlag(options::OPT_fms_extensions,
5088 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00005089 CmdArgs.push_back("-fms-compatibility");
5090
David Majnemerc371ff02015-03-22 08:39:22 +00005091 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00005092 VersionTuple MSVT = visualstudio::getMSVCVersion(
5093 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
5094 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00005095 CmdArgs.push_back(
5096 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00005097
David Majnemer8db91762015-05-18 04:49:30 +00005098 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
5099 if (ImplyVCPPCXXVer) {
5100 if (IsMSVC2015Compatible)
5101 CmdArgs.push_back("-std=c++14");
5102 else
5103 CmdArgs.push_back("-std=c++11");
5104 }
5105
Eric Christopher5ecce122013-02-18 00:38:31 +00005106 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00005107 if (Args.hasFlag(options::OPT_fborland_extensions,
5108 options::OPT_fno_borland_extensions, false))
5109 CmdArgs.push_back("-fborland-extensions");
5110
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00005111 // -fno-declspec is default, except for PS4.
5112 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
5113 getToolChain().getTriple().isPS4()))
5114 CmdArgs.push_back("-fdeclspec");
5115 else if (Args.hasArg(options::OPT_fno_declspec))
5116 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
5117
David Majnemerc371ff02015-03-22 08:39:22 +00005118 // -fthreadsafe-static is default, except for MSVC compatibility versions less
5119 // than 19.
5120 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
5121 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00005122 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00005123 CmdArgs.push_back("-fno-threadsafe-statics");
5124
Francois Pichet02744872011-09-01 16:38:08 +00005125 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
5126 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00005127 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00005128 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00005129 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00005130
Chandler Carruthe03aa552010-04-17 20:17:31 +00005131 // -fgnu-keywords default varies depending on language; only pass if
5132 // specified.
5133 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00005134 options::OPT_fno_gnu_keywords))
5135 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00005136
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005137 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00005138 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00005139 CmdArgs.push_back("-fgnu89-inline");
5140
Chad Rosier9c76d242012-03-15 22:31:42 +00005141 if (Args.hasArg(options::OPT_fno_inline))
5142 CmdArgs.push_back("-fno-inline");
5143
Chad Rosier64d6be92012-03-06 21:17:19 +00005144 if (Args.hasArg(options::OPT_fno_inline_functions))
5145 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00005146
John McCall5fb5df92012-06-20 06:18:46 +00005147 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00005148
John McCall5fb5df92012-06-20 06:18:46 +00005149 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00005150 // legacy is the default. Except for deployment taget of 10.5,
5151 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
5152 // gets ignored silently.
5153 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00005154 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
5155 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00005156 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005157 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00005158 if (getToolChain().UseObjCMixedDispatch())
5159 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
5160 else
5161 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
5162 }
5163 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00005164
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005165 // When ObjectiveC legacy runtime is in effect on MacOSX,
5166 // turn on the option to do Array/Dictionary subscripting
5167 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005168 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00005169 getToolChain().getTriple().isMacOSX() &&
5170 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
5171 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00005172 objcRuntime.isNeXTFamily())
5173 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005174
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00005175 // -fencode-extended-block-signature=1 is default.
5176 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
5177 CmdArgs.push_back("-fencode-extended-block-signature");
5178 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005179
John McCall24fc0de2011-07-06 00:26:06 +00005180 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
5181 // NOTE: This logic is duplicated in ToolChains.cpp.
5182 bool ARC = isObjCAutoRefCount(Args);
5183 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00005184 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00005185
John McCall24fc0de2011-07-06 00:26:06 +00005186 CmdArgs.push_back("-fobjc-arc");
5187
Chandler Carruth491db322011-11-04 07:34:47 +00005188 // FIXME: It seems like this entire block, and several around it should be
5189 // wrapped in isObjC, but for now we just use it here as this is where it
5190 // was being used previously.
5191 if (types::isCXX(InputType) && types::isObjC(InputType)) {
5192 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
5193 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
5194 else
5195 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
5196 }
5197
John McCall24fc0de2011-07-06 00:26:06 +00005198 // Allow the user to enable full exceptions code emission.
5199 // We define off for Objective-CC, on for Objective-C++.
5200 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
5201 options::OPT_fno_objc_arc_exceptions,
5202 /*default*/ types::isCXX(InputType)))
5203 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00005204
John McCall24fc0de2011-07-06 00:26:06 +00005205 }
5206
5207 // -fobjc-infer-related-result-type is the default, except in the Objective-C
5208 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00005209 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00005210 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005211
John McCall24fc0de2011-07-06 00:26:06 +00005212 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
5213 // takes precedence.
5214 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
5215 if (!GCArg)
5216 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
5217 if (GCArg) {
5218 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005219 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005220 } else if (getToolChain().SupportsObjCGC()) {
5221 GCArg->render(Args, CmdArgs);
5222 } else {
5223 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005224 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00005225 }
5226 }
5227
John McCallfbe5ed72015-11-05 19:19:56 +00005228 // Pass down -fobjc-weak or -fno-objc-weak if present.
5229 if (types::isObjC(InputType)) {
5230 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
5231 options::OPT_fno_objc_weak);
5232 if (!WeakArg) {
5233 // nothing to do
5234 } else if (GCArg) {
5235 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5236 D.Diag(diag::err_objc_weak_with_gc);
5237 } else if (!objcRuntime.allowsWeak()) {
5238 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
5239 D.Diag(diag::err_objc_weak_unsupported);
5240 } else {
5241 WeakArg->render(Args, CmdArgs);
5242 }
5243 }
5244
Bob Wilsonb111ec92015-03-02 19:01:14 +00005245 if (Args.hasFlag(options::OPT_fapplication_extension,
5246 options::OPT_fno_application_extension, false))
5247 CmdArgs.push_back("-fapplication-extension");
5248
Reid Klecknerc542d372014-06-27 17:02:02 +00005249 // Handle GCC-style exception args.
5250 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005251 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
5252 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00005253
Tim Northovere931f9f2015-10-30 16:30:41 +00005254 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00005255 CmdArgs.push_back("-fsjlj-exceptions");
5256
5257 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00005258 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
5259 options::OPT_fno_assume_sane_operator_new))
5260 CmdArgs.push_back("-fno-assume-sane-operator-new");
5261
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00005262 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
5263 // most platforms.
5264 if (Args.hasFlag(options::OPT_fsized_deallocation,
5265 options::OPT_fno_sized_deallocation, false))
5266 CmdArgs.push_back("-fsized-deallocation");
5267
Daniel Dunbar34d7a992010-04-27 15:34:57 +00005268 // -fconstant-cfstrings is default, and may be subject to argument translation
5269 // on Darwin.
5270 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
5271 options::OPT_fno_constant_cfstrings) ||
5272 !Args.hasFlag(options::OPT_mconstant_cfstrings,
5273 options::OPT_mno_constant_cfstrings))
5274 CmdArgs.push_back("-fno-constant-cfstrings");
5275
John Thompsoned4e2952009-11-05 20:14:16 +00005276 // -fshort-wchar default varies depending on platform; only
5277 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00005278 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
5279 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00005280 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00005281
Hans Wennborg28c96312013-07-31 23:39:13 +00005282 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005283 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005284 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005285 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00005286
Daniel Dunbar096ed292011-10-05 21:04:55 +00005287 // Honor -fpack-struct= and -fpack-struct, if given. Note that
5288 // -fno-pack-struct doesn't apply to -fpack-struct=.
5289 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005290 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005291 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005292 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005293 } else if (Args.hasFlag(options::OPT_fpack_struct,
5294 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005295 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005296 }
5297
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005298 // Handle -fmax-type-align=N and -fno-type-align
5299 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5300 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5301 if (!SkipMaxTypeAlign) {
5302 std::string MaxTypeAlignStr = "-fmax-type-align=";
5303 MaxTypeAlignStr += A->getValue();
5304 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5305 }
5306 } else if (getToolChain().getTriple().isOSDarwin()) {
5307 if (!SkipMaxTypeAlign) {
5308 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5309 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5310 }
5311 }
5312
John Brawna7b4ec02015-08-10 11:11:28 +00005313 // -fcommon is the default unless compiling kernel code or the target says so
5314 bool NoCommonDefault =
5315 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5316 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5317 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005318 CmdArgs.push_back("-fno-common");
5319
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005320 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005321 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005322 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005323 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005324 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005325 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005326
Daniel Dunbar6358d682010-10-15 22:30:42 +00005327 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005328 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005329 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005330 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005331
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005332 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005333 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5334 StringRef value = inputCharset->getValue();
5335 if (value != "UTF-8")
5336 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5337 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005338 }
5339
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005340 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005341 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5342 StringRef value = execCharset->getValue();
5343 if (value != "UTF-8")
5344 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5345 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005346 }
5347
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005348 // -fcaret-diagnostics is default.
5349 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5350 options::OPT_fno_caret_diagnostics, true))
5351 CmdArgs.push_back("-fno-caret-diagnostics");
5352
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005353 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005354 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005355 options::OPT_fno_diagnostics_fixit_info))
5356 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005357
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005358 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005359 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005360 options::OPT_fno_diagnostics_show_option))
5361 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005362
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005363 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005364 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005365 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005366 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005367 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005368
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005369 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005370 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005371 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005372 }
5373
Chandler Carruthb6766f02011-03-27 01:50:55 +00005374 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005375 options::OPT_fdiagnostics_show_note_include_stack,
5376 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005377 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005378 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005379 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5380 else
5381 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5382 }
5383
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005384 // Color diagnostics are the default, unless the terminal doesn't support
5385 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005386 // Support both clang's -f[no-]color-diagnostics and gcc's
5387 // -f[no-]diagnostics-colors[=never|always|auto].
5388 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005389 for (const auto &Arg : Args) {
5390 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005391 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5392 !O.matches(options::OPT_fdiagnostics_color) &&
5393 !O.matches(options::OPT_fno_color_diagnostics) &&
5394 !O.matches(options::OPT_fno_diagnostics_color) &&
5395 !O.matches(options::OPT_fdiagnostics_color_EQ))
5396 continue;
5397
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005398 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005399 if (O.matches(options::OPT_fcolor_diagnostics) ||
5400 O.matches(options::OPT_fdiagnostics_color)) {
5401 ShowColors = Colors_On;
5402 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5403 O.matches(options::OPT_fno_diagnostics_color)) {
5404 ShowColors = Colors_Off;
5405 } else {
5406 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005407 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005408 if (value == "always")
5409 ShowColors = Colors_On;
5410 else if (value == "never")
5411 ShowColors = Colors_Off;
5412 else if (value == "auto")
5413 ShowColors = Colors_Auto;
5414 else
5415 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005416 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005417 }
5418 }
5419 if (ShowColors == Colors_On ||
5420 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005421 CmdArgs.push_back("-fcolor-diagnostics");
5422
Nico Rieck7857d462013-09-11 00:38:02 +00005423 if (Args.hasArg(options::OPT_fansi_escape_codes))
5424 CmdArgs.push_back("-fansi-escape-codes");
5425
Daniel Dunbardb097022009-06-08 21:13:54 +00005426 if (!Args.hasFlag(options::OPT_fshow_source_location,
5427 options::OPT_fno_show_source_location))
5428 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005429
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005430 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005431 true))
5432 CmdArgs.push_back("-fno-show-column");
5433
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005434 if (!Args.hasFlag(options::OPT_fspell_checking,
5435 options::OPT_fno_spell_checking))
5436 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005437
Chad Rosierc8e56e82012-12-05 21:08:21 +00005438 // -fno-asm-blocks is default.
5439 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5440 false))
5441 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005442
Steven Wucb0d13f2015-01-16 23:05:28 +00005443 // -fgnu-inline-asm is default.
5444 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5445 options::OPT_fno_gnu_inline_asm, true))
5446 CmdArgs.push_back("-fno-gnu-inline-asm");
5447
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005448 // Enable vectorization per default according to the optimization level
5449 // selected. For optimization levels that want vectorization we use the alias
5450 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005451 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005452 OptSpecifier VectorizeAliasOption =
5453 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005454 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005455 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005456 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005457
Chad Rosier136d67d2014-04-28 19:30:57 +00005458 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005459 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005460 OptSpecifier SLPVectAliasOption =
5461 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005462 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005463 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005464 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005465
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005466 // -fno-slp-vectorize-aggressive is default.
5467 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005468 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005469 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005470
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005471 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5472 A->render(Args, CmdArgs);
5473
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005474 // -fdollars-in-identifiers default varies depending on platform and
5475 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005476 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005477 options::OPT_fno_dollars_in_identifiers)) {
5478 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005479 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005480 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005481 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005482 }
5483
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005484 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5485 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005486 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005487 options::OPT_fno_unit_at_a_time)) {
5488 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005489 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005490 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005491
Eli Friedman055c9702011-11-02 01:53:16 +00005492 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5493 options::OPT_fno_apple_pragma_pack, false))
5494 CmdArgs.push_back("-fapple-pragma-pack");
5495
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005496 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005497 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5498 // by default.
Chad Rosierf662fb32016-01-26 16:16:53 +00005499 if (getToolChain().getArch() == llvm::Triple::le32) {
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005500 CmdArgs.push_back("-fno-math-builtin");
Chad Rosierf662fb32016-01-26 16:16:53 +00005501 }
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005502
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005503// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5504//
Chad Rosier38fd54e2016-01-26 15:46:29 +00005505// FIXME: Now that PR4941 has been fixed this can be enabled.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005506#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005507 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005508 (getToolChain().getArch() == llvm::Triple::arm ||
5509 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005510 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5511 CmdArgs.push_back("-fno-builtin-strcat");
5512 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5513 CmdArgs.push_back("-fno-builtin-strcpy");
5514 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005515#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005516
Justin Bognera88f0122014-06-20 22:59:50 +00005517 // Enable rewrite includes if the user's asked for it or if we're generating
5518 // diagnostics.
5519 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5520 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005521 if (Args.hasFlag(options::OPT_frewrite_includes,
5522 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005523 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005524 CmdArgs.push_back("-frewrite-includes");
5525
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005526 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005527 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005528 options::OPT_traditional_cpp)) {
5529 if (isa<PreprocessJobAction>(JA))
5530 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005531 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005532 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005533 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005534
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005535 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005536 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005537
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005538 // Handle serialized diagnostics.
5539 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5540 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005541 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005542 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005543
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005544 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5545 CmdArgs.push_back("-fretain-comments-from-system-headers");
5546
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005547 // Forward -fcomment-block-commands to -cc1.
5548 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005549 // Forward -fparse-all-comments to -cc1.
5550 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005551
John Brawnad31ace2015-09-23 13:55:40 +00005552 // Turn -fplugin=name.so into -load name.so
5553 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5554 CmdArgs.push_back("-load");
5555 CmdArgs.push_back(A->getValue());
5556 A->claim();
5557 }
5558
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005559 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5560 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005561 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005562 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5563 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005564
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005565 // We translate this by hand to the -cc1 argument, since nightly test uses
5566 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005567 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005568 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005569 } else
Sean Silva14facf32015-06-09 01:57:17 +00005570 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005571 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005572
Bob Wilson23a55f12014-12-21 07:00:00 +00005573 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005574 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5575 // by the frontend.
5576 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5577 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005578
Daniel Dunbard67a3222009-03-30 06:36:42 +00005579 if (Output.getType() == types::TY_Dependencies) {
5580 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005581 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005582 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005583 CmdArgs.push_back(Output.getFilename());
5584 } else {
5585 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005586 }
5587
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005588 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005589
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005590 if (Input.isFilename())
5591 CmdArgs.push_back(Input.getFilename());
5592 else
5593 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005594
Chris Lattnere9d7d782009-11-03 19:50:27 +00005595 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5596
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005597 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005598
5599 // Optionally embed the -cc1 level arguments into the debug info, for build
5600 // analysis.
5601 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005602 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005603 for (const auto &Arg : Args)
5604 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005605
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005606 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005607 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005608 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005609 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005610 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005611 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005612 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005613 }
5614 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005615 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005616 }
5617
Eric Christopherd3804002013-02-22 20:12:52 +00005618 // Add the split debug info name to the command lines here so we
5619 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005620 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005621 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5622 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005623 const char *SplitDwarfOut;
5624 if (SplitDwarf) {
5625 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005626 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005627 CmdArgs.push_back(SplitDwarfOut);
5628 }
5629
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005630 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5631 // Include them with -fcuda-include-gpubinary.
5632 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005633 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005634 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005635 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005636 }
5637
Eric Christopherd3804002013-02-22 20:12:52 +00005638 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005639 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005640 Output.getType() == types::TY_Object &&
5641 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005642 auto CLCommand =
5643 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005644 C.addCommand(llvm::make_unique<FallbackCommand>(
5645 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005646 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005647 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005648 }
5649
Eric Christopherf1545832013-02-22 23:50:16 +00005650 // Handle the debug info splitting at object creation time if we're
5651 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005652 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005653 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005654 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005655
Roman Divacky178e01602011-02-10 16:52:03 +00005656 if (Arg *A = Args.getLastArg(options::OPT_pg))
5657 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005658 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5659 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005660
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005661 // Claim some arguments which clang supports automatically.
5662
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005663 // -fpch-preprocess is used with gcc to add a special marker in the output to
5664 // include the PCH file. Clang's PTH solution is completely transparent, so we
5665 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005666 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005667
Daniel Dunbar17731772009-03-23 19:03:36 +00005668 // Claim some arguments which clang doesn't support, but we don't
5669 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005670 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5671 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005672
Rafael Espindolab0092d72013-09-04 19:37:35 +00005673 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005674 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005675}
5676
John McCall5fb5df92012-06-20 06:18:46 +00005677/// Add options related to the Objective-C runtime/ABI.
5678///
5679/// Returns true if the runtime is non-fragile.
5680ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5681 ArgStringList &cmdArgs,
5682 RewriteKind rewriteKind) const {
5683 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005684 Arg *runtimeArg =
5685 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5686 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005687
5688 // Just forward -fobjc-runtime= to the frontend. This supercedes
5689 // options about fragility.
5690 if (runtimeArg &&
5691 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5692 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005693 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005694 if (runtime.tryParse(value)) {
5695 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005696 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005697 }
5698
5699 runtimeArg->render(args, cmdArgs);
5700 return runtime;
5701 }
5702
5703 // Otherwise, we'll need the ABI "version". Version numbers are
5704 // slightly confusing for historical reasons:
5705 // 1 - Traditional "fragile" ABI
5706 // 2 - Non-fragile ABI, version 1
5707 // 3 - Non-fragile ABI, version 2
5708 unsigned objcABIVersion = 1;
5709 // If -fobjc-abi-version= is present, use that to set the version.
5710 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005711 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005712 if (value == "1")
5713 objcABIVersion = 1;
5714 else if (value == "2")
5715 objcABIVersion = 2;
5716 else if (value == "3")
5717 objcABIVersion = 3;
5718 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005719 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005720 } else {
5721 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005722 bool nonFragileABIIsDefault =
5723 (rewriteKind == RK_NonFragile ||
5724 (rewriteKind == RK_None &&
5725 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005726 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5727 options::OPT_fno_objc_nonfragile_abi,
5728 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005729// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005730#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5731 unsigned nonFragileABIVersion = 1;
5732#else
5733 unsigned nonFragileABIVersion = 2;
5734#endif
5735
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005736 if (Arg *abiArg =
5737 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005738 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005739 if (value == "1")
5740 nonFragileABIVersion = 1;
5741 else if (value == "2")
5742 nonFragileABIVersion = 2;
5743 else
5744 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005745 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005746 }
5747
5748 objcABIVersion = 1 + nonFragileABIVersion;
5749 } else {
5750 objcABIVersion = 1;
5751 }
5752 }
5753
5754 // We don't actually care about the ABI version other than whether
5755 // it's non-fragile.
5756 bool isNonFragile = objcABIVersion != 1;
5757
5758 // If we have no runtime argument, ask the toolchain for its default runtime.
5759 // However, the rewriter only really supports the Mac runtime, so assume that.
5760 ObjCRuntime runtime;
5761 if (!runtimeArg) {
5762 switch (rewriteKind) {
5763 case RK_None:
5764 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5765 break;
5766 case RK_Fragile:
5767 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5768 break;
5769 case RK_NonFragile:
5770 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5771 break;
5772 }
5773
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005774 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005775 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5776 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005777 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005778 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5779
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005780 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005781 } else {
5782 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5783 }
5784
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005785 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005786 } else {
5787 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
Eric Christopherbce27882015-12-28 21:57:05 +00005788 // Legacy behaviour is to target the gnustep runtime if we are in
David Chisnall314896c2012-07-04 10:37:03 +00005789 // non-fragile mode or the GCC runtime in fragile mode.
5790 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005791 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005792 else
5793 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005794 }
5795
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005796 cmdArgs.push_back(
5797 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005798 return runtime;
5799}
5800
Reid Klecknerc542d372014-06-27 17:02:02 +00005801static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5802 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5803 I += HaveDash;
5804 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005805}
Reid Klecknerc542d372014-06-27 17:02:02 +00005806
Benjamin Kramere003ca22015-10-28 13:54:16 +00005807namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005808struct EHFlags {
David Majnemerb8809092016-02-20 09:23:44 +00005809 bool Synch = false;
5810 bool Asynch = false;
5811 bool NoUnwindC = false;
Reid Klecknerc542d372014-06-27 17:02:02 +00005812};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005813} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005814
5815/// /EH controls whether to run destructor cleanups when exceptions are
5816/// thrown. There are three modifiers:
5817/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5818/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5819/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
David Majnemer960813e2016-02-20 09:23:47 +00005820/// - c: Assume that extern "C" functions are implicitly nounwind.
Reid Klecknerc542d372014-06-27 17:02:02 +00005821/// The default is /EHs-c-, meaning cleanups are disabled.
5822static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5823 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005824
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005825 std::vector<std::string> EHArgs =
5826 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005827 for (auto EHVal : EHArgs) {
5828 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5829 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005830 case 'a':
5831 EH.Asynch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005832 if (EH.Asynch)
5833 EH.Synch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005834 continue;
5835 case 'c':
David Majnemerb8809092016-02-20 09:23:44 +00005836 EH.NoUnwindC = maybeConsumeDash(EHVal, I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005837 continue;
5838 case 's':
5839 EH.Synch = maybeConsumeDash(EHVal, I);
David Majnemer387fccd2016-02-29 01:40:30 +00005840 if (EH.Synch)
5841 EH.Asynch = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005842 continue;
5843 default:
5844 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005845 }
5846 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5847 break;
5848 }
5849 }
David Majnemerb8809092016-02-20 09:23:44 +00005850 // The /GX, /GX- flags are only processed if there are not /EH flags.
David Majnemera7bdc5a2016-02-22 17:44:51 +00005851 // The default is that /GX is not specified.
David Majnemerb8809092016-02-20 09:23:44 +00005852 if (EHArgs.empty() &&
David Majnemera7bdc5a2016-02-22 17:44:51 +00005853 Args.hasFlag(options::OPT__SLASH_GX, options::OPT__SLASH_GX_,
5854 /*default=*/false)) {
David Majnemerb8809092016-02-20 09:23:44 +00005855 EH.Synch = true;
5856 EH.NoUnwindC = true;
5857 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005858
Reid Klecknerc542d372014-06-27 17:02:02 +00005859 return EH;
5860}
5861
David Majnemercd5855e2016-02-29 01:40:36 +00005862void Clang::AddClangCLArgs(const ArgList &Args, types::ID InputType,
5863 ArgStringList &CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00005864 codegenoptions::DebugInfoKind *DebugInfoKind,
Douglas Katzman3459ce22015-10-08 04:24:12 +00005865 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005866 unsigned RTOptionID = options::OPT__SLASH_MT;
5867
Hans Wennborgf1a74252013-09-10 20:18:04 +00005868 if (Args.hasArg(options::OPT__SLASH_LDd))
5869 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5870 // but defining _DEBUG is sticky.
5871 RTOptionID = options::OPT__SLASH_MTd;
5872
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005873 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005874 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005875
David Majnemere2afb472015-07-24 06:49:13 +00005876 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005877 switch (RTOptionID) {
5878 case options::OPT__SLASH_MD:
5879 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005880 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005881 CmdArgs.push_back("-D_MT");
5882 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005883 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005884 break;
5885 case options::OPT__SLASH_MDd:
5886 CmdArgs.push_back("-D_DEBUG");
5887 CmdArgs.push_back("-D_MT");
5888 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005889 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005890 break;
5891 case options::OPT__SLASH_MT:
5892 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005893 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005894 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005895 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005896 break;
5897 case options::OPT__SLASH_MTd:
5898 CmdArgs.push_back("-D_DEBUG");
5899 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005900 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005901 break;
5902 default:
5903 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005904 }
5905
David Majnemere2afb472015-07-24 06:49:13 +00005906 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5907 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5908 } else {
5909 CmdArgs.push_back(FlagForCRT.data());
5910
5911 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5912 // users want. The /Za flag to cl.exe turns this off, but it's not
5913 // implemented in clang.
5914 CmdArgs.push_back("--dependent-lib=oldnames");
5915 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005916
Hans Wennborg8858a032014-07-21 23:42:07 +00005917 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5918 // would produce interleaved output, so ignore /showIncludes in such cases.
5919 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5920 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5921 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005922
David Majnemerf6072342014-07-01 22:24:56 +00005923 // This controls whether or not we emit RTTI data for polymorphic types.
5924 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5925 /*default=*/false))
5926 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005927
Reid Kleckner124955a2015-08-05 18:51:13 +00005928 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005929 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner9ce06a4a2016-02-10 21:28:38 +00005930 if (*EmitCodeView)
5931 *DebugInfoKind = codegenoptions::LimitedDebugInfo;
Douglas Katzman3459ce22015-10-08 04:24:12 +00005932 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005933 CmdArgs.push_back("-gcodeview");
5934
Reid Klecknerc542d372014-06-27 17:02:02 +00005935 const Driver &D = getToolChain().getDriver();
5936 EHFlags EH = parseClangCLEHFlags(D, Args);
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005937 if (EH.Synch || EH.Asynch) {
David Majnemercd5855e2016-02-29 01:40:36 +00005938 if (types::isCXX(InputType))
5939 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005940 CmdArgs.push_back("-fexceptions");
5941 }
David Majnemercd5855e2016-02-29 01:40:36 +00005942 if (types::isCXX(InputType) && EH.Synch && EH.NoUnwindC)
5943 CmdArgs.push_back("-fexternc-nounwind");
Reid Klecknerc542d372014-06-27 17:02:02 +00005944
Hans Wennborge50cec32014-06-13 20:59:54 +00005945 // /EP should expand to -E -P.
5946 if (Args.hasArg(options::OPT__SLASH_EP)) {
5947 CmdArgs.push_back("-E");
5948 CmdArgs.push_back("-P");
5949 }
5950
David Majnemera5b195a2015-02-14 01:35:12 +00005951 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005952 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5953 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005954 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5955 else
5956 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5957
5958 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5959 VolatileOptionID = A->getOption().getID();
5960
5961 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5962 CmdArgs.push_back("-fms-volatile");
5963
David Majnemer86c318f2014-02-11 21:05:00 +00005964 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5965 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5966 if (MostGeneralArg && BestCaseArg)
5967 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5968 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5969
5970 if (MostGeneralArg) {
5971 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5972 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5973 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5974
5975 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5976 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5977 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5978 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5979 << FirstConflict->getAsString(Args)
5980 << SecondConflict->getAsString(Args);
5981
5982 if (SingleArg)
5983 CmdArgs.push_back("-fms-memptr-rep=single");
5984 else if (MultipleArg)
5985 CmdArgs.push_back("-fms-memptr-rep=multiple");
5986 else
5987 CmdArgs.push_back("-fms-memptr-rep=virtual");
5988 }
5989
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005990 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5991 A->render(Args, CmdArgs);
5992
Hans Wennborg81f74482013-09-10 01:07:07 +00005993 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5994 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005995 if (Args.hasArg(options::OPT__SLASH_fallback))
5996 CmdArgs.push_back("msvc-fallback");
5997 else
5998 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005999 }
Hans Wennborg75958c42013-08-08 00:17:41 +00006000}
6001
Douglas Katzman95354292015-06-23 20:42:09 +00006002visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00006003 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00006004 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00006005 return CLFallback.get();
6006}
6007
Daniel Sanders7f933f42015-01-30 17:35:23 +00006008void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
6009 ArgStringList &CmdArgs) const {
6010 StringRef CPUName;
6011 StringRef ABIName;
6012 const llvm::Triple &Triple = getToolChain().getTriple();
6013 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
6014
6015 CmdArgs.push_back("-target-abi");
6016 CmdArgs.push_back(ABIName.data());
6017}
6018
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006019void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006020 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006021 const ArgList &Args,
6022 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006023 ArgStringList CmdArgs;
6024
6025 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6026 const InputInfo &Input = Inputs[0];
6027
James Y Knight2db38f32015-08-15 03:45:25 +00006028 std::string TripleStr =
6029 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
6030 const llvm::Triple Triple(TripleStr);
6031
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006032 // Don't warn about "clang -w -c foo.s"
6033 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00006034 // and "clang -emit-llvm -c foo.s"
6035 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00006036
Rafael Espindola577637a2015-01-03 00:06:04 +00006037 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00006038
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006039 // Invoke ourselves in -cc1as mode.
6040 //
6041 // FIXME: Implement custom jobs for internal actions.
6042 CmdArgs.push_back("-cc1as");
6043
6044 // Add the "effective" target triple.
6045 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006046 CmdArgs.push_back(Args.MakeArgString(TripleStr));
6047
6048 // Set the output mode, we currently only expect to be used as a real
6049 // assembler.
6050 CmdArgs.push_back("-filetype");
6051 CmdArgs.push_back("obj");
6052
Eric Christopher45f2e712012-12-18 00:31:10 +00006053 // Set the main file name, so that debug info works even with
6054 // -save-temps or preprocessed assembly.
6055 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00006056 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00006057
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006058 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00006059 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006060 if (!CPU.empty()) {
6061 CmdArgs.push_back("-target-cpu");
6062 CmdArgs.push_back(Args.MakeArgString(CPU));
6063 }
6064
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00006065 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00006066 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00006067
Daniel Dunbar1d733e22011-03-17 17:37:29 +00006068 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006069 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006070
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00006071 // Pass along any -I options so we get proper .include search paths.
6072 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
6073
Eric Christopherfc3ee562012-01-10 00:38:01 +00006074 // Determine the original source input.
6075 const Action *SourceAction = &JA;
6076 while (SourceAction->getKind() != Action::InputClass) {
6077 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6078 SourceAction = SourceAction->getInputs()[0];
6079 }
6080
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006081 // Forward -g and handle debug info related flags, assuming we are dealing
6082 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00006083 if (SourceAction->getType() == types::TY_Asm ||
6084 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00006085 bool WantDebug = false;
6086 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00006087 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00006088 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Paul Robinson0334a042015-12-19 19:41:48 +00006089 WantDebug = !A->getOption().matches(options::OPT_g0) &&
6090 !A->getOption().matches(options::OPT_ggdb0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00006091 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00006092 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00006093 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00006094 if (DwarfVersion == 0)
6095 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00006096 RenderDebugEnablingArgs(Args, CmdArgs,
Benjamin Kramer8c305922016-02-02 11:06:51 +00006097 (WantDebug ? codegenoptions::LimitedDebugInfo
6098 : codegenoptions::NoDebugInfo),
Paul Robinson0334a042015-12-19 19:41:48 +00006099 DwarfVersion, llvm::DebuggerKind::Default);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00006100
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00006101 // Add the -fdebug-compilation-dir flag if needed.
6102 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00006103
6104 // Set the AT_producer to the clang version when using the integrated
6105 // assembler on assembly source files.
6106 CmdArgs.push_back("-dwarf-debug-producer");
6107 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00006108
6109 // And pass along -I options
6110 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00006111 }
Kevin Enderby292dc082011-12-22 19:31:58 +00006112
James Y Knight5bdf7ab2015-08-19 15:12:02 +00006113 // Handle -fPIC et al -- the relocation-model affects the assembler
6114 // for some targets.
6115 llvm::Reloc::Model RelocationModel;
6116 unsigned PICLevel;
6117 bool IsPIE;
6118 std::tie(RelocationModel, PICLevel, IsPIE) =
6119 ParsePICArgs(getToolChain(), Triple, Args);
6120
6121 const char *RMName = RelocationModelName(RelocationModel);
6122 if (RMName) {
6123 CmdArgs.push_back("-mrelocation-model");
6124 CmdArgs.push_back(RMName);
6125 }
6126
Kevin Enderby292dc082011-12-22 19:31:58 +00006127 // Optionally embed the -cc1as level arguments into the debug info, for build
6128 // analysis.
6129 if (getToolChain().UseDwarfDebugFlags()) {
6130 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006131 for (const auto &Arg : Args)
6132 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00006133
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00006134 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00006135 const char *Exec = getToolChain().getDriver().getClangProgramPath();
6136 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006137 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006138 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00006139 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00006140 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00006141 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00006142 }
6143 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00006144 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00006145 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006146
6147 // FIXME: Add -static support, once we have it.
6148
Daniel Sanders7f933f42015-01-30 17:35:23 +00006149 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006150 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00006151 default:
6152 break;
6153
6154 case llvm::Triple::mips:
6155 case llvm::Triple::mipsel:
6156 case llvm::Triple::mips64:
6157 case llvm::Triple::mips64el:
6158 AddMIPSTargetArgs(Args, CmdArgs);
6159 break;
6160 }
6161
David Blaikie372d9502014-01-17 03:17:40 +00006162 // Consume all the warning flags. Usually this would be handled more
6163 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
6164 // doesn't handle that so rather than warning about unused flags that are
6165 // actually used, we'll lie by omission instead.
6166 // FIXME: Stop lying and consume only the appropriate driver flags
Eric Christopher5d1caa52016-01-07 02:00:55 +00006167 Args.ClaimAllArgs(options::OPT_W_Group);
David Blaikie372d9502014-01-17 03:17:40 +00006168
David Blaikie9260ed62013-07-25 21:19:01 +00006169 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
6170 getToolChain().getDriver());
6171
Daniel Dunbar252e8f92011-04-29 17:53:18 +00006172 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006173
6174 assert(Output.isFilename() && "Unexpected lipo output.");
6175 CmdArgs.push_back("-o");
6176 CmdArgs.push_back(Output.getFilename());
6177
Daniel Dunbarb440f562010-08-02 02:38:21 +00006178 assert(Input.isFilename() && "Invalid input.");
6179 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006180
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00006181 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00006182 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00006183
6184 // Handle the debug info splitting at object creation time if we're
6185 // creating an object.
6186 // TODO: Currently only works on linux with newer objcopy.
6187 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006188 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00006189 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00006190 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00006191}
6192
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006193void GnuTool::anchor() {}
6194
Daniel Dunbara3246a02009-03-18 08:07:30 +00006195void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006196 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006197 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00006198 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006199 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00006200 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006201
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006202 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00006203 if (forwardToGCC(A->getOption())) {
Eric Christopher3f07d852016-01-07 09:03:42 +00006204 // It is unfortunate that we have to claim here, as this means
6205 // we will basically never report anything interesting for
6206 // platforms using a generic gcc, even if we are just using gcc
6207 // to get to the assembler.
6208 A->claim();
6209
Daniel Dunbar939c1212010-08-03 16:14:14 +00006210 // Don't forward any -g arguments to assembly steps.
6211 if (isa<AssembleJobAction>(JA) &&
6212 A->getOption().matches(options::OPT_g_Group))
6213 continue;
6214
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00006215 // Don't forward any -W arguments to assembly and link steps.
6216 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
6217 A->getOption().matches(options::OPT_W_Group))
6218 continue;
6219
Daniel Dunbara2aedc62009-03-18 10:01:51 +00006220 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00006221 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006222 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006223
Daniel Dunbar4e295052010-01-25 22:35:08 +00006224 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006225
6226 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006227 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006228 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00006229 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006230 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00006231 }
6232
Daniel Dunbar5716d872009-05-02 21:41:52 +00006233 // Try to force gcc to match the tool chain we want, if we recognize
6234 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00006235 //
6236 // FIXME: The triple class should directly provide the information we want
6237 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00006238 switch (getToolChain().getArch()) {
6239 default:
6240 break;
6241 case llvm::Triple::x86:
6242 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006243 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00006244 break;
6245 case llvm::Triple::x86_64:
6246 case llvm::Triple::ppc64:
6247 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00006248 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00006249 break;
6250 case llvm::Triple::sparcel:
6251 CmdArgs.push_back("-EL");
6252 break;
6253 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00006254
Daniel Dunbarb440f562010-08-02 02:38:21 +00006255 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006256 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006257 CmdArgs.push_back(Output.getFilename());
6258 } else {
6259 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00006260 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006261 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006262
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006263 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00006264
6265 // Only pass -x if gcc will understand it; otherwise hope gcc
6266 // understands the suffix correctly. The main use case this would go
6267 // wrong in is for linker inputs if they happened to have an odd
6268 // suffix; really the only way to get this to happen is a command
6269 // like '-x foobar a.c' which will treat a.c like a linker input.
6270 //
6271 // FIXME: For the linker case specifically, can we safely convert
6272 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006273 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006274 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006275 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006276 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006277 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00006278 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006279 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006280 else if (II.getType() == types::TY_ModuleFile)
6281 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006282 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006283
Daniel Dunbara3246a02009-03-18 08:07:30 +00006284 if (types::canTypeBeUserSpecified(II.getType())) {
6285 CmdArgs.push_back("-x");
6286 CmdArgs.push_back(types::getTypeName(II.getType()));
6287 }
6288
Daniel Dunbarb440f562010-08-02 02:38:21 +00006289 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006290 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00006291 else {
6292 const Arg &A = II.getInputArg();
6293
6294 // Reverse translate some rewritten options.
6295 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
6296 CmdArgs.push_back("-lstdc++");
6297 continue;
6298 }
6299
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00006300 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006301 A.render(Args, CmdArgs);
6302 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006303 }
6304
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006305 const std::string customGCCName = D.getCCCGenericGCCName();
6306 const char *GCCName;
6307 if (!customGCCName.empty())
6308 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006309 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006310 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006311 } else
6312 GCCName = "gcc";
6313
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006314 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006315 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006316}
6317
Douglas Katzman95354292015-06-23 20:42:09 +00006318void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6319 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006320 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006321}
6322
Douglas Katzman95354292015-06-23 20:42:09 +00006323void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6324 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006325 const Driver &D = getToolChain().getDriver();
6326
Eric Christophercc7ff502015-01-29 00:56:17 +00006327 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006328 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006329 case types::TY_LLVM_IR:
6330 case types::TY_LTO_IR:
6331 case types::TY_LLVM_BC:
6332 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006333 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006334 break;
Eric Christopher29a50bc2016-01-06 07:24:45 +00006335 // We assume we've got an "integrated" assembler in that gcc will produce an
6336 // object file itself.
6337 case types::TY_Object:
6338 CmdArgs.push_back("-c");
6339 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006340 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006341 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006342 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006343 case types::TY_Nothing:
6344 CmdArgs.push_back("-fsyntax-only");
6345 break;
6346 default:
6347 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006348 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006349}
6350
Douglas Katzman95354292015-06-23 20:42:09 +00006351void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6352 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006353 // The types are (hopefully) good enough.
6354}
6355
Tony Linthicum76329bf2011-12-12 21:14:55 +00006356// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006357void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006358 ArgStringList &CmdArgs) const {
6359}
6360
Douglas Katzman95354292015-06-23 20:42:09 +00006361void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6362 const InputInfo &Output,
6363 const InputInfoList &Inputs,
6364 const ArgList &Args,
6365 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006366 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006367
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006368 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
6369 const Driver &D = HTC.getDriver();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006370 ArgStringList CmdArgs;
6371
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006372 std::string MArchString = "-march=hexagon";
6373 CmdArgs.push_back(Args.MakeArgString(MArchString));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006374
6375 RenderExtraToolArgs(JA, CmdArgs);
6376
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006377 std::string AsName = "hexagon-llvm-mc";
6378 std::string MCpuString = "-mcpu=hexagon" +
6379 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6380 CmdArgs.push_back("-filetype=obj");
6381 CmdArgs.push_back(Args.MakeArgString(MCpuString));
6382
Tony Linthicum76329bf2011-12-12 21:14:55 +00006383 if (Output.isFilename()) {
6384 CmdArgs.push_back("-o");
6385 CmdArgs.push_back(Output.getFilename());
6386 } else {
6387 assert(Output.isNothing() && "Unexpected output");
6388 CmdArgs.push_back("-fsyntax-only");
6389 }
6390
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006391 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6392 std::string N = llvm::utostr(G.getValue());
6393 CmdArgs.push_back(Args.MakeArgString(std::string("-gpsize=") + N));
6394 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006395
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006396 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006397
Tony Linthicum76329bf2011-12-12 21:14:55 +00006398 // Only pass -x if gcc will understand it; otherwise hope gcc
6399 // understands the suffix correctly. The main use case this would go
6400 // wrong in is for linker inputs if they happened to have an odd
6401 // suffix; really the only way to get this to happen is a command
6402 // like '-x foobar a.c' which will treat a.c like a linker input.
6403 //
6404 // FIXME: For the linker case specifically, can we safely convert
6405 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006406 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006407 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006408 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006409 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006410 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006411 else if (II.getType() == types::TY_AST)
6412 D.Diag(clang::diag::err_drv_no_ast_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006413 << HTC.getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006414 else if (II.getType() == types::TY_ModuleFile)
6415 D.Diag(diag::err_drv_no_module_support)
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006416 << HTC.getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006417
6418 if (II.isFilename())
6419 CmdArgs.push_back(II.getFilename());
6420 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006421 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006422 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006423 II.getInputArg().render(Args, CmdArgs);
6424 }
6425
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006426 auto *Exec = Args.MakeArgString(HTC.GetProgramPath(AsName.c_str()));
Justin Bognerd3371d82015-07-17 03:35:54 +00006427 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006428}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006429
Douglas Katzman95354292015-06-23 20:42:09 +00006430void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6431 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006432}
6433
Douglas Katzman54366072015-07-27 16:53:08 +00006434static void
6435constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006436 const toolchains::HexagonToolChain &HTC,
Douglas Katzman54366072015-07-27 16:53:08 +00006437 const InputInfo &Output, const InputInfoList &Inputs,
6438 const ArgList &Args, ArgStringList &CmdArgs,
6439 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006440
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006441 const Driver &D = HTC.getDriver();
Matthew Curtise689b052012-12-06 15:46:07 +00006442
Matthew Curtise689b052012-12-06 15:46:07 +00006443 //----------------------------------------------------------------------------
6444 //
6445 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006446 bool IsStatic = Args.hasArg(options::OPT_static);
6447 bool IsShared = Args.hasArg(options::OPT_shared);
6448 bool IsPIE = Args.hasArg(options::OPT_pie);
6449 bool IncStdLib = !Args.hasArg(options::OPT_nostdlib);
6450 bool IncStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6451 bool IncDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
6452 bool UseG0 = false;
6453 bool UseShared = IsShared && !IsStatic;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006454
Matthew Curtise689b052012-12-06 15:46:07 +00006455 //----------------------------------------------------------------------------
6456 // Silence warnings for various options
6457 //----------------------------------------------------------------------------
Matthew Curtise689b052012-12-06 15:46:07 +00006458 Args.ClaimAllArgs(options::OPT_g_Group);
6459 Args.ClaimAllArgs(options::OPT_emit_llvm);
6460 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6461 // handled somewhere else.
6462 Args.ClaimAllArgs(options::OPT_static_libgcc);
6463
6464 //----------------------------------------------------------------------------
6465 //
6466 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006467 if (Args.hasArg(options::OPT_s))
6468 CmdArgs.push_back("-s");
6469
6470 if (Args.hasArg(options::OPT_r))
6471 CmdArgs.push_back("-r");
6472
6473 for (const auto &Opt : HTC.ExtraOpts)
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006474 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006475
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006476 CmdArgs.push_back("-march=hexagon");
6477 std::string CpuVer =
6478 toolchains::HexagonToolChain::GetTargetCPUVersion(Args).str();
6479 std::string MCpuString = "-mcpu=hexagon" + CpuVer;
6480 CmdArgs.push_back(Args.MakeArgString(MCpuString));
Sebastian Pop86500282012-01-13 20:37:10 +00006481
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006482 if (IsShared) {
Matthew Curtise689b052012-12-06 15:46:07 +00006483 CmdArgs.push_back("-shared");
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006484 // The following should be the default, but doing as hexagon-gcc does.
6485 CmdArgs.push_back("-call_shared");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006486 }
6487
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006488 if (IsStatic)
Matthew Curtise689b052012-12-06 15:46:07 +00006489 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006490
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006491 if (IsPIE && !IsShared)
Matthew Curtise8f80a12012-12-06 17:49:03 +00006492 CmdArgs.push_back("-pie");
6493
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006494 if (auto G = toolchains::HexagonToolChain::getSmallDataThreshold(Args)) {
6495 std::string N = llvm::utostr(G.getValue());
6496 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + N));
6497 UseG0 = G.getValue() == 0;
Matthew Curtise8f80a12012-12-06 17:49:03 +00006498 }
6499
Matthew Curtise689b052012-12-06 15:46:07 +00006500 //----------------------------------------------------------------------------
6501 //
6502 //----------------------------------------------------------------------------
6503 CmdArgs.push_back("-o");
6504 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006505
Matthew Curtise689b052012-12-06 15:46:07 +00006506 //----------------------------------------------------------------------------
6507 // moslib
6508 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006509 std::vector<std::string> OsLibs;
6510 bool HasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006511
Sean Silva14facf32015-06-09 01:57:17 +00006512 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6513 A->claim();
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006514 OsLibs.emplace_back(A->getValue());
6515 HasStandalone = HasStandalone || (OsLibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006516 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006517 if (OsLibs.empty()) {
6518 OsLibs.push_back("standalone");
6519 HasStandalone = true;
Matthew Curtise689b052012-12-06 15:46:07 +00006520 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006521
Matthew Curtise689b052012-12-06 15:46:07 +00006522 //----------------------------------------------------------------------------
6523 // Start Files
6524 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006525 const std::string MCpuSuffix = "/" + CpuVer;
6526 const std::string MCpuG0Suffix = MCpuSuffix + "/G0";
6527 const std::string RootDir =
6528 HTC.getHexagonTargetDir(D.InstalledDir, D.PrefixDirs) + "/";
6529 const std::string StartSubDir =
6530 "hexagon/lib" + (UseG0 ? MCpuG0Suffix : MCpuSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006531
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006532 auto Find = [&HTC] (const std::string &RootDir, const std::string &SubDir,
6533 const char *Name) -> std::string {
6534 std::string RelName = SubDir + Name;
6535 std::string P = HTC.GetFilePath(RelName.c_str());
6536 if (llvm::sys::fs::exists(P))
6537 return P;
6538 return RootDir + RelName;
6539 };
6540
6541 if (IncStdLib && IncStartFiles) {
6542 if (!IsShared) {
6543 if (HasStandalone) {
6544 std::string Crt0SA = Find(RootDir, StartSubDir, "/crt0_standalone.o");
6545 CmdArgs.push_back(Args.MakeArgString(Crt0SA));
Matthew Curtise689b052012-12-06 15:46:07 +00006546 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006547 std::string Crt0 = Find(RootDir, StartSubDir, "/crt0.o");
6548 CmdArgs.push_back(Args.MakeArgString(Crt0));
Matthew Curtise689b052012-12-06 15:46:07 +00006549 }
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006550 std::string Init = UseShared
6551 ? Find(RootDir, StartSubDir + "/pic", "/initS.o")
6552 : Find(RootDir, StartSubDir, "/init.o");
6553 CmdArgs.push_back(Args.MakeArgString(Init));
Matthew Curtise689b052012-12-06 15:46:07 +00006554 }
6555
6556 //----------------------------------------------------------------------------
6557 // Library Search Paths
6558 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006559 const ToolChain::path_list &LibPaths = HTC.getFilePaths();
6560 for (const auto &LibPath : LibPaths)
6561 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00006562
6563 //----------------------------------------------------------------------------
6564 //
6565 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006566 Args.AddAllArgs(CmdArgs,
6567 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6568 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006569
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006570 AddLinkerInputs(HTC, Inputs, Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006571
6572 //----------------------------------------------------------------------------
6573 // Libraries
6574 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006575 if (IncStdLib && IncDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006576 if (D.CCCIsCXX()) {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006577 HTC.AddCXXStdlibLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006578 CmdArgs.push_back("-lm");
6579 }
6580
6581 CmdArgs.push_back("--start-group");
6582
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006583 if (!IsShared) {
6584 for (const std::string &Lib : OsLibs)
Douglas Katzman2675d012015-06-29 19:12:56 +00006585 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006586 CmdArgs.push_back("-lc");
6587 }
6588 CmdArgs.push_back("-lgcc");
6589
6590 CmdArgs.push_back("--end-group");
6591 }
6592
6593 //----------------------------------------------------------------------------
6594 // End files
6595 //----------------------------------------------------------------------------
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006596 if (IncStdLib && IncStartFiles) {
6597 std::string Fini = UseShared
6598 ? Find(RootDir, StartSubDir + "/pic", "/finiS.o")
6599 : Find(RootDir, StartSubDir, "/fini.o");
6600 CmdArgs.push_back(Args.MakeArgString(Fini));
Matthew Curtise689b052012-12-06 15:46:07 +00006601 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006602}
6603
Douglas Katzman95354292015-06-23 20:42:09 +00006604void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6605 const InputInfo &Output,
6606 const InputInfoList &Inputs,
6607 const ArgList &Args,
6608 const char *LinkingOutput) const {
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006609 auto &HTC = static_cast<const toolchains::HexagonToolChain&>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006610
6611 ArgStringList CmdArgs;
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006612 constructHexagonLinkArgs(C, JA, HTC, Output, Inputs, Args, CmdArgs,
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006613 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006614
Krzysztof Parzyszek1e6e3c62015-12-14 15:03:57 +00006615 std::string Linker = HTC.GetProgramPath("hexagon-link");
David Blaikiec11bf802014-09-04 16:04:28 +00006616 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006617 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006618}
6619// Hexagon tools end.
6620
Tom Stellard8fa33092015-07-18 01:49:05 +00006621void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6622 const InputInfo &Output,
6623 const InputInfoList &Inputs,
6624 const ArgList &Args,
6625 const char *LinkingOutput) const {
6626
6627 std::string Linker = getToolChain().GetProgramPath(getShortName());
6628 ArgStringList CmdArgs;
Tom Stellard8fa33092015-07-18 01:49:05 +00006629 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6630 CmdArgs.push_back("-o");
6631 CmdArgs.push_back(Output.getFilename());
6632 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6633 CmdArgs, Inputs));
6634}
6635// AMDGPU tools end.
6636
Dan Gohman52816862015-12-16 23:30:41 +00006637wasm::Linker::Linker(const ToolChain &TC)
6638 : GnuTool("wasm::Linker", "lld", TC) {}
6639
6640bool wasm::Linker::isLinkJob() const {
6641 return true;
6642}
6643
6644bool wasm::Linker::hasIntegratedCPP() const {
6645 return false;
6646}
6647
6648void wasm::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6649 const InputInfo &Output,
6650 const InputInfoList &Inputs,
6651 const ArgList &Args,
6652 const char *LinkingOutput) const {
Dan Gohman57b62c52016-02-22 19:26:15 +00006653
6654 const ToolChain &ToolChain = getToolChain();
6655 const Driver &D = ToolChain.getDriver();
6656 const char *Linker = Args.MakeArgString(ToolChain.GetLinkerPath());
Dan Gohman52816862015-12-16 23:30:41 +00006657 ArgStringList CmdArgs;
6658 CmdArgs.push_back("-flavor");
6659 CmdArgs.push_back("ld");
Dan Gohman1aa58282016-01-06 19:43:32 +00006660
6661 // Enable garbage collection of unused input sections by default, since code
Dan Gohmana5b804b2016-01-07 00:50:27 +00006662 // size is of particular importance. This is significantly facilitated by
6663 // the enabling of -ffunction-sections and -fdata-sections in
6664 // Clang::ConstructJob.
Dan Gohman4e480202016-01-07 00:32:04 +00006665 if (areOptimizationsEnabled(Args))
6666 CmdArgs.push_back("--gc-sections");
Dan Gohman1aa58282016-01-06 19:43:32 +00006667
Dan Gohman57b62c52016-02-22 19:26:15 +00006668 if (Args.hasArg(options::OPT_rdynamic))
6669 CmdArgs.push_back("-export-dynamic");
6670 if (Args.hasArg(options::OPT_s))
6671 CmdArgs.push_back("--strip-all");
6672 if (Args.hasArg(options::OPT_shared))
6673 CmdArgs.push_back("-shared");
6674 if (Args.hasArg(options::OPT_static))
6675 CmdArgs.push_back("-Bstatic");
6676
6677 Args.AddAllArgs(CmdArgs, options::OPT_L);
6678 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
6679
6680 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
6681 if (Args.hasArg(options::OPT_shared))
6682 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("rcrt1.o")));
6683 else if (Args.hasArg(options::OPT_pie))
6684 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("Scrt1.o")));
6685 else
6686 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
6687
6688 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6689 }
6690
6691 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6692
6693 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
6694 if (D.CCCIsCXX())
6695 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6696
6697 if (Args.hasArg(options::OPT_pthread))
6698 CmdArgs.push_back("-lpthread");
6699
6700 CmdArgs.push_back("-lc");
6701 CmdArgs.push_back("-lcompiler_rt");
6702 }
6703
6704 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
6705 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
6706
Dan Gohman52816862015-12-16 23:30:41 +00006707 CmdArgs.push_back("-o");
6708 CmdArgs.push_back(Output.getFilename());
Dan Gohman57b62c52016-02-22 19:26:15 +00006709
Dan Gohman52816862015-12-16 23:30:41 +00006710 C.addCommand(llvm::make_unique<Command>(JA, *this, Linker, CmdArgs, Inputs));
6711}
6712
Renato Golin7c542b42015-07-27 23:44:45 +00006713const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006714 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006715 if (!Arch.empty())
6716 MArch = Arch;
6717 else
Bernard Ogden31561762013-12-12 13:27:11 +00006718 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006719 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006720
6721 // Handle -march=native.
6722 if (MArch == "native") {
6723 std::string CPU = llvm::sys::getHostCPUName();
6724 if (CPU != "generic") {
6725 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006726 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006727 // If there is no valid architecture suffix for this CPU we don't know how
6728 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006729 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006730 MArch = "";
6731 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006732 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006733 }
6734 }
6735
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006736 return MArch;
6737}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006738
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006739/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006740StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006741 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006742 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6743 // here means an -march=native that we can't handle, so instead return no CPU.
6744 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006745 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006746
John Brawna95c1a82015-05-08 12:52:18 +00006747 // We need to return an empty string here on invalid MArch values as the
6748 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006749 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006750}
6751
6752/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006753std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006754 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006755 // FIXME: Warn on inconsistent use of -mcpu and -march.
6756 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006757 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006758 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006759 // Handle -mcpu=native.
6760 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006761 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006762 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006763 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006764 }
6765
Renato Goline17c5802015-07-27 23:44:42 +00006766 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006767}
6768
6769/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006770/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006771// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006772StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6773 const llvm::Triple &Triple) {
6774 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006775 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006776 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006777 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006778 if (ArchKind == llvm::ARM::AK_INVALID)
6779 // In case of generic Arch, i.e. "arm",
6780 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006781 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006782 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006783 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6784 // armv7k triple if it's actually been specified via "-arch armv7k".
6785 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006786 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006787 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006788 }
Renato Golin3c007252015-05-28 15:05:53 +00006789 if (ArchKind == llvm::ARM::AK_INVALID)
6790 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006791 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006792}
6793
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006794void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006795 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006796 if (Args.hasArg(options::OPT_r))
6797 return;
6798
John Brawn94fd9632015-05-21 12:19:49 +00006799 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6800 // to generate BE-8 executables.
6801 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6802 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006803}
6804
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006805mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006806 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6807 // was first introduced in Release 3. However, other compilers have
6808 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006809 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6810 .Case("mips1", NanLegacy)
6811 .Case("mips2", NanLegacy)
6812 .Case("mips3", NanLegacy)
6813 .Case("mips4", NanLegacy)
6814 .Case("mips5", NanLegacy)
6815 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006816 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006817 .Case("mips32r3", NanLegacy | Nan2008)
6818 .Case("mips32r5", NanLegacy | Nan2008)
6819 .Case("mips32r6", Nan2008)
6820 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006821 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006822 .Case("mips64r3", NanLegacy | Nan2008)
6823 .Case("mips64r5", NanLegacy | Nan2008)
6824 .Case("mips64r6", Nan2008)
6825 .Default(NanLegacy);
6826}
6827
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006828bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6829 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6830 return A && (A->getValue() == StringRef(Value));
6831}
6832
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006833bool mips::isUCLibc(const ArgList &Args) {
6834 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006835 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006836}
6837
Daniel Sanders2bf13662014-07-10 14:40:57 +00006838bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006839 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6840 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006841 .Case("2008", true)
6842 .Case("legacy", false)
6843 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006844
6845 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006846 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006847 .Cases("mips32r6", "mips64r6", true)
6848 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006849
6850 return false;
6851}
6852
Daniel Sanders379d44b2014-07-16 11:52:23 +00006853bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006854 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006855 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006856 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006857 return false;
6858
6859 if (ABIName != "32")
6860 return false;
6861
Toma Tabacu94ea6862015-06-16 13:54:13 +00006862 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6863 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006864 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006865 return false;
6866
Daniel Sanders379d44b2014-07-16 11:52:23 +00006867 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006868 .Cases("mips2", "mips3", "mips4", "mips5", true)
6869 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6870 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6871 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006872}
6873
Toma Tabacu94ea6862015-06-16 13:54:13 +00006874bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6875 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006876 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006877 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6878
6879 // FPXX shouldn't be used if -msingle-float is present.
6880 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6881 options::OPT_mdouble_float))
6882 if (A->getOption().matches(options::OPT_msingle_float))
6883 UseFPXX = false;
6884
6885 return UseFPXX;
6886}
6887
Tim Northover157d9112014-01-16 08:48:16 +00006888llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006889 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6890 // archs which Darwin doesn't use.
6891
6892 // The matching this routine does is fairly pointless, since it is neither the
6893 // complete architecture list, nor a reasonable subset. The problem is that
6894 // historically the driver driver accepts this and also ties its -march=
6895 // handling to the architecture name, so we need to be careful before removing
6896 // support for it.
6897
6898 // This code must be kept in sync with Clang's Darwin specific argument
6899 // translation.
6900
6901 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006902 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6903 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6904 .Case("ppc64", llvm::Triple::ppc64)
6905 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6906 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6907 llvm::Triple::x86)
6908 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6909 // This is derived from the driver driver.
6910 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6911 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6912 .Cases("armv7s", "xscale", llvm::Triple::arm)
6913 .Case("arm64", llvm::Triple::aarch64)
6914 .Case("r600", llvm::Triple::r600)
6915 .Case("amdgcn", llvm::Triple::amdgcn)
6916 .Case("nvptx", llvm::Triple::nvptx)
6917 .Case("nvptx64", llvm::Triple::nvptx64)
6918 .Case("amdil", llvm::Triple::amdil)
6919 .Case("spir", llvm::Triple::spir)
6920 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006921}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006922
Tim Northover157d9112014-01-16 08:48:16 +00006923void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006924 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006925 T.setArch(Arch);
6926
6927 if (Str == "x86_64h")
6928 T.setArchName(Str);
6929 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6930 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006931 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006932 }
6933}
6934
Bob Wilsondecc03e2012-11-23 06:14:39 +00006935const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006936 const InputInfo &Input) {
6937 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006938}
6939
Bob Wilsondecc03e2012-11-23 06:14:39 +00006940const char *Clang::getBaseInputStem(const ArgList &Args,
6941 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006942 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006943
Chris Lattner906bb902011-01-16 08:14:11 +00006944 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006945 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006946
6947 return Str;
6948}
6949
Bob Wilsondecc03e2012-11-23 06:14:39 +00006950const char *Clang::getDependencyFileName(const ArgList &Args,
6951 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006952 // FIXME: Think about this more.
6953 std::string Res;
6954
6955 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006956 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006957 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006958 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006959 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006960 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006961 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006962}
6963
Douglas Katzman95354292015-06-23 20:42:09 +00006964void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6965 const InputInfo &Output,
6966 const InputInfoList &Inputs,
6967 const ArgList &Args,
6968 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006969 const ToolChain &ToolChain = getToolChain();
6970 const Driver &D = ToolChain.getDriver();
6971 ArgStringList CmdArgs;
6972
6973 // Silence warning for "clang -g foo.o -o foo"
6974 Args.ClaimAllArgs(options::OPT_g_Group);
6975 // and "clang -emit-llvm foo.o -o foo"
6976 Args.ClaimAllArgs(options::OPT_emit_llvm);
6977 // and for "clang -w foo.o -o foo". Other warning options are already
6978 // handled somewhere else.
6979 Args.ClaimAllArgs(options::OPT_w);
6980
6981 if (!D.SysRoot.empty())
6982 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6983
6984 // CloudABI only supports static linkage.
6985 CmdArgs.push_back("-Bstatic");
6986 CmdArgs.push_back("--eh-frame-hdr");
6987 CmdArgs.push_back("--gc-sections");
6988
6989 if (Output.isFilename()) {
6990 CmdArgs.push_back("-o");
6991 CmdArgs.push_back(Output.getFilename());
6992 } else {
6993 assert(Output.isNothing() && "Invalid output.");
6994 }
6995
Douglas Katzman78b37b02015-11-17 20:28:07 +00006996 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006997 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6998 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6999 }
7000
7001 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007002 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007003 Args.AddAllArgs(CmdArgs,
7004 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
7005 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007006
Teresa Johnson945bc502015-10-15 20:35:53 +00007007 if (D.isUsingLTO())
7008 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007009
7010 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7011
Douglas Katzman78b37b02015-11-17 20:28:07 +00007012 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007013 if (D.CCCIsCXX())
7014 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
7015 CmdArgs.push_back("-lc");
7016 CmdArgs.push_back("-lcompiler_rt");
7017 }
7018
Douglas Katzman78b37b02015-11-17 20:28:07 +00007019 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007020 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
7021
7022 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007023 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00007024}
7025
Douglas Katzman95354292015-06-23 20:42:09 +00007026void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7027 const InputInfo &Output,
7028 const InputInfoList &Inputs,
7029 const ArgList &Args,
7030 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00007031 ArgStringList CmdArgs;
7032
7033 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
7034 const InputInfo &Input = Inputs[0];
7035
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007036 // Determine the original source input.
7037 const Action *SourceAction = &JA;
7038 while (SourceAction->getKind() != Action::InputClass) {
7039 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
7040 SourceAction = SourceAction->getInputs()[0];
7041 }
7042
Eric Christopherf5a8f492015-12-08 00:10:10 +00007043 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00007044 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00007045 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
7046 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00007047 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00007048 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00007049 const llvm::Triple &T(getToolChain().getTriple());
7050 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00007051 CmdArgs.push_back("-Q");
7052 }
Kevin Enderby319baa42013-11-18 23:30:29 +00007053
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007054 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00007055 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00007056 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007057 if (Args.hasArg(options::OPT_gstabs))
7058 CmdArgs.push_back("--gstabs");
7059 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00007060 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00007061 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007062
Daniel Dunbarbe220842009-03-20 16:06:39 +00007063 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00007064 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007065
Daniel Dunbar6d484762010-07-22 01:47:22 +00007066 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007067 if (getToolChain().getArch() == llvm::Triple::x86 ||
7068 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00007069 Args.hasArg(options::OPT_force__cpusubtype__ALL))
7070 CmdArgs.push_back("-force_cpusubtype_ALL");
7071
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00007072 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007073 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00007074 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00007075 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00007076 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007077 CmdArgs.push_back("-static");
7078
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007079 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00007080
7081 assert(Output.isFilename() && "Unexpected lipo output.");
7082 CmdArgs.push_back("-o");
7083 CmdArgs.push_back(Output.getFilename());
7084
Daniel Dunbarb440f562010-08-02 02:38:21 +00007085 assert(Input.isFilename() && "Invalid input.");
7086 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00007087
7088 // asm_final spec is empty.
7089
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007090 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007091 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00007092}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007093
Tim Northover157d9112014-01-16 08:48:16 +00007094void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00007095
Tim Northover157d9112014-01-16 08:48:16 +00007096void darwin::MachOTool::AddMachOArch(const ArgList &Args,
7097 ArgStringList &CmdArgs) const {
7098 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007099
Daniel Dunbarc1964212009-03-26 16:23:12 +00007100 // Derived from darwin_arch spec.
7101 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007102 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007103
Daniel Dunbardcc3b652010-01-22 02:04:58 +00007104 // FIXME: Is this needed anymore?
7105 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00007106 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00007107}
7108
Douglas Katzman95354292015-06-23 20:42:09 +00007109bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00007110 // We only need to generate a temp path for LTO if we aren't compiling object
7111 // files. When compiling source files, we run 'dsymutil' after linking. We
7112 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007113 for (const auto &Input : Inputs)
7114 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00007115 return true;
7116
7117 return false;
7118}
7119
Douglas Katzman95354292015-06-23 20:42:09 +00007120void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
7121 ArgStringList &CmdArgs,
7122 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007123 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00007124 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00007125
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007126 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007127 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
7128 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007129 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
7130 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007131 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007132 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007133 }
7134
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007135 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007136 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00007137 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7138 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00007139
Bob Wilson3d27dad2013-08-02 22:25:34 +00007140 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
7141 CmdArgs.push_back("-export_dynamic");
7142
Bob Wilsonb111ec92015-03-02 19:01:14 +00007143 // If we are using App Extension restrictions, pass a flag to the linker
7144 // telling it that the compiled code has been audited.
7145 if (Args.hasFlag(options::OPT_fapplication_extension,
7146 options::OPT_fno_application_extension, false))
7147 CmdArgs.push_back("-application_extension");
7148
Teresa Johnson945bc502015-10-15 20:35:53 +00007149 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00007150 // If we are using LTO, then automatically create a temporary file path for
7151 // the linker to use, so that it's lifetime will extend past a possible
7152 // dsymutil step.
7153 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
7154 const char *TmpPath = C.getArgs().MakeArgString(
7155 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
7156 C.addTempFile(TmpPath);
7157 CmdArgs.push_back("-object_path_lto");
7158 CmdArgs.push_back(TmpPath);
7159 }
7160
7161 // Use -lto_library option to specify the libLTO.dylib path. Try to find
7162 // it in clang installed libraries. If not found, the option is not used
7163 // and 'ld' will use its default mechanism to search for libLTO.dylib.
7164 if (Version[0] >= 133) {
7165 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
7166 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
7167 SmallString<128> LibLTOPath(P);
7168 llvm::sys::path::append(LibLTOPath, "lib");
7169 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
7170 if (llvm::sys::fs::exists(LibLTOPath)) {
7171 CmdArgs.push_back("-lto_library");
7172 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
7173 } else {
7174 D.Diag(diag::warn_drv_lto_libpath);
7175 }
7176 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00007177 }
7178
Daniel Dunbarc1964212009-03-26 16:23:12 +00007179 // Derived from the "link" spec.
7180 Args.AddAllArgs(CmdArgs, options::OPT_static);
7181 if (!Args.hasArg(options::OPT_static))
7182 CmdArgs.push_back("-dynamic");
7183 if (Args.hasArg(options::OPT_fgnu_runtime)) {
7184 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
7185 // here. How do we wish to handle such things?
7186 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007187
Daniel Dunbarc1964212009-03-26 16:23:12 +00007188 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00007189 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00007190 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00007191 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007192
7193 Args.AddLastArg(CmdArgs, options::OPT_bundle);
7194 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
7195 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
7196
7197 Arg *A;
7198 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
7199 (A = Args.getLastArg(options::OPT_current__version)) ||
7200 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007201 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
7202 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00007203
7204 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
7205 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
7206 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
7207 } else {
7208 CmdArgs.push_back("-dylib");
7209
7210 Arg *A;
7211 if ((A = Args.getLastArg(options::OPT_bundle)) ||
7212 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
7213 (A = Args.getLastArg(options::OPT_client__name)) ||
7214 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
7215 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
7216 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007217 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
7218 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007219
Daniel Dunbarc1964212009-03-26 16:23:12 +00007220 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
7221 "-dylib_compatibility_version");
7222 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
7223 "-dylib_current_version");
7224
Tim Northover157d9112014-01-16 08:48:16 +00007225 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007226
7227 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
7228 "-dylib_install_name");
7229 }
7230
7231 Args.AddLastArg(CmdArgs, options::OPT_all__load);
7232 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
7233 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00007234 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007235 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007236 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
7237 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
7238 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
7239 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
7240 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
7241 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00007242 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007243 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
7244 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
7245 Args.AddAllArgs(CmdArgs, options::OPT_init);
7246
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007247 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00007248 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00007249
Daniel Dunbarc1964212009-03-26 16:23:12 +00007250 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
7251 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
7252 Args.AddLastArg(CmdArgs, options::OPT_single__module);
7253 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
7254 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007255
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007256 if (const Arg *A =
7257 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
7258 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00007259 if (A->getOption().matches(options::OPT_fpie) ||
7260 A->getOption().matches(options::OPT_fPIE))
7261 CmdArgs.push_back("-pie");
7262 else
7263 CmdArgs.push_back("-no_pie");
7264 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00007265
7266 Args.AddLastArg(CmdArgs, options::OPT_prebind);
7267 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
7268 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
7269 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
7270 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
7271 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
7272 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
7273 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
7274 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
7275 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
7276 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
7277 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
7278 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
7279 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
7280 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
7281 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007282
Daniel Dunbar84384642011-05-02 21:03:47 +00007283 // Give --sysroot= preference, over the Apple specific behavior to also use
7284 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00007285 StringRef sysroot = C.getSysRoot();
7286 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00007287 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00007288 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00007289 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
7290 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00007291 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007292 }
7293
Daniel Dunbarc1964212009-03-26 16:23:12 +00007294 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
7295 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
7296 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
7297 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
7298 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00007299 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007300 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
7301 Args.AddAllArgs(CmdArgs, options::OPT_y);
7302 Args.AddLastArg(CmdArgs, options::OPT_w);
7303 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
7304 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
7305 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
7306 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
7307 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
7308 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
7309 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
7310 Args.AddLastArg(CmdArgs, options::OPT_whyload);
7311 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
7312 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
7313 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
7314 Args.AddLastArg(CmdArgs, options::OPT_Mach);
7315}
7316
Douglas Katzman95354292015-06-23 20:42:09 +00007317void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7318 const InputInfo &Output,
7319 const InputInfoList &Inputs,
7320 const ArgList &Args,
7321 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007322 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00007323
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007324 // If the number of arguments surpasses the system limits, we will encode the
7325 // input files in a separate file, shortening the command line. To this end,
7326 // build a list of input file names that can be passed via a file with the
7327 // -filelist linker option.
7328 llvm::opt::ArgStringList InputFileList;
7329
Daniel Dunbarc1964212009-03-26 16:23:12 +00007330 // The logic here is derived from gcc's behavior; most of which
7331 // comes from specs (starting with link_command). Consult gcc for
7332 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00007333 ArgStringList CmdArgs;
7334
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007335 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
7336 if (Args.hasArg(options::OPT_ccc_arcmt_check,
7337 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007338 for (const auto &Arg : Args)
7339 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007340 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007341 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007342 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00007343 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00007344 return;
7345 }
7346
Daniel Dunbarc1964212009-03-26 16:23:12 +00007347 // I'm not sure why this particular decomposition exists in gcc, but
7348 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00007349 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007350
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007351 // It seems that the 'e' option is completely ignored for dynamic executables
7352 // (the default), and with static executables, the last one wins, as expected.
7353 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
7354 options::OPT_Z_Flag, options::OPT_u_Group,
7355 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00007356
Daniel Dunbar767bbab2010-10-18 22:08:36 +00007357 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
7358 // members of static archive libraries which implement Objective-C classes or
7359 // categories.
7360 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
7361 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007362
Daniel Dunbarc1964212009-03-26 16:23:12 +00007363 CmdArgs.push_back("-o");
7364 CmdArgs.push_back(Output.getFilename());
7365
Douglas Katzman78b37b02015-11-17 20:28:07 +00007366 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00007367 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007368
Peter Collingbournec4122c12015-06-15 21:08:13 +00007369 // SafeStack requires its own runtime libraries
7370 // These libraries should be linked first, to make sure the
7371 // __safestack_init constructor executes before everything else
7372 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
7373 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
7374 "libclang_rt.safestack_osx.a",
7375 /*AlwaysLink=*/true);
7376 }
7377
Daniel Dunbarc1964212009-03-26 16:23:12 +00007378 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007379
Douglas Gregor9295df02012-05-15 21:00:27 +00007380 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007381 // Build the input file for -filelist (list of linker input files) in case we
7382 // need it later
7383 for (const auto &II : Inputs) {
7384 if (!II.isFilename()) {
7385 // This is a linker input argument.
7386 // We cannot mix input arguments and file names in a -filelist input, thus
7387 // we prematurely stop our list (remaining files shall be passed as
7388 // arguments).
7389 if (InputFileList.size() > 0)
7390 break;
7391
7392 continue;
7393 }
7394
7395 InputFileList.push_back(II.getFilename());
7396 }
7397
Douglas Katzman78b37b02015-11-17 20:28:07 +00007398 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00007399 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
7400
Douglas Katzman78b37b02015-11-17 20:28:07 +00007401 if (isObjCRuntimeLinked(Args) &&
7402 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00007403 // We use arclite library for both ARC and subscripting support.
7404 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
7405
Bob Wilson7dda0cd2012-04-21 00:21:42 +00007406 CmdArgs.push_back("-framework");
7407 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007408 // Link libobj.
7409 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007410 }
John McCall31168b02011-06-15 23:02:42 +00007411
Daniel Dunbarc1964212009-03-26 16:23:12 +00007412 if (LinkingOutput) {
7413 CmdArgs.push_back("-arch_multiple");
7414 CmdArgs.push_back("-final_output");
7415 CmdArgs.push_back(LinkingOutput);
7416 }
7417
Daniel Dunbarc1964212009-03-26 16:23:12 +00007418 if (Args.hasArg(options::OPT_fnested_functions))
7419 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007420
Justin Bognerc7701242015-05-12 05:44:36 +00007421 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7422
Douglas Katzman78b37b02015-11-17 20:28:07 +00007423 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007424 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007425 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007426
Daniel Dunbarc1964212009-03-26 16:23:12 +00007427 // link_ssp spec is empty.
7428
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007429 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007430 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007431 }
7432
Douglas Katzman78b37b02015-11-17 20:28:07 +00007433 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007434 // endfile_spec is empty.
7435 }
7436
7437 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7438 Args.AddAllArgs(CmdArgs, options::OPT_F);
7439
Steven Wu3ffb61b2015-02-06 18:08:29 +00007440 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007441 for (const Arg *A : Args.filtered(options::OPT_iframework))
7442 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007443
Douglas Katzman78b37b02015-11-17 20:28:07 +00007444 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007445 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7446 if (A->getValue() == StringRef("Accelerate")) {
7447 CmdArgs.push_back("-framework");
7448 CmdArgs.push_back("Accelerate");
7449 }
7450 }
7451 }
7452
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007453 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007454 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007455 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007456 Cmd->setInputFileList(std::move(InputFileList));
7457 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007458}
7459
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007460void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007461 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007462 const InputInfoList &Inputs,
7463 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007464 const char *LinkingOutput) const {
7465 ArgStringList CmdArgs;
7466
7467 CmdArgs.push_back("-create");
7468 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007469
7470 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007471 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007472
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007473 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007474 assert(II.isFilename() && "Unexpected lipo input.");
7475 CmdArgs.push_back(II.getFilename());
7476 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007477
7478 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007479 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007480}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007481
Daniel Dunbar88299622010-06-04 18:28:36 +00007482void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007483 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007484 const InputInfoList &Inputs,
7485 const ArgList &Args,
7486 const char *LinkingOutput) const {
7487 ArgStringList CmdArgs;
7488
Daniel Dunbareb86b042011-05-09 17:23:16 +00007489 CmdArgs.push_back("-o");
7490 CmdArgs.push_back(Output.getFilename());
7491
Daniel Dunbar88299622010-06-04 18:28:36 +00007492 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7493 const InputInfo &Input = Inputs[0];
7494 assert(Input.isFilename() && "Unexpected dsymutil input.");
7495 CmdArgs.push_back(Input.getFilename());
7496
Daniel Dunbar88299622010-06-04 18:28:36 +00007497 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007498 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007499 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007500}
7501
Eric Christopher551ef452011-08-23 17:56:55 +00007502void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007503 const InputInfo &Output,
7504 const InputInfoList &Inputs,
7505 const ArgList &Args,
7506 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007507 ArgStringList CmdArgs;
7508 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007509 CmdArgs.push_back("--debug-info");
7510 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007511 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007512
7513 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7514 const InputInfo &Input = Inputs[0];
7515 assert(Input.isFilename() && "Unexpected verify input");
7516
7517 // Grabbing the output of the earlier dsymutil run.
7518 CmdArgs.push_back(Input.getFilename());
7519
7520 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007521 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007522 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007523}
7524
Douglas Katzman95354292015-06-23 20:42:09 +00007525void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007526 const InputInfo &Output,
7527 const InputInfoList &Inputs,
7528 const ArgList &Args,
7529 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007530 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007531 ArgStringList CmdArgs;
7532
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007533 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007534
7535 CmdArgs.push_back("-o");
7536 CmdArgs.push_back(Output.getFilename());
7537
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007538 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007539 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007540
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007541 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007542 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007543}
7544
Douglas Katzman95354292015-06-23 20:42:09 +00007545void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7546 const InputInfo &Output,
7547 const InputInfoList &Inputs,
7548 const ArgList &Args,
7549 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007550 ArgStringList CmdArgs;
7551
David Chisnall272a0712012-02-29 15:06:12 +00007552 // Demangle C++ names in errors
7553 CmdArgs.push_back("-C");
7554
Douglas Katzman78b37b02015-11-17 20:28:07 +00007555 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007556 CmdArgs.push_back("-e");
7557 CmdArgs.push_back("_start");
7558 }
7559
7560 if (Args.hasArg(options::OPT_static)) {
7561 CmdArgs.push_back("-Bstatic");
7562 CmdArgs.push_back("-dn");
7563 } else {
7564 CmdArgs.push_back("-Bdynamic");
7565 if (Args.hasArg(options::OPT_shared)) {
7566 CmdArgs.push_back("-shared");
7567 } else {
7568 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007569 CmdArgs.push_back(
7570 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007571 }
7572 }
7573
7574 if (Output.isFilename()) {
7575 CmdArgs.push_back("-o");
7576 CmdArgs.push_back(Output.getFilename());
7577 } else {
7578 assert(Output.isNothing() && "Invalid output.");
7579 }
7580
Douglas Katzman78b37b02015-11-17 20:28:07 +00007581 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007582 if (!Args.hasArg(options::OPT_shared))
7583 CmdArgs.push_back(
7584 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7585
7586 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7587 CmdArgs.push_back(
7588 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7589 CmdArgs.push_back(
7590 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007591 }
7592
Douglas Katzman6059ef92015-11-17 17:41:23 +00007593 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007594
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007595 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7596 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007597
7598 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7599
Douglas Katzman78b37b02015-11-17 20:28:07 +00007600 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007601 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007602 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007603 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007604 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007605 if (!Args.hasArg(options::OPT_shared)) {
7606 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007607 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007608 }
David Chisnallf571cde2012-02-15 13:39:01 +00007609 }
7610
Douglas Katzman78b37b02015-11-17 20:28:07 +00007611 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007612 CmdArgs.push_back(
7613 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007614 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007615 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007616
Xinliang David Li69306c02015-10-22 06:15:31 +00007617 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007618
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007619 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007620 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007621}
7622
Douglas Katzman95354292015-06-23 20:42:09 +00007623void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7624 const InputInfo &Output,
7625 const InputInfoList &Inputs,
7626 const ArgList &Args,
7627 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007628 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007629 ArgStringList CmdArgs;
7630
Rafael Espindolacc126272014-02-28 01:55:21 +00007631 switch (getToolChain().getArch()) {
7632 case llvm::Triple::x86:
7633 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7634 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007635 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007636 break;
7637
7638 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007639 CmdArgs.push_back("-mppc");
7640 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007641 break;
7642
7643 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007644 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007645 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007646 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7647 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7648 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007649 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007650 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007651
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007652 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007653 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007654 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7655 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7656 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007657 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007658 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007659
7660 case llvm::Triple::mips64:
7661 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007662 StringRef CPUName;
7663 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007664 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007665
7666 CmdArgs.push_back("-mabi");
7667 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7668
7669 if (getToolChain().getArch() == llvm::Triple::mips64)
7670 CmdArgs.push_back("-EB");
7671 else
7672 CmdArgs.push_back("-EL");
7673
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007674 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007675 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007676 }
7677
Rafael Espindolacc126272014-02-28 01:55:21 +00007678 default:
7679 break;
7680 }
7681
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007682 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007683
7684 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007685 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007686
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007687 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007688 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007689
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007690 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007691 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007692}
7693
Douglas Katzman95354292015-06-23 20:42:09 +00007694void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7695 const InputInfo &Output,
7696 const InputInfoList &Inputs,
7697 const ArgList &Args,
7698 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007699 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007700 ArgStringList CmdArgs;
7701
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007702 // Silence warning for "clang -g foo.o -o foo"
7703 Args.ClaimAllArgs(options::OPT_g_Group);
7704 // and "clang -emit-llvm foo.o -o foo"
7705 Args.ClaimAllArgs(options::OPT_emit_llvm);
7706 // and for "clang -w foo.o -o foo". Other warning options are already
7707 // handled somewhere else.
7708 Args.ClaimAllArgs(options::OPT_w);
7709
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007710 if (getToolChain().getArch() == llvm::Triple::mips64)
7711 CmdArgs.push_back("-EB");
7712 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7713 CmdArgs.push_back("-EL");
7714
Douglas Katzman78b37b02015-11-17 20:28:07 +00007715 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007716 CmdArgs.push_back("-e");
7717 CmdArgs.push_back("__start");
7718 }
7719
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007720 if (Args.hasArg(options::OPT_static)) {
7721 CmdArgs.push_back("-Bstatic");
7722 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007723 if (Args.hasArg(options::OPT_rdynamic))
7724 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007725 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007726 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007727 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007728 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007729 } else {
7730 CmdArgs.push_back("-dynamic-linker");
7731 CmdArgs.push_back("/usr/libexec/ld.so");
7732 }
7733 }
7734
Rafael Espindola044f7832013-06-05 04:28:55 +00007735 if (Args.hasArg(options::OPT_nopie))
7736 CmdArgs.push_back("-nopie");
7737
Daniel Dunbarb440f562010-08-02 02:38:21 +00007738 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007739 CmdArgs.push_back("-o");
7740 CmdArgs.push_back(Output.getFilename());
7741 } else {
7742 assert(Output.isNothing() && "Invalid output.");
7743 }
7744
Douglas Katzman78b37b02015-11-17 20:28:07 +00007745 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007746 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007747 if (Args.hasArg(options::OPT_pg))
7748 CmdArgs.push_back(
7749 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007750 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007751 CmdArgs.push_back(
7752 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7753 CmdArgs.push_back(
7754 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007755 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007756 CmdArgs.push_back(
7757 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007758 }
7759 }
7760
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007761 std::string Triple = getToolChain().getTripleString();
7762 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007763 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007764 CmdArgs.push_back(
7765 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007766
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007767 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7768 options::OPT_e, options::OPT_s, options::OPT_t,
7769 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007770
Daniel Dunbar54423b22010-09-17 00:24:54 +00007771 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007772
Douglas Katzman78b37b02015-11-17 20:28:07 +00007773 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007774 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007775 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007776 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007777 CmdArgs.push_back("-lm_p");
7778 else
7779 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007780 }
7781
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007782 // FIXME: For some reason GCC passes -lgcc before adding
7783 // the default system libraries. Just mimic this for now.
7784 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007785
Eric Christopher17674ec2012-09-13 06:32:34 +00007786 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007787 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7788 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007789 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007790 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007791 }
7792
Chandler Carruth45661652011-12-17 22:32:42 +00007793 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007794 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007795 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007796 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007797 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007798 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007799
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007800 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007801 }
7802
Douglas Katzman78b37b02015-11-17 20:28:07 +00007803 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007804 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007805 CmdArgs.push_back(
7806 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007807 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007808 CmdArgs.push_back(
7809 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007810 }
7811
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007812 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007813 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007814}
Ed Schoutene33194b2009-04-02 19:13:12 +00007815
Douglas Katzman95354292015-06-23 20:42:09 +00007816void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7817 const InputInfo &Output,
7818 const InputInfoList &Inputs,
7819 const ArgList &Args,
7820 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007821 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007822 ArgStringList CmdArgs;
7823
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007824 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007825
7826 CmdArgs.push_back("-o");
7827 CmdArgs.push_back(Output.getFilename());
7828
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007829 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007830 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007831
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007832 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007833 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007834}
7835
Douglas Katzman95354292015-06-23 20:42:09 +00007836void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7837 const InputInfo &Output,
7838 const InputInfoList &Inputs,
7839 const ArgList &Args,
7840 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007841 const Driver &D = getToolChain().getDriver();
7842 ArgStringList CmdArgs;
7843
Douglas Katzman78b37b02015-11-17 20:28:07 +00007844 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007845 CmdArgs.push_back("-e");
7846 CmdArgs.push_back("__start");
7847 }
7848
7849 if (Args.hasArg(options::OPT_static)) {
7850 CmdArgs.push_back("-Bstatic");
7851 } else {
7852 if (Args.hasArg(options::OPT_rdynamic))
7853 CmdArgs.push_back("-export-dynamic");
7854 CmdArgs.push_back("--eh-frame-hdr");
7855 CmdArgs.push_back("-Bdynamic");
7856 if (Args.hasArg(options::OPT_shared)) {
7857 CmdArgs.push_back("-shared");
7858 } else {
7859 CmdArgs.push_back("-dynamic-linker");
7860 CmdArgs.push_back("/usr/libexec/ld.so");
7861 }
7862 }
7863
7864 if (Output.isFilename()) {
7865 CmdArgs.push_back("-o");
7866 CmdArgs.push_back(Output.getFilename());
7867 } else {
7868 assert(Output.isNothing() && "Invalid output.");
7869 }
7870
Douglas Katzman78b37b02015-11-17 20:28:07 +00007871 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007872 if (!Args.hasArg(options::OPT_shared)) {
7873 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007874 CmdArgs.push_back(
7875 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007876 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007877 CmdArgs.push_back(
7878 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7879 CmdArgs.push_back(
7880 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007881 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007882 CmdArgs.push_back(
7883 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007884 }
7885 }
7886
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007887 Args.AddAllArgs(CmdArgs,
7888 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007889
7890 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7891
Douglas Katzman78b37b02015-11-17 20:28:07 +00007892 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007893 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007894 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7895 if (Args.hasArg(options::OPT_pg))
7896 CmdArgs.push_back("-lm_p");
7897 else
7898 CmdArgs.push_back("-lm");
7899 }
7900
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007901 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007902 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007903 CmdArgs.push_back("-lpthread_p");
7904 else
7905 CmdArgs.push_back("-lpthread");
7906 }
7907
Eli Friedman9fa28852012-08-08 23:57:20 +00007908 if (!Args.hasArg(options::OPT_shared)) {
7909 if (Args.hasArg(options::OPT_pg))
7910 CmdArgs.push_back("-lc_p");
7911 else
7912 CmdArgs.push_back("-lc");
7913 }
7914
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007915 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007916 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007917 case llvm::Triple::arm:
7918 MyArch = "arm";
7919 break;
7920 case llvm::Triple::x86:
7921 MyArch = "i386";
7922 break;
7923 case llvm::Triple::x86_64:
7924 MyArch = "amd64";
7925 break;
7926 default:
7927 llvm_unreachable("Unsupported architecture");
7928 }
7929 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007930 }
7931
Douglas Katzman78b37b02015-11-17 20:28:07 +00007932 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007933 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007934 CmdArgs.push_back(
7935 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007936 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007937 CmdArgs.push_back(
7938 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007939 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007940
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007941 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007942 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007943}
7944
Douglas Katzman95354292015-06-23 20:42:09 +00007945void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7946 const InputInfo &Output,
7947 const InputInfoList &Inputs,
7948 const ArgList &Args,
7949 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007950 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007951 ArgStringList CmdArgs;
7952
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007953 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7954 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007955 switch (getToolChain().getArch()) {
7956 default:
7957 break;
7958 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007959 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007960 break;
7961 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007962 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007963 break;
7964 case llvm::Triple::mips:
7965 case llvm::Triple::mipsel:
7966 case llvm::Triple::mips64:
7967 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007968 StringRef CPUName;
7969 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007970 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007971
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007972 CmdArgs.push_back("-march");
7973 CmdArgs.push_back(CPUName.data());
7974
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007975 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007976 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007977
7978 if (getToolChain().getArch() == llvm::Triple::mips ||
7979 getToolChain().getArch() == llvm::Triple::mips64)
7980 CmdArgs.push_back("-EB");
7981 else
7982 CmdArgs.push_back("-EL");
7983
Dimitry Andric46f338c2015-12-27 10:36:44 +00007984 if (Arg *A = Args.getLastArg(options::OPT_G)) {
7985 StringRef v = A->getValue();
7986 CmdArgs.push_back(Args.MakeArgString("-G" + v));
7987 A->claim();
7988 }
7989
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007990 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007991 break;
7992 }
7993 case llvm::Triple::arm:
7994 case llvm::Triple::armeb:
7995 case llvm::Triple::thumb:
7996 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007997 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007998
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007999 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00008000 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008001 else
Renato Golinf4421f72014-02-19 10:44:07 +00008002 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00008003
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008004 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00008005 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008006 case llvm::Triple::GNUEABI:
8007 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00008008 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00008009 break;
8010
8011 default:
8012 CmdArgs.push_back("-matpcs");
8013 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008014 break;
8015 }
8016 case llvm::Triple::sparc:
8017 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008018 case llvm::Triple::sparcv9: {
8019 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8020 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008021 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00008022 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00008023 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008024 }
Eric Christopher0b26a612010-03-02 02:41:08 +00008025
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008026 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008027
8028 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008029 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008030
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008031 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008032 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008033
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008034 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008035 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00008036}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008037
Douglas Katzman95354292015-06-23 20:42:09 +00008038void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8039 const InputInfo &Output,
8040 const InputInfoList &Inputs,
8041 const ArgList &Args,
8042 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008043 const toolchains::FreeBSD &ToolChain =
8044 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00008045 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008046 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008047 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008048 !Args.hasArg(options::OPT_shared) &&
8049 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008050 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00008051
8052 // Silence warning for "clang -g foo.o -o foo"
8053 Args.ClaimAllArgs(options::OPT_g_Group);
8054 // and "clang -emit-llvm foo.o -o foo"
8055 Args.ClaimAllArgs(options::OPT_emit_llvm);
8056 // and for "clang -w foo.o -o foo". Other warning options are already
8057 // handled somewhere else.
8058 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008059
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008060 if (!D.SysRoot.empty())
8061 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8062
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008063 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008064 CmdArgs.push_back("-pie");
8065
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008066 if (Args.hasArg(options::OPT_static)) {
8067 CmdArgs.push_back("-Bstatic");
8068 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00008069 if (Args.hasArg(options::OPT_rdynamic))
8070 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008071 CmdArgs.push_back("--eh-frame-hdr");
8072 if (Args.hasArg(options::OPT_shared)) {
8073 CmdArgs.push_back("-Bshareable");
8074 } else {
8075 CmdArgs.push_back("-dynamic-linker");
8076 CmdArgs.push_back("/libexec/ld-elf.so.1");
8077 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008078 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00008079 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
8080 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
8081 CmdArgs.push_back("--hash-style=both");
8082 }
8083 }
8084 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008085 }
8086
8087 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
8088 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008089 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008090 CmdArgs.push_back("-m");
8091 CmdArgs.push_back("elf_i386_fbsd");
8092 }
8093
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008094 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00008095 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00008096 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00008097 }
8098
Dimitry Andric904895f2015-12-27 06:47:09 +00008099 if (Arg *A = Args.getLastArg(options::OPT_G)) {
8100 if (ToolChain.getArch() == llvm::Triple::mips ||
8101 ToolChain.getArch() == llvm::Triple::mipsel ||
8102 ToolChain.getArch() == llvm::Triple::mips64 ||
8103 ToolChain.getArch() == llvm::Triple::mips64el) {
8104 StringRef v = A->getValue();
8105 CmdArgs.push_back(Args.MakeArgString("-G" + v));
8106 A->claim();
8107 }
8108 }
8109
Daniel Dunbarb440f562010-08-02 02:38:21 +00008110 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008111 CmdArgs.push_back("-o");
8112 CmdArgs.push_back(Output.getFilename());
8113 } else {
8114 assert(Output.isNothing() && "Invalid output.");
8115 }
8116
Douglas Katzman78b37b02015-11-17 20:28:07 +00008117 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008118 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008119 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008120 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00008121 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008122 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008123 crt1 = "Scrt1.o";
8124 else
8125 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008126 }
Roman Divackyafe2f232012-08-28 15:09:03 +00008127 if (crt1)
8128 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
8129
8130 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8131
Craig Topper92fc2df2014-05-17 16:56:41 +00008132 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00008133 if (Args.hasArg(options::OPT_static))
8134 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008135 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008136 crtbegin = "crtbeginS.o";
8137 else
8138 crtbegin = "crtbegin.o";
8139
8140 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008141 }
8142
8143 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00008144 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008145 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8146 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00008147 Args.AddAllArgs(CmdArgs, options::OPT_s);
8148 Args.AddAllArgs(CmdArgs, options::OPT_t);
8149 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8150 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008151
Teresa Johnson945bc502015-10-15 20:35:53 +00008152 if (D.isUsingLTO())
8153 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00008154
Alexey Samsonov52550342014-09-15 19:58:40 +00008155 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00008156 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008157
Douglas Katzman78b37b02015-11-17 20:28:07 +00008158 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00008159 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008160 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00008161 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00008162 if (Args.hasArg(options::OPT_pg))
8163 CmdArgs.push_back("-lm_p");
8164 else
8165 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00008166 }
Alexey Samsonov52550342014-09-15 19:58:40 +00008167 if (NeedsSanitizerDeps)
8168 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008169 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
8170 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00008171 if (Args.hasArg(options::OPT_pg))
8172 CmdArgs.push_back("-lgcc_p");
8173 else
8174 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008175 if (Args.hasArg(options::OPT_static)) {
8176 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008177 } else if (Args.hasArg(options::OPT_pg)) {
8178 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008179 } else {
8180 CmdArgs.push_back("--as-needed");
8181 CmdArgs.push_back("-lgcc_s");
8182 CmdArgs.push_back("--no-as-needed");
8183 }
8184
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008185 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00008186 if (Args.hasArg(options::OPT_pg))
8187 CmdArgs.push_back("-lpthread_p");
8188 else
8189 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00008190 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008191
Roman Divacky66f22762011-02-10 16:59:40 +00008192 if (Args.hasArg(options::OPT_pg)) {
8193 if (Args.hasArg(options::OPT_shared))
8194 CmdArgs.push_back("-lc");
8195 else
8196 CmdArgs.push_back("-lc_p");
8197 CmdArgs.push_back("-lgcc_p");
8198 } else {
8199 CmdArgs.push_back("-lc");
8200 CmdArgs.push_back("-lgcc");
8201 }
8202
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008203 if (Args.hasArg(options::OPT_static)) {
8204 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00008205 } else if (Args.hasArg(options::OPT_pg)) {
8206 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008207 } else {
8208 CmdArgs.push_back("--as-needed");
8209 CmdArgs.push_back("-lgcc_s");
8210 CmdArgs.push_back("--no-as-needed");
8211 }
8212 }
8213
Douglas Katzman78b37b02015-11-17 20:28:07 +00008214 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00008215 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00008216 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00008217 else
8218 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00008219 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008220 }
8221
Xinliang David Li69306c02015-10-22 06:15:31 +00008222 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008223
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008224 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008225 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00008226}
Daniel Dunbarcc912342009-05-02 18:28:39 +00008227
Douglas Katzman95354292015-06-23 20:42:09 +00008228void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008229 const InputInfo &Output,
8230 const InputInfoList &Inputs,
8231 const ArgList &Args,
8232 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008233 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008234 ArgStringList CmdArgs;
8235
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008236 // GNU as needs different flags for creating the correct output format
8237 // on architectures with different ABIs or optional feature sets.
8238 switch (getToolChain().getArch()) {
8239 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008240 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008241 break;
8242 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008243 case llvm::Triple::armeb:
8244 case llvm::Triple::thumb:
8245 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00008246 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00008247 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
8248 std::string Arch =
8249 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00008250 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008251 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00008252 }
8253
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008254 case llvm::Triple::mips:
8255 case llvm::Triple::mipsel:
8256 case llvm::Triple::mips64:
8257 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008258 StringRef CPUName;
8259 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008260 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008261
8262 CmdArgs.push_back("-march");
8263 CmdArgs.push_back(CPUName.data());
8264
8265 CmdArgs.push_back("-mabi");
8266 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
8267
8268 if (getToolChain().getArch() == llvm::Triple::mips ||
8269 getToolChain().getArch() == llvm::Triple::mips64)
8270 CmdArgs.push_back("-EB");
8271 else
8272 CmdArgs.push_back("-EL");
8273
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008274 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008275 break;
8276 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008277
8278 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008279 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008280 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008281 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8282 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008283 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008284 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008285 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008286
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008287 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008288 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008289 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8290 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008291 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008292 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00008293 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008294
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00008295 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008296 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00008297 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008298
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008299 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008300
8301 CmdArgs.push_back("-o");
8302 CmdArgs.push_back(Output.getFilename());
8303
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008304 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008305 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008306
David Chisnallddbd68f2011-09-27 22:03:18 +00008307 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00008308 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008309}
8310
Douglas Katzman95354292015-06-23 20:42:09 +00008311void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8312 const InputInfo &Output,
8313 const InputInfoList &Inputs,
8314 const ArgList &Args,
8315 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008316 const Driver &D = getToolChain().getDriver();
8317 ArgStringList CmdArgs;
8318
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008319 if (!D.SysRoot.empty())
8320 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8321
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00008322 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008323 if (Args.hasArg(options::OPT_static)) {
8324 CmdArgs.push_back("-Bstatic");
8325 } else {
8326 if (Args.hasArg(options::OPT_rdynamic))
8327 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008328 if (Args.hasArg(options::OPT_shared)) {
8329 CmdArgs.push_back("-Bshareable");
8330 } else {
8331 CmdArgs.push_back("-dynamic-linker");
8332 CmdArgs.push_back("/libexec/ld.elf_so");
8333 }
8334 }
8335
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008336 // Many NetBSD architectures support more than one ABI.
8337 // Determine the correct emulation for ld.
8338 switch (getToolChain().getArch()) {
8339 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008340 CmdArgs.push_back("-m");
8341 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008342 break;
8343 case llvm::Triple::arm:
8344 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008345 CmdArgs.push_back("-m");
8346 switch (getToolChain().getTriple().getEnvironment()) {
8347 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008348 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008349 CmdArgs.push_back("armelf_nbsd_eabi");
8350 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00008351 case llvm::Triple::EABIHF:
8352 case llvm::Triple::GNUEABIHF:
8353 CmdArgs.push_back("armelf_nbsd_eabihf");
8354 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008355 default:
8356 CmdArgs.push_back("armelf_nbsd");
8357 break;
8358 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008359 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008360 case llvm::Triple::armeb:
8361 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008362 arm::appendEBLinkFlags(
8363 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00008364 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00008365 CmdArgs.push_back("-m");
8366 switch (getToolChain().getTriple().getEnvironment()) {
8367 case llvm::Triple::EABI:
8368 case llvm::Triple::GNUEABI:
8369 CmdArgs.push_back("armelfb_nbsd_eabi");
8370 break;
8371 case llvm::Triple::EABIHF:
8372 case llvm::Triple::GNUEABIHF:
8373 CmdArgs.push_back("armelfb_nbsd_eabihf");
8374 break;
8375 default:
8376 CmdArgs.push_back("armelfb_nbsd");
8377 break;
8378 }
8379 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008380 case llvm::Triple::mips64:
8381 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00008382 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00008383 CmdArgs.push_back("-m");
8384 if (getToolChain().getArch() == llvm::Triple::mips64)
8385 CmdArgs.push_back("elf32btsmip");
8386 else
8387 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008388 } else if (mips::hasMipsAbiArg(Args, "64")) {
8389 CmdArgs.push_back("-m");
8390 if (getToolChain().getArch() == llvm::Triple::mips64)
8391 CmdArgs.push_back("elf64btsmip");
8392 else
8393 CmdArgs.push_back("elf64ltsmip");
8394 }
8395 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008396 case llvm::Triple::ppc:
8397 CmdArgs.push_back("-m");
8398 CmdArgs.push_back("elf32ppc_nbsd");
8399 break;
8400
8401 case llvm::Triple::ppc64:
8402 case llvm::Triple::ppc64le:
8403 CmdArgs.push_back("-m");
8404 CmdArgs.push_back("elf64ppc");
8405 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00008406
8407 case llvm::Triple::sparc:
8408 CmdArgs.push_back("-m");
8409 CmdArgs.push_back("elf32_sparc");
8410 break;
8411
8412 case llvm::Triple::sparcv9:
8413 CmdArgs.push_back("-m");
8414 CmdArgs.push_back("elf64_sparc");
8415 break;
8416
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00008417 default:
8418 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00008419 }
8420
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008421 if (Output.isFilename()) {
8422 CmdArgs.push_back("-o");
8423 CmdArgs.push_back(Output.getFilename());
8424 } else {
8425 assert(Output.isNothing() && "Invalid output.");
8426 }
8427
Douglas Katzman78b37b02015-11-17 20:28:07 +00008428 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008429 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008430 CmdArgs.push_back(
8431 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8432 CmdArgs.push_back(
8433 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8434 CmdArgs.push_back(
8435 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008436 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008437 CmdArgs.push_back(
8438 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8439 CmdArgs.push_back(
8440 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008441 }
8442 }
8443
8444 Args.AddAllArgs(CmdArgs, options::OPT_L);
8445 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8446 Args.AddAllArgs(CmdArgs, options::OPT_e);
8447 Args.AddAllArgs(CmdArgs, options::OPT_s);
8448 Args.AddAllArgs(CmdArgs, options::OPT_t);
8449 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8450 Args.AddAllArgs(CmdArgs, options::OPT_r);
8451
8452 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8453
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008454 unsigned Major, Minor, Micro;
8455 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8456 bool useLibgcc = true;
Joerg Sonnenberger21156e82016-02-11 23:35:03 +00008457 if (Major >= 7 || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008458 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008459 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008460 case llvm::Triple::arm:
8461 case llvm::Triple::armeb:
8462 case llvm::Triple::thumb:
8463 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008464 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008465 case llvm::Triple::ppc64:
8466 case llvm::Triple::ppc64le:
Joerg Sonnenberger059613c2016-02-11 23:18:36 +00008467 case llvm::Triple::sparc:
8468 case llvm::Triple::sparcv9:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008469 case llvm::Triple::x86:
8470 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008471 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008472 break;
8473 default:
8474 break;
8475 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008476 }
8477
Douglas Katzman78b37b02015-11-17 20:28:07 +00008478 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008479 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008480 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008481 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8482 CmdArgs.push_back("-lm");
8483 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008484 if (Args.hasArg(options::OPT_pthread))
8485 CmdArgs.push_back("-lpthread");
8486 CmdArgs.push_back("-lc");
8487
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008488 if (useLibgcc) {
8489 if (Args.hasArg(options::OPT_static)) {
8490 // libgcc_eh depends on libc, so resolve as much as possible,
8491 // pull in any new requirements from libc and then get the rest
8492 // of libgcc.
8493 CmdArgs.push_back("-lgcc_eh");
8494 CmdArgs.push_back("-lc");
8495 CmdArgs.push_back("-lgcc");
8496 } else {
8497 CmdArgs.push_back("-lgcc");
8498 CmdArgs.push_back("--as-needed");
8499 CmdArgs.push_back("-lgcc_s");
8500 CmdArgs.push_back("--no-as-needed");
8501 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008502 }
8503 }
8504
Douglas Katzman78b37b02015-11-17 20:28:07 +00008505 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008506 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008507 CmdArgs.push_back(
8508 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008509 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008510 CmdArgs.push_back(
8511 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8512 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008513 }
8514
Xinliang David Li69306c02015-10-22 06:15:31 +00008515 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008516
Logan Chieneb9162f2014-06-26 14:23:45 +00008517 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008518 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008519}
8520
Douglas Katzman95354292015-06-23 20:42:09 +00008521void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8522 const InputInfo &Output,
8523 const InputInfoList &Inputs,
8524 const ArgList &Args,
8525 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008526 claimNoWarnArgs(Args);
8527
James Y Knight2db38f32015-08-15 03:45:25 +00008528 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8529 llvm::Triple Triple = llvm::Triple(TripleStr);
8530
Rafael Espindola92b00932010-08-10 00:25:48 +00008531 ArgStringList CmdArgs;
8532
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008533 llvm::Reloc::Model RelocationModel;
8534 unsigned PICLevel;
8535 bool IsPIE;
8536 std::tie(RelocationModel, PICLevel, IsPIE) =
8537 ParsePICArgs(getToolChain(), Triple, Args);
8538
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008539 switch (getToolChain().getArch()) {
8540 default:
8541 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008542 // Add --32/--64 to make sure we get the format we want.
8543 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008544 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008545 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008546 break;
8547 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008548 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8549 CmdArgs.push_back("--x32");
8550 else
8551 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008552 break;
8553 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008554 CmdArgs.push_back("-a32");
8555 CmdArgs.push_back("-mppc");
8556 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008557 break;
8558 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008559 CmdArgs.push_back("-a64");
8560 CmdArgs.push_back("-mppc64");
8561 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008562 break;
8563 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008564 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008565 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008566 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008567 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008568 break;
8569 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008570 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008571 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008572 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8573 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8574 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008575 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008576 }
8577 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008578 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008579 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8580 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8581 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008582 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008583 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008584 case llvm::Triple::arm:
8585 case llvm::Triple::armeb:
8586 case llvm::Triple::thumb:
8587 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008588 const llvm::Triple &Triple2 = getToolChain().getTriple();
8589 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008590 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008591 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008592 break;
8593 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008594 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008595 break;
8596 default:
8597 break;
8598 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008599
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008600 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008601 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8602 case arm::FloatABI::Soft:
8603 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8604 break;
8605 case arm::FloatABI::SoftFP:
8606 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8607 break;
8608 case arm::FloatABI::Hard:
8609 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8610 break;
8611 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008612
8613 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008614
8615 // FIXME: remove krait check when GNU tools support krait cpu
8616 // for now replace it with -march=armv7-a to avoid a lower
8617 // march from being picked in the absence of a cpu flag.
8618 Arg *A;
8619 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008620 StringRef(A->getValue()).lower() == "krait")
8621 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008622 else
8623 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008624 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008625 break;
8626 }
8627 case llvm::Triple::mips:
8628 case llvm::Triple::mipsel:
8629 case llvm::Triple::mips64:
8630 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008631 StringRef CPUName;
8632 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008633 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008634 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008635
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008636 CmdArgs.push_back("-march");
8637 CmdArgs.push_back(CPUName.data());
8638
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008639 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008640 CmdArgs.push_back(ABIName.data());
8641
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008642 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8643 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008644 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008645 CmdArgs.push_back("-mno-shared");
8646
Daniel Sanders379d44b2014-07-16 11:52:23 +00008647 // LLVM doesn't support -mplt yet and acts as if it is always given.
8648 // However, -mplt has no effect with the N64 ABI.
8649 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008650
8651 if (getToolChain().getArch() == llvm::Triple::mips ||
8652 getToolChain().getArch() == llvm::Triple::mips64)
8653 CmdArgs.push_back("-EB");
8654 else
8655 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008656
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008657 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8658 if (StringRef(A->getValue()) == "2008")
8659 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8660 }
8661
Daniel Sanders379d44b2014-07-16 11:52:23 +00008662 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8663 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8664 options::OPT_mfp64)) {
8665 A->claim();
8666 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008667 } else if (mips::shouldUseFPXX(
8668 Args, getToolChain().getTriple(), CPUName, ABIName,
8669 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008670 CmdArgs.push_back("-mfpxx");
8671
8672 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8673 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008674 if (Arg *A =
8675 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008676 if (A->getOption().matches(options::OPT_mips16)) {
8677 A->claim();
8678 A->render(Args, CmdArgs);
8679 } else {
8680 A->claim();
8681 CmdArgs.push_back("-no-mips16");
8682 }
8683 }
8684
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008685 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8686 options::OPT_mno_micromips);
8687 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8688 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8689
Simon Atanasyanbd986632013-11-26 11:58:04 +00008690 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8691 // Do not use AddLastArg because not all versions of MIPS assembler
8692 // support -mmsa / -mno-msa options.
8693 if (A->getOption().matches(options::OPT_mmsa))
8694 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8695 }
8696
Daniel Sanders379d44b2014-07-16 11:52:23 +00008697 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8698 options::OPT_msoft_float);
8699
Toma Tabacub36d6102015-06-11 12:13:18 +00008700 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8701 options::OPT_msingle_float);
8702
Daniel Sanders379d44b2014-07-16 11:52:23 +00008703 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8704 options::OPT_mno_odd_spreg);
8705
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008706 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008707 break;
8708 }
8709 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008710 // Always pass an -march option, since our default of z10 is later
8711 // than the GNU assembler's default.
8712 StringRef CPUName = getSystemZTargetCPU(Args);
8713 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008714 break;
8715 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008716 }
8717
Renato Golina74bbc72015-07-22 15:32:36 +00008718 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008719 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008720
8721 CmdArgs.push_back("-o");
8722 CmdArgs.push_back(Output.getFilename());
8723
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008724 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008725 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008726
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008727 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008728 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008729
8730 // Handle the debug info splitting at object creation time if we're
8731 // creating an object.
8732 // TODO: Currently only works on linux with newer objcopy.
8733 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008734 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008735 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008736 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008737}
8738
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008739static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008740 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008741 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008742 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008743 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8744 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008745 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008746 CmdArgs.push_back("-lgcc");
8747
Logan Chien3d3373c2012-11-19 12:04:11 +00008748 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008749 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008750 CmdArgs.push_back("-lgcc");
8751 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008752 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008753 CmdArgs.push_back("--as-needed");
8754 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008755 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008756 CmdArgs.push_back("--no-as-needed");
8757 }
8758
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008759 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008760 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008761 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008762 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008763
8764 // According to Android ABI, we have to link with libdl if we are
8765 // linking with non-static libgcc.
8766 //
8767 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8768 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8769 if (isAndroid && !StaticLibgcc)
8770 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008771}
8772
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008773static std::string getLinuxDynamicLinker(const ArgList &Args,
8774 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008775 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8776
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008777 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008778 if (ToolChain.getTriple().isArch64Bit())
8779 return "/system/bin/linker64";
8780 else
8781 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008782 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8783 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008784 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008785 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008786 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008787 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008788 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008789 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008790 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008791 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008792 return "/lib/ld-linux-armhf.so.3";
8793 else
8794 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008795 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8796 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008797 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008798 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008799 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008800 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008801 return "/lib/ld-linux.so.3";
8802 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8803 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008804 std::string LibDir =
8805 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008806 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008807 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008808 if (mips::isUCLibc(Args))
8809 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008810 else if (!ToolChain.getTriple().hasEnvironment()) {
8811 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8812 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8813 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8814 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008815 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008816
8817 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008818 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008819 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008820 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008821 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8822 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008823 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008824 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008825 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8826 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008827 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008828 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008829 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008830 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008831 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008832 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008833 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8834 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008835 else
8836 return "/lib64/ld-linux-x86-64.so.2";
8837}
8838
Renato Golinc4b49242014-02-13 10:01:16 +00008839static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008840 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008841 // Make use of compiler-rt if --rtlib option is used
8842 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8843
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008844 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008845 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008846 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008847 default:
8848 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008849 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008850 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008851 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008852 break;
8853 }
Renato Golinc4b49242014-02-13 10:01:16 +00008854 break;
8855 case ToolChain::RLT_Libgcc:
8856 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8857 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008858 }
8859}
8860
Rafael Espindola1e085772014-08-15 17:14:35 +00008861static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8862 switch (T.getArch()) {
8863 case llvm::Triple::x86:
8864 return "elf_i386";
8865 case llvm::Triple::aarch64:
8866 return "aarch64linux";
8867 case llvm::Triple::aarch64_be:
8868 return "aarch64_be_linux";
8869 case llvm::Triple::arm:
8870 case llvm::Triple::thumb:
8871 return "armelf_linux_eabi";
8872 case llvm::Triple::armeb:
8873 case llvm::Triple::thumbeb:
8874 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8875 case llvm::Triple::ppc:
8876 return "elf32ppclinux";
8877 case llvm::Triple::ppc64:
8878 return "elf64ppc";
8879 case llvm::Triple::ppc64le:
8880 return "elf64lppc";
8881 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008882 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008883 return "elf32_sparc";
8884 case llvm::Triple::sparcv9:
8885 return "elf64_sparc";
8886 case llvm::Triple::mips:
8887 return "elf32btsmip";
8888 case llvm::Triple::mipsel:
8889 return "elf32ltsmip";
8890 case llvm::Triple::mips64:
8891 if (mips::hasMipsAbiArg(Args, "n32"))
8892 return "elf32btsmipn32";
8893 return "elf64btsmip";
8894 case llvm::Triple::mips64el:
8895 if (mips::hasMipsAbiArg(Args, "n32"))
8896 return "elf32ltsmipn32";
8897 return "elf64ltsmip";
8898 case llvm::Triple::systemz:
8899 return "elf64_s390";
8900 case llvm::Triple::x86_64:
8901 if (T.getEnvironment() == llvm::Triple::GNUX32)
8902 return "elf32_x86_64";
8903 return "elf_x86_64";
8904 default:
8905 llvm_unreachable("Unexpected arch");
8906 }
8907}
8908
Douglas Katzman95354292015-06-23 20:42:09 +00008909void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8910 const InputInfo &Output,
8911 const InputInfoList &Inputs,
8912 const ArgList &Args,
8913 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008914 const toolchains::Linux &ToolChain =
8915 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008916 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008917
8918 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8919 llvm::Triple Triple = llvm::Triple(TripleStr);
8920
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008921 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008922 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008923 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008924 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8925 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008926 const bool HasCRTBeginEndFiles =
8927 ToolChain.getTriple().hasEnvironment() ||
8928 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008929
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008930 ArgStringList CmdArgs;
8931
Rafael Espindolad1002f62010-11-15 18:28:16 +00008932 // Silence warning for "clang -g foo.o -o foo"
8933 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008934 // and "clang -emit-llvm foo.o -o foo"
8935 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008936 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008937 // handled somewhere else.
8938 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008939
Peter Collingbourne39719a72015-11-20 20:49:39 +00008940 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8941 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008942 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008943 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008944 CmdArgs.push_back("-target");
8945 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8946 }
8947
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008948 if (!D.SysRoot.empty())
8949 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008950
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008951 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008952 CmdArgs.push_back("-pie");
8953
Rafael Espindola1c76c592010-11-07 22:57:16 +00008954 if (Args.hasArg(options::OPT_rdynamic))
8955 CmdArgs.push_back("-export-dynamic");
8956
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008957 if (Args.hasArg(options::OPT_s))
8958 CmdArgs.push_back("-s");
8959
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008960 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008961 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008962
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008963 for (const auto &Opt : ToolChain.ExtraOpts)
8964 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008965
8966 if (!Args.hasArg(options::OPT_static)) {
8967 CmdArgs.push_back("--eh-frame-hdr");
8968 }
8969
8970 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008971 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008972
8973 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008974 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8975 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008976 CmdArgs.push_back("-Bstatic");
8977 else
8978 CmdArgs.push_back("-static");
8979 } else if (Args.hasArg(options::OPT_shared)) {
8980 CmdArgs.push_back("-shared");
8981 }
8982
Saleem Abdulrasoolf56c6d82016-02-07 06:03:38 +00008983 if (!Args.hasArg(options::OPT_static)) {
8984 if (Args.hasArg(options::OPT_rdynamic))
8985 CmdArgs.push_back("-export-dynamic");
8986
8987 if (!Args.hasArg(options::OPT_shared)) {
8988 const std::string Loader =
8989 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain);
8990 CmdArgs.push_back("-dynamic-linker");
8991 CmdArgs.push_back(Args.MakeArgString(Loader));
8992 }
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008993 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008994
8995 CmdArgs.push_back("-o");
8996 CmdArgs.push_back(Output.getFilename());
8997
Douglas Katzman78b37b02015-11-17 20:28:07 +00008998 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008999 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00009000 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009001 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00009002 if (Args.hasArg(options::OPT_pg))
9003 crt1 = "gcrt1.o";
9004 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009005 crt1 = "Scrt1.o";
9006 else
9007 crt1 = "crt1.o";
9008 }
9009 if (crt1)
9010 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009011
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009012 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9013 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009014
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009015 const char *crtbegin;
9016 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009017 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009018 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009019 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009020 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009021 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009022 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009023 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009024
9025 if (HasCRTBeginEndFiles)
9026 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00009027
9028 // Add crtfastmath.o if available and fast math is enabled.
9029 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009030 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009031
9032 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00009033 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009034
Douglas Katzman6059ef92015-11-17 17:41:23 +00009035 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009036
Teresa Johnson945bc502015-10-15 20:35:53 +00009037 if (D.isUsingLTO())
9038 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00009039
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00009040 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9041 CmdArgs.push_back("--no-demangle");
9042
Alexey Samsonov52550342014-09-15 19:58:40 +00009043 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009044 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009045 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00009046 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00009047
Douglas Katzman78b37b02015-11-17 20:28:07 +00009048 if (D.CCCIsCXX() &&
9049 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00009050 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009051 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009052 if (OnlyLibstdcxxStatic)
9053 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009054 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00009055 if (OnlyLibstdcxxStatic)
9056 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009057 CmdArgs.push_back("-lm");
9058 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00009059 // Silence warnings when linking C code with a C++ '-stdlib' argument.
9060 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009061
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009062 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00009063 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9064 if (Args.hasArg(options::OPT_static))
9065 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00009066
Alexey Samsonov52550342014-09-15 19:58:40 +00009067 if (NeedsSanitizerDeps)
9068 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
9069
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009070 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
9071 Args.hasArg(options::OPT_pthreads);
9072
9073 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9074 options::OPT_fno_openmp, false)) {
9075 // OpenMP runtimes implies pthreads when using the GNU toolchain.
9076 // FIXME: Does this really make sense for all GNU toolchains?
9077 WantPthread = true;
9078
9079 // Also link the particular OpenMP runtimes.
9080 switch (getOpenMPRuntime(ToolChain, Args)) {
9081 case OMPRT_OMP:
9082 CmdArgs.push_back("-lomp");
9083 break;
9084 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00009085 CmdArgs.push_back("-lgomp");
9086
9087 // FIXME: Exclude this for platforms with libgomp that don't require
9088 // librt. Most modern Linux platforms require it, but some may not.
9089 CmdArgs.push_back("-lrt");
9090 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009091 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00009092 CmdArgs.push_back("-liomp5");
9093 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009094 case OMPRT_Unknown:
9095 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00009096 break;
9097 }
Chandler Carruth01538002013-01-17 13:19:29 +00009098 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00009099
Renato Golinc4b49242014-02-13 10:01:16 +00009100 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009101
Richard Smith31d1de22015-05-20 22:48:44 +00009102 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00009103 CmdArgs.push_back("-lpthread");
9104
Rafael Espindolab17bc532016-01-25 18:29:16 +00009105 if (Args.hasArg(options::OPT_fsplit_stack))
9106 CmdArgs.push_back("--wrap=pthread_create");
9107
Chandler Carruth94a32012012-05-14 18:31:18 +00009108 CmdArgs.push_back("-lc");
9109
9110 if (Args.hasArg(options::OPT_static))
9111 CmdArgs.push_back("--end-group");
9112 else
Renato Golinc4b49242014-02-13 10:01:16 +00009113 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00009114 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00009115
Rafael Espindola81937ec2010-12-01 01:52:43 +00009116 if (!Args.hasArg(options::OPT_nostartfiles)) {
9117 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009118 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009119 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00009120 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00009121 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00009122 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009123 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00009124
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00009125 if (HasCRTBeginEndFiles)
9126 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00009127 if (!isAndroid)
9128 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00009129 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00009130 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00009131
Peter Collingbourne39719a72015-11-20 20:49:39 +00009132 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00009133}
9134
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009135// NaCl ARM assembly (inline or standalone) can be written with a set of macros
9136// for the various SFI requirements like register masking. The assembly tool
9137// inserts the file containing the macros as an input into all the assembly
9138// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00009139void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
9140 const InputInfo &Output,
9141 const InputInfoList &Inputs,
9142 const ArgList &Args,
9143 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00009144 const toolchains::NaClToolChain &ToolChain =
9145 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Justin Lebard98cea82016-01-11 23:15:21 +00009146 InputInfo NaClMacros(types::TY_PP_Asm, ToolChain.GetNaClArmMacrosPath(),
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009147 "nacl-arm-macros.s");
9148 InputInfoList NewInputs;
9149 NewInputs.push_back(NaClMacros);
9150 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00009151 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
9152 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009153}
9154
Douglas Katzman750cfc52015-06-29 18:42:16 +00009155// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009156// we use static by default, do not yet support sanitizers or LTO, and a few
9157// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00009158// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00009159void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9160 const InputInfo &Output,
9161 const InputInfoList &Inputs,
9162 const ArgList &Args,
9163 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009164
Douglas Katzman54366072015-07-27 16:53:08 +00009165 const toolchains::NaClToolChain &ToolChain =
9166 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009167 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009168 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009169 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009170 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009171
9172 ArgStringList CmdArgs;
9173
9174 // Silence warning for "clang -g foo.o -o foo"
9175 Args.ClaimAllArgs(options::OPT_g_Group);
9176 // and "clang -emit-llvm foo.o -o foo"
9177 Args.ClaimAllArgs(options::OPT_emit_llvm);
9178 // and for "clang -w foo.o -o foo". Other warning options are already
9179 // handled somewhere else.
9180 Args.ClaimAllArgs(options::OPT_w);
9181
9182 if (!D.SysRoot.empty())
9183 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9184
9185 if (Args.hasArg(options::OPT_rdynamic))
9186 CmdArgs.push_back("-export-dynamic");
9187
9188 if (Args.hasArg(options::OPT_s))
9189 CmdArgs.push_back("-s");
9190
Douglas Katzman54366072015-07-27 16:53:08 +00009191 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
9192 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009193 CmdArgs.push_back("--build-id");
9194
9195 if (!IsStatic)
9196 CmdArgs.push_back("--eh-frame-hdr");
9197
9198 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009199 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009200 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009201 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009202 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009203 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009204 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009205 else if (Arch == llvm::Triple::mipsel)
9206 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009207 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00009208 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
9209 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009210
9211 if (IsStatic)
9212 CmdArgs.push_back("-static");
9213 else if (Args.hasArg(options::OPT_shared))
9214 CmdArgs.push_back("-shared");
9215
9216 CmdArgs.push_back("-o");
9217 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00009218 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009219 if (!Args.hasArg(options::OPT_shared))
9220 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
9221 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
9222
9223 const char *crtbegin;
9224 if (IsStatic)
9225 crtbegin = "crtbeginT.o";
9226 else if (Args.hasArg(options::OPT_shared))
9227 crtbegin = "crtbeginS.o";
9228 else
9229 crtbegin = "crtbegin.o";
9230 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
9231 }
9232
9233 Args.AddAllArgs(CmdArgs, options::OPT_L);
9234 Args.AddAllArgs(CmdArgs, options::OPT_u);
9235
Douglas Katzman6059ef92015-11-17 17:41:23 +00009236 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009237
9238 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
9239 CmdArgs.push_back("--no-demangle");
9240
9241 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
9242
Douglas Katzman78b37b02015-11-17 20:28:07 +00009243 if (D.CCCIsCXX() &&
9244 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009245 bool OnlyLibstdcxxStatic =
9246 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009247 if (OnlyLibstdcxxStatic)
9248 CmdArgs.push_back("-Bstatic");
9249 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
9250 if (OnlyLibstdcxxStatic)
9251 CmdArgs.push_back("-Bdynamic");
9252 CmdArgs.push_back("-lm");
9253 }
9254
9255 if (!Args.hasArg(options::OPT_nostdlib)) {
9256 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9257 // Always use groups, since it has no effect on dynamic libraries.
9258 CmdArgs.push_back("--start-group");
9259 CmdArgs.push_back("-lc");
9260 // NaCl's libc++ currently requires libpthread, so just always include it
9261 // in the group for C++.
9262 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009263 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009264 // Gold, used by Mips, handles nested groups differently than ld, and
9265 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
9266 // which is not a desired behaviour here.
9267 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
9268 if (getToolChain().getArch() == llvm::Triple::mipsel)
9269 CmdArgs.push_back("-lnacl");
9270
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009271 CmdArgs.push_back("-lpthread");
9272 }
9273
9274 CmdArgs.push_back("-lgcc");
9275 CmdArgs.push_back("--as-needed");
9276 if (IsStatic)
9277 CmdArgs.push_back("-lgcc_eh");
9278 else
9279 CmdArgs.push_back("-lgcc_s");
9280 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00009281
9282 // Mips needs to create and use pnacl_legacy library that contains
9283 // definitions from bitcode/pnaclmm.c and definitions for
9284 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
9285 if (getToolChain().getArch() == llvm::Triple::mipsel)
9286 CmdArgs.push_back("-lpnacl_legacy");
9287
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009288 CmdArgs.push_back("--end-group");
9289 }
9290
9291 if (!Args.hasArg(options::OPT_nostartfiles)) {
9292 const char *crtend;
9293 if (Args.hasArg(options::OPT_shared))
9294 crtend = "crtendS.o";
9295 else
9296 crtend = "crtend.o";
9297
9298 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
9299 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
9300 }
9301 }
9302
Peter Collingbourne39719a72015-11-20 20:49:39 +00009303 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
9304 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00009305}
9306
Douglas Katzman95354292015-06-23 20:42:09 +00009307void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9308 const InputInfo &Output,
9309 const InputInfoList &Inputs,
9310 const ArgList &Args,
9311 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009312 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009313 ArgStringList CmdArgs;
9314
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009315 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009316
9317 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009318 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009319
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009320 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009321 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00009322
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009323 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009324 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009325}
9326
Douglas Katzman95354292015-06-23 20:42:09 +00009327void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9328 const InputInfo &Output,
9329 const InputInfoList &Inputs,
9330 const ArgList &Args,
9331 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009332 const Driver &D = getToolChain().getDriver();
9333 ArgStringList CmdArgs;
9334
Daniel Dunbarb440f562010-08-02 02:38:21 +00009335 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00009336 CmdArgs.push_back("-o");
9337 CmdArgs.push_back(Output.getFilename());
9338 } else {
9339 assert(Output.isNothing() && "Invalid output.");
9340 }
9341
Douglas Katzman78b37b02015-11-17 20:28:07 +00009342 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009343 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
9344 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
9345 CmdArgs.push_back(
9346 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
9347 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00009348 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009349
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009350 Args.AddAllArgs(CmdArgs,
9351 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00009352
Daniel Dunbar54423b22010-09-17 00:24:54 +00009353 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009354
Xinliang David Li69306c02015-10-22 06:15:31 +00009355 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00009356
Douglas Katzman78b37b02015-11-17 20:28:07 +00009357 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00009358 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009359 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00009360 CmdArgs.push_back("-lm");
9361 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00009362 }
9363
Douglas Katzman78b37b02015-11-17 20:28:07 +00009364 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00009365 if (Args.hasArg(options::OPT_pthread))
9366 CmdArgs.push_back("-lpthread");
9367 CmdArgs.push_back("-lc");
9368 CmdArgs.push_back("-lCompilerRT-Generic");
9369 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
9370 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009371 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009372 }
9373
Logan Chieneb9162f2014-06-26 14:23:45 +00009374 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009375 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00009376}
9377
Daniel Dunbarcc912342009-05-02 18:28:39 +00009378/// DragonFly Tools
9379
9380// For now, DragonFly Assemble does just about the same as for
9381// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00009382void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9383 const InputInfo &Output,
9384 const InputInfoList &Inputs,
9385 const ArgList &Args,
9386 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009387 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009388 ArgStringList CmdArgs;
9389
9390 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9391 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009392 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00009393 CmdArgs.push_back("--32");
9394
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009395 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009396
9397 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00009398 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009399
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009400 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00009401 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00009402
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009403 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009404 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009405}
9406
Douglas Katzman95354292015-06-23 20:42:09 +00009407void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9408 const InputInfo &Output,
9409 const InputInfoList &Inputs,
9410 const ArgList &Args,
9411 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00009412 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00009413 ArgStringList CmdArgs;
John McCall65b8da02013-04-11 22:55:55 +00009414
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00009415 if (!D.SysRoot.empty())
9416 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9417
John McCall65b8da02013-04-11 22:55:55 +00009418 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009419 if (Args.hasArg(options::OPT_static)) {
9420 CmdArgs.push_back("-Bstatic");
9421 } else {
John McCall65b8da02013-04-11 22:55:55 +00009422 if (Args.hasArg(options::OPT_rdynamic))
9423 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009424 if (Args.hasArg(options::OPT_shared))
9425 CmdArgs.push_back("-Bshareable");
9426 else {
9427 CmdArgs.push_back("-dynamic-linker");
9428 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
9429 }
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009430 CmdArgs.push_back("--hash-style=gnu");
9431 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009432 }
9433
9434 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9435 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009436 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009437 CmdArgs.push_back("-m");
9438 CmdArgs.push_back("elf_i386");
9439 }
9440
Daniel Dunbarb440f562010-08-02 02:38:21 +00009441 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009442 CmdArgs.push_back("-o");
9443 CmdArgs.push_back(Output.getFilename());
9444 } else {
9445 assert(Output.isNothing() && "Invalid output.");
9446 }
9447
Douglas Katzman78b37b02015-11-17 20:28:07 +00009448 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009449 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009450 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009451 CmdArgs.push_back(
9452 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009453 else {
9454 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009455 CmdArgs.push_back(
9456 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009457 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009458 CmdArgs.push_back(
9459 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009460 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009461 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009462 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009463 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009464 CmdArgs.push_back(
9465 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009466 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009467 CmdArgs.push_back(
9468 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009469 }
9470
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009471 Args.AddAllArgs(CmdArgs,
9472 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009473
Daniel Dunbar54423b22010-09-17 00:24:54 +00009474 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009475
Douglas Katzman78b37b02015-11-17 20:28:07 +00009476 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009477 CmdArgs.push_back("-L/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009478
9479 if (!Args.hasArg(options::OPT_static)) {
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009480 CmdArgs.push_back("-rpath");
9481 CmdArgs.push_back("/usr/lib/gcc50");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009482 }
9483
Hans Wennborg70850d82013-07-18 20:29:38 +00009484 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009485 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009486 CmdArgs.push_back("-lm");
9487 }
9488
Daniel Dunbarcc912342009-05-02 18:28:39 +00009489 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009490 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009491
9492 if (!Args.hasArg(options::OPT_nolibc)) {
9493 CmdArgs.push_back("-lc");
9494 }
9495
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009496 if (Args.hasArg(options::OPT_static) ||
9497 Args.hasArg(options::OPT_static_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009498 CmdArgs.push_back("-lgcc");
9499 CmdArgs.push_back("-lgcc_eh");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009500 } else {
9501 if (Args.hasArg(options::OPT_shared_libgcc)) {
John McCall65b8da02013-04-11 22:55:55 +00009502 CmdArgs.push_back("-lgcc_pic");
9503 if (!Args.hasArg(options::OPT_shared))
9504 CmdArgs.push_back("-lgcc");
Dimitry Andricf59a2b32015-12-27 10:01:44 +00009505 } else {
John McCall65b8da02013-04-11 22:55:55 +00009506 CmdArgs.push_back("-lgcc");
9507 CmdArgs.push_back("--as-needed");
9508 CmdArgs.push_back("-lgcc_pic");
9509 CmdArgs.push_back("--no-as-needed");
John McCall65b8da02013-04-11 22:55:55 +00009510 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009511 }
9512 }
9513
Douglas Katzman78b37b02015-11-17 20:28:07 +00009514 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009515 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009516 CmdArgs.push_back(
9517 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009518 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009519 CmdArgs.push_back(
9520 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9521 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009522 }
9523
Xinliang David Li69306c02015-10-22 06:15:31 +00009524 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009525
Logan Chieneb9162f2014-06-26 14:23:45 +00009526 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009527 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009528}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009529
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009530// Try to find Exe from a Visual Studio distribution. This first tries to find
9531// an installed copy of Visual Studio and, failing that, looks in the PATH,
9532// making sure that whatever executable that's found is not a same-named exe
9533// from clang itself to prevent clang from falling back to itself.
9534static std::string FindVisualStudioExecutable(const ToolChain &TC,
9535 const char *Exe,
9536 const char *ClangProgramPath) {
9537 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9538 std::string visualStudioBinDir;
9539 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9540 visualStudioBinDir)) {
9541 SmallString<128> FilePath(visualStudioBinDir);
9542 llvm::sys::path::append(FilePath, Exe);
9543 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9544 return FilePath.str();
9545 }
9546
9547 return Exe;
9548}
9549
Douglas Katzman95354292015-06-23 20:42:09 +00009550void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9551 const InputInfo &Output,
9552 const InputInfoList &Inputs,
9553 const ArgList &Args,
9554 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009555 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009556 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009557
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009558 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9559 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009560 CmdArgs.push_back(
9561 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009562
Douglas Katzman78b37b02015-11-17 20:28:07 +00009563 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9564 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009565 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009566
Zachary Turner10d75b22014-10-22 20:40:43 +00009567 if (!llvm::sys::Process::GetEnv("LIB")) {
9568 // If the VC environment hasn't been configured (perhaps because the user
9569 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009570 // the environment variable is set however, assume the user knows what
9571 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009572 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009573 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009574 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9575 SmallString<128> LibDir(VisualStudioDir);
9576 llvm::sys::path::append(LibDir, "VC", "lib");
9577 switch (MSVC.getArch()) {
9578 case llvm::Triple::x86:
9579 // x86 just puts the libraries directly in lib
9580 break;
9581 case llvm::Triple::x86_64:
9582 llvm::sys::path::append(LibDir, "amd64");
9583 break;
9584 case llvm::Triple::arm:
9585 llvm::sys::path::append(LibDir, "arm");
9586 break;
9587 default:
9588 break;
9589 }
9590 CmdArgs.push_back(
9591 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009592
9593 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9594 std::string UniversalCRTLibPath;
9595 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9596 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9597 UniversalCRTLibPath.c_str()));
9598 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009599 }
9600
9601 std::string WindowsSdkLibPath;
9602 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9603 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9604 WindowsSdkLibPath.c_str()));
9605 }
9606
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009607 CmdArgs.push_back("-nologo");
9608
Reid Kleckner124955a2015-08-05 18:51:13 +00009609 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009610 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009611
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009612 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009613 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009614 if (DLL) {
9615 CmdArgs.push_back(Args.MakeArgString("-dll"));
9616
9617 SmallString<128> ImplibName(Output.getFilename());
9618 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009619 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009620 }
9621
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009622 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009623 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009624 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009625 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009626 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9627 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009628 // Make sure the dynamic runtime thunk is not optimized out at link time
9629 // to ensure proper SEH handling.
9630 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009631 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009632 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009633 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009634 for (const auto &Lib : {"asan", "asan_cxx"})
9635 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009636 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009637 }
9638
Hans Wennborg2e274592013-08-13 23:38:57 +00009639 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009640
Alexey Bataevc7e84352015-08-19 04:49:01 +00009641 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9642 options::OPT_fno_openmp, false)) {
9643 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9644 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9645 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9646 TC.getDriver().Dir + "/../lib"));
9647 switch (getOpenMPRuntime(getToolChain(), Args)) {
9648 case OMPRT_OMP:
9649 CmdArgs.push_back("-defaultlib:libomp.lib");
9650 break;
9651 case OMPRT_IOMP5:
9652 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9653 break;
9654 case OMPRT_GOMP:
9655 break;
9656 case OMPRT_Unknown:
9657 // Already diagnosed.
9658 break;
9659 }
9660 }
9661
Reid Kleckner337188f2014-09-16 19:22:00 +00009662 // Add filenames, libraries, and other linker inputs.
9663 for (const auto &Input : Inputs) {
9664 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009665 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009666 continue;
9667 }
9668
9669 const Arg &A = Input.getInputArg();
9670
9671 // Render -l options differently for the MSVC linker.
9672 if (A.getOption().matches(options::OPT_l)) {
9673 StringRef Lib = A.getValue();
9674 const char *LinkLibArg;
9675 if (Lib.endswith(".lib"))
9676 LinkLibArg = Args.MakeArgString(Lib);
9677 else
9678 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9679 CmdArgs.push_back(LinkLibArg);
9680 continue;
9681 }
9682
9683 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9684 // or -L. Render it, even if MSVC doesn't understand it.
9685 A.renderAsInput(Args, CmdArgs);
9686 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009687
Nathan Slingerlande8ddf9e2016-01-05 18:27:06 +00009688 TC.addProfileRTLibs(Args, CmdArgs);
9689
Zachary Turner719f58c2014-12-01 23:06:47 +00009690 // We need to special case some linker paths. In the case of lld, we need to
9691 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9692 // linker, we need to use a special search algorithm.
9693 llvm::SmallString<128> linkPath;
9694 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9695 if (Linker.equals_lower("lld"))
9696 Linker = "lld-link";
9697
9698 if (Linker.equals_lower("link")) {
9699 // If we're using the MSVC linker, it's not sufficient to just use link
9700 // from the program PATH, because other environments like GnuWin32 install
9701 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009702 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009703 C.getDriver().getClangProgramPath());
9704 } else {
9705 linkPath = Linker;
9706 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009707 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009708 }
9709
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009710 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009711 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009712}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009713
Douglas Katzman95354292015-06-23 20:42:09 +00009714void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9715 const InputInfo &Output,
9716 const InputInfoList &Inputs,
9717 const ArgList &Args,
9718 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009719 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9720}
9721
Douglas Katzman95354292015-06-23 20:42:09 +00009722std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009723 Compilation &C, const JobAction &JA, const InputInfo &Output,
9724 const InputInfoList &Inputs, const ArgList &Args,
9725 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009726 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009727 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009728 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009729 CmdArgs.push_back("/W0"); // No warnings.
9730
9731 // The goal is to be able to invoke this tool correctly based on
9732 // any flag accepted by clang-cl.
9733
9734 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009735 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009736
9737 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009738 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9739 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9740 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009741 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9742 if (A->getOption().getID() == options::OPT_O0) {
9743 CmdArgs.push_back("/Od");
9744 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009745 CmdArgs.push_back("/Og");
9746
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009747 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009748 if (OptLevel == "s" || OptLevel == "z")
9749 CmdArgs.push_back("/Os");
9750 else
9751 CmdArgs.push_back("/Ot");
9752
9753 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009754 }
9755 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009756 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9757 options::OPT_fno_omit_frame_pointer))
9758 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9759 ? "/Oy"
9760 : "/Oy-");
9761 if (!Args.hasArg(options::OPT_fwritable_strings))
9762 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009763
Nico Weber3f8dafb2015-03-12 19:37:10 +00009764 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009765 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9766
David Majnemerf6072342014-07-01 22:24:56 +00009767 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9768 /*default=*/false))
9769 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009770 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9771 options::OPT_fno_function_sections))
9772 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9773 ? "/Gy"
9774 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009775 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9776 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009777 CmdArgs.push_back(
9778 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009779 if (Args.hasArg(options::OPT_fsyntax_only))
9780 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009781 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9782 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009783 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009784
Nico Weber3f8dafb2015-03-12 19:37:10 +00009785 std::vector<std::string> Includes =
9786 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009787 for (const auto &Include : Includes)
9788 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009789
Hans Wennborg87cfa712013-09-19 20:32:16 +00009790 // Flags that can simply be passed through.
9791 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9792 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
David Majnemerb8809092016-02-20 09:23:44 +00009793 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX);
9794 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_GX_);
Reid Klecknerc542d372014-06-27 17:02:02 +00009795 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009796 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009797
9798 // The order of these flags is relevant, so pick the last one.
9799 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9800 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9801 A->render(Args, CmdArgs);
9802
Ehsan Akhgarid8518332016-01-25 21:14:52 +00009803 // Pass through all unknown arguments so that the fallback command can see
9804 // them too.
9805 Args.AddAllArgs(CmdArgs, options::OPT_UNKNOWN);
9806
Hans Wennborg87cfa712013-09-19 20:32:16 +00009807 // Input filename.
9808 assert(Inputs.size() == 1);
9809 const InputInfo &II = Inputs[0];
9810 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9811 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9812 if (II.isFilename())
9813 CmdArgs.push_back(II.getFilename());
9814 else
9815 II.getInputArg().renderAsInput(Args, CmdArgs);
9816
9817 // Output filename.
9818 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009819 const char *Fo =
9820 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009821 CmdArgs.push_back(Fo);
9822
Hans Wennborg188382e2013-09-20 18:16:35 +00009823 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009824 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9825 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009826 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009827 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009828}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009829
Yaron Keren1c0070c2015-07-02 04:45:27 +00009830/// MinGW Tools
9831void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9832 const InputInfo &Output,
9833 const InputInfoList &Inputs,
9834 const ArgList &Args,
9835 const char *LinkingOutput) const {
9836 claimNoWarnArgs(Args);
9837 ArgStringList CmdArgs;
9838
9839 if (getToolChain().getArch() == llvm::Triple::x86) {
9840 CmdArgs.push_back("--32");
9841 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9842 CmdArgs.push_back("--64");
9843 }
9844
9845 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9846
9847 CmdArgs.push_back("-o");
9848 CmdArgs.push_back(Output.getFilename());
9849
9850 for (const auto &II : Inputs)
9851 CmdArgs.push_back(II.getFilename());
9852
9853 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009854 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009855
9856 if (Args.hasArg(options::OPT_gsplit_dwarf))
9857 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9858 SplitDebugName(Args, Inputs[0]));
9859}
9860
9861void MinGW::Linker::AddLibGCC(const ArgList &Args,
9862 ArgStringList &CmdArgs) const {
9863 if (Args.hasArg(options::OPT_mthreads))
9864 CmdArgs.push_back("-lmingwthrd");
9865 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009866
Yaron Kerenaa281332015-08-09 00:24:07 +00009867 // Make use of compiler-rt if --rtlib option is used
9868 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9869 if (RLT == ToolChain::RLT_Libgcc) {
9870 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9871 Args.hasArg(options::OPT_static);
9872 bool Shared = Args.hasArg(options::OPT_shared);
9873 bool CXX = getToolChain().getDriver().CCCIsCXX();
9874
9875 if (Static || (!CXX && !Shared)) {
9876 CmdArgs.push_back("-lgcc");
9877 CmdArgs.push_back("-lgcc_eh");
9878 } else {
9879 CmdArgs.push_back("-lgcc_s");
9880 CmdArgs.push_back("-lgcc");
9881 }
9882 } else {
9883 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9884 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009885
Yaron Keren1c0070c2015-07-02 04:45:27 +00009886 CmdArgs.push_back("-lmoldname");
9887 CmdArgs.push_back("-lmingwex");
9888 CmdArgs.push_back("-lmsvcrt");
9889}
9890
9891void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9892 const InputInfo &Output,
9893 const InputInfoList &Inputs,
9894 const ArgList &Args,
9895 const char *LinkingOutput) const {
9896 const ToolChain &TC = getToolChain();
9897 const Driver &D = TC.getDriver();
9898 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9899
9900 ArgStringList CmdArgs;
9901
9902 // Silence warning for "clang -g foo.o -o foo"
9903 Args.ClaimAllArgs(options::OPT_g_Group);
9904 // and "clang -emit-llvm foo.o -o foo"
9905 Args.ClaimAllArgs(options::OPT_emit_llvm);
9906 // and for "clang -w foo.o -o foo". Other warning options are already
9907 // handled somewhere else.
9908 Args.ClaimAllArgs(options::OPT_w);
9909
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009910 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9911 if (LinkerName.equals_lower("lld")) {
9912 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009913 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009914 } else if (!LinkerName.equals_lower("ld")) {
9915 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009916 }
9917
Yaron Keren1c0070c2015-07-02 04:45:27 +00009918 if (!D.SysRoot.empty())
9919 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9920
9921 if (Args.hasArg(options::OPT_s))
9922 CmdArgs.push_back("-s");
9923
9924 CmdArgs.push_back("-m");
9925 if (TC.getArch() == llvm::Triple::x86)
9926 CmdArgs.push_back("i386pe");
9927 if (TC.getArch() == llvm::Triple::x86_64)
9928 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009929 if (TC.getArch() == llvm::Triple::arm)
9930 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009931
9932 if (Args.hasArg(options::OPT_mwindows)) {
9933 CmdArgs.push_back("--subsystem");
9934 CmdArgs.push_back("windows");
9935 } else if (Args.hasArg(options::OPT_mconsole)) {
9936 CmdArgs.push_back("--subsystem");
9937 CmdArgs.push_back("console");
9938 }
9939
9940 if (Args.hasArg(options::OPT_static))
9941 CmdArgs.push_back("-Bstatic");
9942 else {
9943 if (Args.hasArg(options::OPT_mdll))
9944 CmdArgs.push_back("--dll");
9945 else if (Args.hasArg(options::OPT_shared))
9946 CmdArgs.push_back("--shared");
9947 CmdArgs.push_back("-Bdynamic");
9948 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9949 CmdArgs.push_back("-e");
9950 if (TC.getArch() == llvm::Triple::x86)
9951 CmdArgs.push_back("_DllMainCRTStartup@12");
9952 else
9953 CmdArgs.push_back("DllMainCRTStartup");
9954 CmdArgs.push_back("--enable-auto-image-base");
9955 }
9956 }
9957
9958 CmdArgs.push_back("-o");
9959 CmdArgs.push_back(Output.getFilename());
9960
9961 Args.AddAllArgs(CmdArgs, options::OPT_e);
9962 // FIXME: add -N, -n flags
9963 Args.AddLastArg(CmdArgs, options::OPT_r);
9964 Args.AddLastArg(CmdArgs, options::OPT_s);
9965 Args.AddLastArg(CmdArgs, options::OPT_t);
9966 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9967 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9968
Douglas Katzman78b37b02015-11-17 20:28:07 +00009969 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009970 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9971 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9972 } else {
9973 if (Args.hasArg(options::OPT_municode))
9974 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9975 else
9976 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9977 }
9978 if (Args.hasArg(options::OPT_pg))
9979 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9980 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9981 }
9982
9983 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009984 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009985 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9986
9987 // TODO: Add ASan stuff here
9988
9989 // TODO: Add profile stuff here
9990
Douglas Katzman78b37b02015-11-17 20:28:07 +00009991 if (D.CCCIsCXX() &&
9992 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009993 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9994 !Args.hasArg(options::OPT_static);
9995 if (OnlyLibstdcxxStatic)
9996 CmdArgs.push_back("-Bstatic");
9997 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9998 if (OnlyLibstdcxxStatic)
9999 CmdArgs.push_back("-Bdynamic");
10000 }
10001
10002 if (!Args.hasArg(options::OPT_nostdlib)) {
10003 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10004 if (Args.hasArg(options::OPT_static))
10005 CmdArgs.push_back("--start-group");
10006
10007 if (Args.hasArg(options::OPT_fstack_protector) ||
10008 Args.hasArg(options::OPT_fstack_protector_strong) ||
10009 Args.hasArg(options::OPT_fstack_protector_all)) {
10010 CmdArgs.push_back("-lssp_nonshared");
10011 CmdArgs.push_back("-lssp");
10012 }
10013 if (Args.hasArg(options::OPT_fopenmp))
10014 CmdArgs.push_back("-lgomp");
10015
10016 AddLibGCC(Args, CmdArgs);
10017
10018 if (Args.hasArg(options::OPT_pg))
10019 CmdArgs.push_back("-lgmon");
10020
Yaron Kerenadce68e2015-07-06 18:52:19 +000010021 if (Args.hasArg(options::OPT_pthread))
10022 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +000010023
10024 // add system libraries
10025 if (Args.hasArg(options::OPT_mwindows)) {
10026 CmdArgs.push_back("-lgdi32");
10027 CmdArgs.push_back("-lcomdlg32");
10028 }
10029 CmdArgs.push_back("-ladvapi32");
10030 CmdArgs.push_back("-lshell32");
10031 CmdArgs.push_back("-luser32");
10032 CmdArgs.push_back("-lkernel32");
10033
10034 if (Args.hasArg(options::OPT_static))
10035 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010036 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +000010037 AddLibGCC(Args, CmdArgs);
10038 }
10039
10040 if (!Args.hasArg(options::OPT_nostartfiles)) {
10041 // Add crtfastmath.o if available and fast math is enabled.
10042 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
10043
10044 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10045 }
10046 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +000010047 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +000010048 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +000010049}
10050
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010051/// XCore Tools
10052// We pass assemble and link construction to the xcc tool.
10053
Douglas Katzman95354292015-06-23 20:42:09 +000010054void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10055 const InputInfo &Output,
10056 const InputInfoList &Inputs,
10057 const ArgList &Args,
10058 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010059 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010060 ArgStringList CmdArgs;
10061
10062 CmdArgs.push_back("-o");
10063 CmdArgs.push_back(Output.getFilename());
10064
10065 CmdArgs.push_back("-c");
10066
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010067 if (Args.hasArg(options::OPT_v))
10068 CmdArgs.push_back("-v");
10069
Robert Lytton894d25c2014-05-02 09:33:25 +000010070 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
10071 if (!A->getOption().matches(options::OPT_g0))
10072 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010073
Robert Lytton8e95d4e2014-02-11 10:34:45 +000010074 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
10075 false))
10076 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010077
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010078 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010079
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010080 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010081 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010082
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010083 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010084 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010085}
10086
Douglas Katzman95354292015-06-23 20:42:09 +000010087void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10088 const InputInfo &Output,
10089 const InputInfoList &Inputs,
10090 const ArgList &Args,
10091 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010092 ArgStringList CmdArgs;
10093
10094 if (Output.isFilename()) {
10095 CmdArgs.push_back("-o");
10096 CmdArgs.push_back(Output.getFilename());
10097 } else {
10098 assert(Output.isNothing() && "Invalid output.");
10099 }
10100
Robert Lytton9e8c1a42014-02-13 10:40:12 +000010101 if (Args.hasArg(options::OPT_v))
10102 CmdArgs.push_back("-v");
10103
Reid Kleckner0bb1fc42015-07-10 22:25:44 +000010104 // Pass -fexceptions through to the linker if it was present.
10105 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
10106 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +000010107 CmdArgs.push_back("-fexceptions");
10108
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010109 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10110
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +000010111 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010112 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +000010113}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010114
Douglas Katzman95354292015-06-23 20:42:09 +000010115void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10116 const InputInfo &Output,
10117 const InputInfoList &Inputs,
10118 const ArgList &Args,
10119 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +000010120 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010121 const auto &TC =
10122 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10123 ArgStringList CmdArgs;
10124 const char *Exec;
10125
10126 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010127 default:
10128 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010129 case llvm::Triple::arm:
10130 case llvm::Triple::thumb:
10131 break;
10132 case llvm::Triple::x86:
10133 CmdArgs.push_back("--32");
10134 break;
10135 case llvm::Triple::x86_64:
10136 CmdArgs.push_back("--64");
10137 break;
10138 }
10139
10140 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10141
10142 CmdArgs.push_back("-o");
10143 CmdArgs.push_back(Output.getFilename());
10144
10145 for (const auto &Input : Inputs)
10146 CmdArgs.push_back(Input.getFilename());
10147
10148 const std::string Assembler = TC.GetProgramPath("as");
10149 Exec = Args.MakeArgString(Assembler);
10150
Justin Bognerd3371d82015-07-17 03:35:54 +000010151 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010152}
10153
Douglas Katzman95354292015-06-23 20:42:09 +000010154void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10155 const InputInfo &Output,
10156 const InputInfoList &Inputs,
10157 const ArgList &Args,
10158 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010159 const auto &TC =
10160 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
10161 const llvm::Triple &T = TC.getTriple();
10162 const Driver &D = TC.getDriver();
10163 SmallString<128> EntryPoint;
10164 ArgStringList CmdArgs;
10165 const char *Exec;
10166
10167 // Silence warning for "clang -g foo.o -o foo"
10168 Args.ClaimAllArgs(options::OPT_g_Group);
10169 // and "clang -emit-llvm foo.o -o foo"
10170 Args.ClaimAllArgs(options::OPT_emit_llvm);
10171 // and for "clang -w foo.o -o foo"
10172 Args.ClaimAllArgs(options::OPT_w);
10173 // Other warning options are already handled somewhere else.
10174
10175 if (!D.SysRoot.empty())
10176 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10177
10178 if (Args.hasArg(options::OPT_pie))
10179 CmdArgs.push_back("-pie");
10180 if (Args.hasArg(options::OPT_rdynamic))
10181 CmdArgs.push_back("-export-dynamic");
10182 if (Args.hasArg(options::OPT_s))
10183 CmdArgs.push_back("--strip-all");
10184
10185 CmdArgs.push_back("-m");
10186 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010187 default:
10188 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010189 case llvm::Triple::arm:
10190 case llvm::Triple::thumb:
10191 // FIXME: this is incorrect for WinCE
10192 CmdArgs.push_back("thumb2pe");
10193 break;
10194 case llvm::Triple::x86:
10195 CmdArgs.push_back("i386pe");
10196 EntryPoint.append("_");
10197 break;
10198 case llvm::Triple::x86_64:
10199 CmdArgs.push_back("i386pep");
10200 break;
10201 }
10202
10203 if (Args.hasArg(options::OPT_shared)) {
10204 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +000010205 default:
10206 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010207 case llvm::Triple::arm:
10208 case llvm::Triple::thumb:
10209 case llvm::Triple::x86_64:
10210 EntryPoint.append("_DllMainCRTStartup");
10211 break;
10212 case llvm::Triple::x86:
10213 EntryPoint.append("_DllMainCRTStartup@12");
10214 break;
10215 }
10216
10217 CmdArgs.push_back("-shared");
10218 CmdArgs.push_back("-Bdynamic");
10219
10220 CmdArgs.push_back("--enable-auto-image-base");
10221
10222 CmdArgs.push_back("--entry");
10223 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10224 } else {
10225 EntryPoint.append("mainCRTStartup");
10226
10227 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
10228 : "-Bdynamic");
10229
Douglas Katzman78b37b02015-11-17 20:28:07 +000010230 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010231 CmdArgs.push_back("--entry");
10232 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
10233 }
10234
10235 // FIXME: handle subsystem
10236 }
10237
10238 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +000010239 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010240
10241 CmdArgs.push_back("-o");
10242 CmdArgs.push_back(Output.getFilename());
10243
10244 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
10245 SmallString<261> ImpLib(Output.getFilename());
10246 llvm::sys::path::replace_extension(ImpLib, ".lib");
10247
10248 CmdArgs.push_back("--out-implib");
10249 CmdArgs.push_back(Args.MakeArgString(ImpLib));
10250 }
10251
Douglas Katzman78b37b02015-11-17 20:28:07 +000010252 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010253 const std::string CRTPath(D.SysRoot + "/usr/lib/");
10254 const char *CRTBegin;
10255
10256 CRTBegin =
10257 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
10258 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
10259 }
10260
10261 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010262 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010263 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
10264
10265 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
10266 !Args.hasArg(options::OPT_nodefaultlibs)) {
10267 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
10268 !Args.hasArg(options::OPT_static);
10269 if (StaticCXX)
10270 CmdArgs.push_back("-Bstatic");
10271 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
10272 if (StaticCXX)
10273 CmdArgs.push_back("-Bdynamic");
10274 }
10275
10276 if (!Args.hasArg(options::OPT_nostdlib)) {
10277 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
10278 // TODO handle /MT[d] /MD[d]
10279 CmdArgs.push_back("-lmsvcrt");
10280 AddRunTimeLibs(TC, D, CmdArgs, Args);
10281 }
10282 }
10283
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +000010284 if (TC.getSanitizerArgs().needsAsanRt()) {
10285 // TODO handle /MT[d] /MD[d]
10286 if (Args.hasArg(options::OPT_shared)) {
10287 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
10288 } else {
10289 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
10290 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
10291 // Make sure the dynamic runtime thunk is not optimized out at link time
10292 // to ensure proper SEH handling.
10293 CmdArgs.push_back(Args.MakeArgString("--undefined"));
10294 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
10295 ? "___asan_seh_interceptor"
10296 : "__asan_seh_interceptor"));
10297 }
10298 }
10299
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +000010300 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010301
Justin Bognerd3371d82015-07-17 03:35:54 +000010302 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +000010303}
Douglas Katzman84a75642015-06-19 14:55:19 +000010304
Douglas Katzman95354292015-06-23 20:42:09 +000010305void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
10306 const InputInfo &Output,
10307 const InputInfoList &Inputs,
10308 const ArgList &Args,
10309 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010310 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +000010311 assert(Inputs.size() == 1);
10312 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010313 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
10314 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +000010315
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010316 if (JA.getKind() == Action::PreprocessJobClass) {
10317 Args.ClaimAllArgs();
10318 CmdArgs.push_back("-E");
10319 } else {
10320 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
10321 CmdArgs.push_back("-S");
10322 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
10323 }
Douglas Katzman84a75642015-06-19 14:55:19 +000010324 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +000010325 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +000010326
Douglas Katzmanf6071112015-08-03 14:34:22 +000010327 // Append all -I, -iquote, -isystem paths, defines/undefines,
10328 // 'f' flags, optimize flags, and warning options.
10329 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +000010330 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +000010331 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +000010332 options::OPT_f_Group, options::OPT_f_clang_Group,
10333 options::OPT_g_Group, options::OPT_M_Group,
10334 options::OPT_O_Group, options::OPT_W_Group});
10335
10336 // If we're producing a dependency file, and assembly is the final action,
10337 // then the name of the target in the dependency file should be the '.o'
10338 // file, not the '.s' file produced by this step. For example, instead of
10339 // /tmp/mumble.s: mumble.c .../someheader.h
10340 // the filename on the lefthand side should be "mumble.o"
10341 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
10342 C.getActions().size() == 1 &&
10343 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
10344 Arg *A = Args.getLastArg(options::OPT_o);
10345 if (A) {
10346 CmdArgs.push_back("-MT");
10347 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
10348 }
10349 }
10350
Douglas Katzman84a75642015-06-19 14:55:19 +000010351 CmdArgs.push_back(II.getFilename());
10352 CmdArgs.push_back("-o");
10353 CmdArgs.push_back(Output.getFilename());
10354
10355 std::string Exec =
10356 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010357 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10358 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010359}
10360
Douglas Katzman95354292015-06-23 20:42:09 +000010361void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10362 const InputInfo &Output,
10363 const InputInfoList &Inputs,
10364 const ArgList &Args,
10365 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +000010366 ArgStringList CmdArgs;
10367
10368 assert(Inputs.size() == 1);
10369 const InputInfo &II = Inputs[0];
10370 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
10371 assert(Output.getType() == types::TY_Object);
10372
10373 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010374 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +000010375 CmdArgs.push_back("-noSPrefixing");
10376 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010377 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10378 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
10379 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +000010380 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +000010381 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +000010382 }
10383 CmdArgs.push_back("-elf"); // Output format.
10384 CmdArgs.push_back(II.getFilename());
10385 CmdArgs.push_back(
10386 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
10387
10388 std::string Exec =
10389 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +000010390 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10391 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +000010392}
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010393
10394void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10395 const InputInfo &Output,
10396 const InputInfoList &Inputs,
10397 const ArgList &Args,
10398 const char *LinkingOutput) const {
10399 const auto &TC =
10400 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
10401 const llvm::Triple &T = TC.getTriple();
10402 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +000010403 bool UseStartfiles =
10404 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +000010405 bool UseDefaultLibs =
10406 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010407
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010408 if (T.getArch() == llvm::Triple::sparc)
10409 CmdArgs.push_back("-EB");
10410 else // SHAVE assumes little-endian, and sparcel is expressly so.
10411 CmdArgs.push_back("-EL");
10412
10413 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
10414 // but we never pass through a --sysroot option and various other bits.
10415 // For example, there are no sanitizers (yet) nor gold linker.
10416
10417 // Eat some arguments that may be present but have no effect.
10418 Args.ClaimAllArgs(options::OPT_g_Group);
10419 Args.ClaimAllArgs(options::OPT_w);
10420 Args.ClaimAllArgs(options::OPT_static_libgcc);
10421
10422 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10423 CmdArgs.push_back("-s");
10424
10425 CmdArgs.push_back("-o");
10426 CmdArgs.push_back(Output.getFilename());
10427
10428 if (UseStartfiles) {
10429 // If you want startfiles, it means you want the builtin crti and crtbegin,
10430 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010431 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10432 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010433 }
10434
10435 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10436 options::OPT_e, options::OPT_s, options::OPT_t,
10437 options::OPT_Z_Flag, options::OPT_r});
10438
Douglas Katzman674a3122015-11-18 16:24:46 +000010439 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010440
10441 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10442
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010443 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010444 if (C.getDriver().CCCIsCXX())
10445 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010446 if (T.getOS() == llvm::Triple::RTEMS) {
10447 CmdArgs.push_back("--start-group");
10448 CmdArgs.push_back("-lc");
10449 // You must provide your own "-L" option to enable finding these.
10450 CmdArgs.push_back("-lrtemscpu");
10451 CmdArgs.push_back("-lrtemsbsp");
10452 CmdArgs.push_back("--end-group");
10453 } else {
10454 CmdArgs.push_back("-lc");
10455 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010456 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010457 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010458 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010459 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10460 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010461 }
10462
10463 std::string Exec =
10464 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10465 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10466 CmdArgs, Inputs));
10467}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010468
10469void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10470 const InputInfo &Output,
10471 const InputInfoList &Inputs,
10472 const ArgList &Args,
10473 const char *LinkingOutput) const {
10474 claimNoWarnArgs(Args);
10475 ArgStringList CmdArgs;
10476
10477 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10478
10479 CmdArgs.push_back("-o");
10480 CmdArgs.push_back(Output.getFilename());
10481
10482 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10483 const InputInfo &Input = Inputs[0];
10484 assert(Input.isFilename() && "Invalid input.");
10485 CmdArgs.push_back(Input.getFilename());
10486
10487 const char *Exec =
10488 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10489 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10490}
10491
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010492static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10493 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10494 if (SanArgs.needsUbsanRt()) {
10495 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10496 }
10497 if (SanArgs.needsAsanRt()) {
10498 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10499 }
10500}
10501
10502static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10503 const JobAction &JA, const InputInfo &Output,
10504 const InputInfoList &Inputs,
10505 const ArgList &Args,
10506 const char *LinkingOutput) {
10507 const toolchains::FreeBSD &ToolChain =
10508 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10509 const Driver &D = ToolChain.getDriver();
10510 ArgStringList CmdArgs;
10511
10512 // Silence warning for "clang -g foo.o -o foo"
10513 Args.ClaimAllArgs(options::OPT_g_Group);
10514 // and "clang -emit-llvm foo.o -o foo"
10515 Args.ClaimAllArgs(options::OPT_emit_llvm);
10516 // and for "clang -w foo.o -o foo". Other warning options are already
10517 // handled somewhere else.
10518 Args.ClaimAllArgs(options::OPT_w);
10519
10520 if (!D.SysRoot.empty())
10521 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10522
10523 if (Args.hasArg(options::OPT_pie))
10524 CmdArgs.push_back("-pie");
10525
10526 if (Args.hasArg(options::OPT_rdynamic))
10527 CmdArgs.push_back("-export-dynamic");
10528 if (Args.hasArg(options::OPT_shared))
10529 CmdArgs.push_back("--oformat=so");
10530
10531 if (Output.isFilename()) {
10532 CmdArgs.push_back("-o");
10533 CmdArgs.push_back(Output.getFilename());
10534 } else {
10535 assert(Output.isNothing() && "Invalid output.");
10536 }
10537
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010538 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10539
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010540 Args.AddAllArgs(CmdArgs, options::OPT_L);
10541 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10542 Args.AddAllArgs(CmdArgs, options::OPT_e);
10543 Args.AddAllArgs(CmdArgs, options::OPT_s);
10544 Args.AddAllArgs(CmdArgs, options::OPT_t);
10545 Args.AddAllArgs(CmdArgs, options::OPT_r);
10546
10547 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10548 CmdArgs.push_back("--no-demangle");
10549
10550 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10551
10552 if (Args.hasArg(options::OPT_pthread)) {
10553 CmdArgs.push_back("-lpthread");
10554 }
10555
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010556 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10557
10558 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10559}
10560
10561static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10562 const JobAction &JA, const InputInfo &Output,
10563 const InputInfoList &Inputs,
10564 const ArgList &Args,
10565 const char *LinkingOutput) {
10566 const toolchains::FreeBSD &ToolChain =
10567 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10568 const Driver &D = ToolChain.getDriver();
10569 ArgStringList CmdArgs;
10570
10571 // Silence warning for "clang -g foo.o -o foo"
10572 Args.ClaimAllArgs(options::OPT_g_Group);
10573 // and "clang -emit-llvm foo.o -o foo"
10574 Args.ClaimAllArgs(options::OPT_emit_llvm);
10575 // and for "clang -w foo.o -o foo". Other warning options are already
10576 // handled somewhere else.
10577 Args.ClaimAllArgs(options::OPT_w);
10578
10579 if (!D.SysRoot.empty())
10580 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10581
10582 if (Args.hasArg(options::OPT_pie))
10583 CmdArgs.push_back("-pie");
10584
10585 if (Args.hasArg(options::OPT_static)) {
10586 CmdArgs.push_back("-Bstatic");
10587 } else {
10588 if (Args.hasArg(options::OPT_rdynamic))
10589 CmdArgs.push_back("-export-dynamic");
10590 CmdArgs.push_back("--eh-frame-hdr");
10591 if (Args.hasArg(options::OPT_shared)) {
10592 CmdArgs.push_back("-Bshareable");
10593 } else {
10594 CmdArgs.push_back("-dynamic-linker");
10595 CmdArgs.push_back("/libexec/ld-elf.so.1");
10596 }
10597 CmdArgs.push_back("--enable-new-dtags");
10598 }
10599
10600 if (Output.isFilename()) {
10601 CmdArgs.push_back("-o");
10602 CmdArgs.push_back(Output.getFilename());
10603 } else {
10604 assert(Output.isNothing() && "Invalid output.");
10605 }
10606
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010607 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10608
Douglas Katzman78b37b02015-11-17 20:28:07 +000010609 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010610 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010611 if (!Args.hasArg(options::OPT_shared)) {
10612 if (Args.hasArg(options::OPT_pg))
10613 crt1 = "gcrt1.o";
10614 else if (Args.hasArg(options::OPT_pie))
10615 crt1 = "Scrt1.o";
10616 else
10617 crt1 = "crt1.o";
10618 }
10619 if (crt1)
10620 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10621
10622 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10623
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010624 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010625 if (Args.hasArg(options::OPT_static))
10626 crtbegin = "crtbeginT.o";
10627 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10628 crtbegin = "crtbeginS.o";
10629 else
10630 crtbegin = "crtbegin.o";
10631
10632 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10633 }
10634
10635 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010636 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010637 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10638 Args.AddAllArgs(CmdArgs, options::OPT_e);
10639 Args.AddAllArgs(CmdArgs, options::OPT_s);
10640 Args.AddAllArgs(CmdArgs, options::OPT_t);
10641 Args.AddAllArgs(CmdArgs, options::OPT_r);
10642
10643 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10644 CmdArgs.push_back("--no-demangle");
10645
10646 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10647
Douglas Katzman78b37b02015-11-17 20:28:07 +000010648 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010649 // For PS4, we always want to pass libm, libstdc++ and libkernel
10650 // libraries for both C and C++ compilations.
10651 CmdArgs.push_back("-lkernel");
10652 if (D.CCCIsCXX()) {
10653 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10654 if (Args.hasArg(options::OPT_pg))
10655 CmdArgs.push_back("-lm_p");
10656 else
10657 CmdArgs.push_back("-lm");
10658 }
10659 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10660 // the default system libraries. Just mimic this for now.
10661 if (Args.hasArg(options::OPT_pg))
10662 CmdArgs.push_back("-lgcc_p");
10663 else
10664 CmdArgs.push_back("-lcompiler_rt");
10665 if (Args.hasArg(options::OPT_static)) {
10666 CmdArgs.push_back("-lstdc++");
10667 } else if (Args.hasArg(options::OPT_pg)) {
10668 CmdArgs.push_back("-lgcc_eh_p");
10669 } else {
10670 CmdArgs.push_back("--as-needed");
10671 CmdArgs.push_back("-lstdc++");
10672 CmdArgs.push_back("--no-as-needed");
10673 }
10674
10675 if (Args.hasArg(options::OPT_pthread)) {
10676 if (Args.hasArg(options::OPT_pg))
10677 CmdArgs.push_back("-lpthread_p");
10678 else
10679 CmdArgs.push_back("-lpthread");
10680 }
10681
10682 if (Args.hasArg(options::OPT_pg)) {
10683 if (Args.hasArg(options::OPT_shared))
10684 CmdArgs.push_back("-lc");
10685 else {
10686 if (Args.hasArg(options::OPT_static)) {
10687 CmdArgs.push_back("--start-group");
10688 CmdArgs.push_back("-lc_p");
10689 CmdArgs.push_back("-lpthread_p");
10690 CmdArgs.push_back("--end-group");
10691 } else {
10692 CmdArgs.push_back("-lc_p");
10693 }
10694 }
10695 CmdArgs.push_back("-lgcc_p");
10696 } else {
10697 if (Args.hasArg(options::OPT_static)) {
10698 CmdArgs.push_back("--start-group");
10699 CmdArgs.push_back("-lc");
10700 CmdArgs.push_back("-lpthread");
10701 CmdArgs.push_back("--end-group");
10702 } else {
10703 CmdArgs.push_back("-lc");
10704 }
10705 CmdArgs.push_back("-lcompiler_rt");
10706 }
10707
10708 if (Args.hasArg(options::OPT_static)) {
10709 CmdArgs.push_back("-lstdc++");
10710 } else if (Args.hasArg(options::OPT_pg)) {
10711 CmdArgs.push_back("-lgcc_eh_p");
10712 } else {
10713 CmdArgs.push_back("--as-needed");
10714 CmdArgs.push_back("-lstdc++");
10715 CmdArgs.push_back("--no-as-needed");
10716 }
10717 }
10718
Douglas Katzman78b37b02015-11-17 20:28:07 +000010719 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010720 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10721 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10722 else
10723 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10724 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10725 }
10726
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010727 const char *Exec =
10728#ifdef LLVM_ON_WIN32
Sumanth Gundapanenice7fc172015-12-16 20:18:12 +000010729 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold"));
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010730#else
10731 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10732#endif
10733
10734 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10735}
10736
10737void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10738 const InputInfo &Output,
10739 const InputInfoList &Inputs,
10740 const ArgList &Args,
10741 const char *LinkingOutput) const {
10742 const toolchains::FreeBSD &ToolChain =
10743 static_cast<const toolchains::FreeBSD &>(getToolChain());
10744 const Driver &D = ToolChain.getDriver();
10745 bool PS4Linker;
10746 StringRef LinkerOptName;
10747 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10748 LinkerOptName = A->getValue();
10749 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10750 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10751 }
10752
10753 if (LinkerOptName == "gold")
10754 PS4Linker = false;
10755 else if (LinkerOptName == "ps4")
10756 PS4Linker = true;
10757 else
10758 PS4Linker = !Args.hasArg(options::OPT_shared);
10759
10760 if (PS4Linker)
10761 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10762 else
10763 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10764}
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010765
10766void NVPTX::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
10767 const InputInfo &Output,
10768 const InputInfoList &Inputs,
10769 const ArgList &Args,
10770 const char *LinkingOutput) const {
10771 const auto &TC =
10772 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010773 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010774
10775 std::vector<std::string> gpu_archs =
10776 Args.getAllArgValues(options::OPT_march_EQ);
10777 assert(gpu_archs.size() == 1 && "Exactly one GPU Arch required for ptxas.");
10778 const std::string& gpu_arch = gpu_archs[0];
10779
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010780 ArgStringList CmdArgs;
10781 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-m64" : "-m32");
Artem Belevich0a0e54c2016-02-16 22:03:20 +000010782 if (Args.getLastArg(options::OPT_cuda_noopt_device_debug)) {
10783 // ptxas does not accept -g option if optimization is enabled, so
10784 // we ignore the compiler's -O* options if we want debug info.
10785 CmdArgs.push_back("-g");
10786 CmdArgs.push_back("--dont-merge-basicblocks");
10787 CmdArgs.push_back("--return-at-end");
10788 } else if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
10789 // Map the -O we received to -O{0,1,2,3}.
10790 //
10791 // TODO: Perhaps we should map host -O2 to ptxas -O3. -O3 is ptxas's
10792 // default, so it may correspond more closely to the spirit of clang -O2.
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010793
Justin Lebar2836dcd2016-01-19 19:52:21 +000010794 // -O3 seems like the least-bad option when -Osomething is specified to
10795 // clang but it isn't handled below.
10796 StringRef OOpt = "3";
10797 if (A->getOption().matches(options::OPT_O4) ||
10798 A->getOption().matches(options::OPT_Ofast))
10799 OOpt = "3";
10800 else if (A->getOption().matches(options::OPT_O0))
10801 OOpt = "0";
10802 else if (A->getOption().matches(options::OPT_O)) {
10803 // -Os, -Oz, and -O(anything else) map to -O2, for lack of better options.
10804 OOpt = llvm::StringSwitch<const char *>(A->getValue())
10805 .Case("1", "1")
10806 .Case("2", "2")
10807 .Case("3", "3")
10808 .Case("s", "2")
10809 .Case("z", "2")
10810 .Default("2");
10811 }
10812 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("-O") + OOpt));
10813 } else {
10814 // If no -O was passed, pass -O0 to ptxas -- no opt flag should correspond
10815 // to no optimizations, but ptxas's default is -O3.
10816 CmdArgs.push_back("-O0");
10817 }
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010818
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010819 CmdArgs.push_back("--gpu-name");
10820 CmdArgs.push_back(Args.MakeArgString(gpu_arch));
10821 CmdArgs.push_back("--output-file");
10822 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10823 for (const auto& II : Inputs)
10824 CmdArgs.push_back(Args.MakeArgString(II.getFilename()));
10825
10826 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_ptxas))
10827 CmdArgs.push_back(Args.MakeArgString(A));
10828
10829 const char *Exec = Args.MakeArgString(TC.GetProgramPath("ptxas"));
10830 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10831}
10832
10833// All inputs to this linker must be from CudaDeviceActions, as we need to look
10834// at the Inputs' Actions in order to figure out which GPU architecture they
10835// correspond to.
10836void NVPTX::Linker::ConstructJob(Compilation &C, const JobAction &JA,
10837 const InputInfo &Output,
10838 const InputInfoList &Inputs,
10839 const ArgList &Args,
10840 const char *LinkingOutput) const {
10841 const auto &TC =
10842 static_cast<const toolchains::CudaToolChain &>(getToolChain());
Justin Lebarb2db4502016-01-23 21:28:08 +000010843 assert(TC.getTriple().isNVPTX() && "Wrong platform");
Justin Lebar21e5d4f2016-01-14 21:41:27 +000010844
10845 ArgStringList CmdArgs;
10846 CmdArgs.push_back("--cuda");
10847 CmdArgs.push_back(TC.getTriple().isArch64Bit() ? "-64" : "-32");
10848 CmdArgs.push_back(Args.MakeArgString("--create"));
10849 CmdArgs.push_back(Args.MakeArgString(Output.getFilename()));
10850
10851 for (const auto& II : Inputs) {
10852 auto* A = cast<const CudaDeviceAction>(II.getAction());
10853 // We need to pass an Arch of the form "sm_XX" for cubin files and
10854 // "compute_XX" for ptx.
10855 const char *Arch = (II.getType() == types::TY_PP_Asm)
10856 ? A->getComputeArchName()
10857 : A->getGpuArchName();
10858 CmdArgs.push_back(Args.MakeArgString(llvm::Twine("--image=profile=") +
10859 Arch + ",file=" + II.getFilename()));
10860 }
10861
10862 for (const auto& A : Args.getAllArgValues(options::OPT_Xcuda_fatbinary))
10863 CmdArgs.push_back(Args.MakeArgString(A));
10864
10865 const char *Exec = Args.MakeArgString(TC.GetProgramPath("fatbinary"));
10866 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10867}