blob: a73c0863d0ae4699491d6502d24b10930e58e05b [file] [log] [blame]
Eugene Zelenkod4304d22015-11-04 21:37:17 +00001//===--- Tools.cpp - Tools Implementations ----------------------*- C++ -*-===//
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "Tools.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000011#include "InputInfo.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000012#include "ToolChains.h"
Ben Langmuire056ec32015-02-04 18:34:23 +000013#include "clang/Basic/CharInfo.h"
Josh Mageee0fc1a82014-02-11 01:35:14 +000014#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000015#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000016#include "clang/Basic/Version.h"
Rafael Espindola3e34e652015-02-03 16:33:53 +000017#include "clang/Config/config.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000018#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000019#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000020#include "clang/Driver/Driver.h"
21#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000022#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000023#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000024#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000025#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000026#include "clang/Driver/Util.h"
Benjamin Kramer33335df2015-03-01 21:36:40 +000027#include "llvm/ADT/STLExtras.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000028#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000029#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000030#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000031#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000032#include "llvm/Option/Arg.h"
33#include "llvm/Option/ArgList.h"
34#include "llvm/Option/Option.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000035#include "llvm/Support/CodeGen.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000036#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000037#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000038#include "llvm/Support/FileSystem.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000039#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000040#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000041#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000042#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000043#include "llvm/Support/raw_ostream.h"
James Y Knight5bdf7ab2015-08-19 15:12:02 +000044#include "llvm/Support/TargetParser.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000045
Ben Langmuir3b7b5402015-02-03 19:28:37 +000046#ifdef LLVM_ON_UNIX
47#include <unistd.h> // For getuid().
48#endif
49
Daniel Dunbar1a093d22009-03-18 06:00:36 +000050using namespace clang::driver;
51using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000052using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000053using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000054
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +000055static const char *getSparcAsmModeForCPU(StringRef Name,
56 const llvm::Triple &Triple) {
57 if (Triple.getArch() == llvm::Triple::sparcv9) {
58 return llvm::StringSwitch<const char *>(Name)
59 .Case("niagara", "-Av9b")
60 .Case("niagara2", "-Av9b")
61 .Case("niagara3", "-Av9d")
62 .Case("niagara4", "-Av9d")
63 .Default("-Av9");
64 } else {
65 return llvm::StringSwitch<const char *>(Name)
66 .Case("v8", "-Av8")
67 .Case("supersparc", "-Av8")
68 .Case("sparclite", "-Asparclite")
69 .Case("f934", "-Asparclite")
70 .Case("hypersparc", "-Av8")
71 .Case("sparclite86x", "-Asparclite")
72 .Case("sparclet", "-Asparclet")
73 .Case("tsc701", "-Asparclet")
74 .Case("v9", "-Av8plus")
75 .Case("ultrasparc", "-Av8plus")
76 .Case("ultrasparc3", "-Av8plus")
77 .Case("niagara", "-Av8plusb")
78 .Case("niagara2", "-Av8plusb")
79 .Case("niagara3", "-Av8plusd")
80 .Case("niagara4", "-Av8plusd")
81 .Default("-Av8");
82 }
83}
84
Daniel Dunbar64198ef2009-09-10 01:21:05 +000085/// CheckPreprocessingOptions - Perform some validation of preprocessing
86/// arguments that is shared with gcc.
87static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000088 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
89 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
90 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000091 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000092 << A->getBaseArg().getAsString(Args)
93 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
94 }
95 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000096}
97
Daniel Dunbar4eadb602009-09-10 01:21:12 +000098/// CheckCodeGenerationOptions - Perform some validation of code generation
99/// arguments that is shared with gcc.
100static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
101 // In gcc, only ARM checks this, but it seems reasonable to check universally.
102 if (Args.hasArg(options::OPT_static))
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000103 if (const Arg *A =
104 Args.getLastArg(options::OPT_dynamic, options::OPT_mdynamic_no_pic))
105 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
106 << "-static";
Daniel Dunbar4eadb602009-09-10 01:21:12 +0000107}
108
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000109// Add backslashes to escape spaces and other backslashes.
110// This is used for the space-separated argument list specified with
111// the -dwarf-debug-flags option.
112static void EscapeSpacesAndBackslashes(const char *Arg,
113 SmallVectorImpl<char> &Res) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000114 for (; *Arg; ++Arg) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000115 switch (*Arg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000116 default:
117 break;
Bob Wilsond5aad2a2014-11-04 22:28:48 +0000118 case ' ':
119 case '\\':
120 Res.push_back('\\');
121 break;
122 }
123 Res.push_back(*Arg);
124 }
125}
126
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000127// Quote target names for inclusion in GNU Make dependency files.
128// Only the characters '$', '#', ' ', '\t' are quoted.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000129static void QuoteTarget(StringRef Target, SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000130 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
131 switch (Target[i]) {
132 case ' ':
133 case '\t':
134 // Escape the preceding backslashes
135 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
136 Res.push_back('\\');
137
138 // Escape the space/tab
139 Res.push_back('\\');
140 break;
141 case '$':
142 Res.push_back('$');
143 break;
144 case '#':
145 Res.push_back('\\');
146 break;
147 default:
148 break;
149 }
150
151 Res.push_back(Target[i]);
152 }
153}
154
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000155static void addDirectoryList(const ArgList &Args, ArgStringList &CmdArgs,
156 const char *ArgName, const char *EnvVar) {
Bill Wendlingc0938f32012-03-12 22:10:06 +0000157 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000158 bool CombinedArg = false;
159
Bill Wendling281ca292012-03-12 21:22:35 +0000160 if (!DirList)
161 return; // Nothing to do.
162
Chad Rosier616e8a52012-10-30 21:42:09 +0000163 StringRef Name(ArgName);
164 if (Name.equals("-I") || Name.equals("-L"))
165 CombinedArg = true;
166
Bill Wendling281ca292012-03-12 21:22:35 +0000167 StringRef Dirs(DirList);
168 if (Dirs.empty()) // Empty string should not add '.'.
169 return;
170
171 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000172 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000173 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000174 if (CombinedArg) {
175 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
176 } else {
177 CmdArgs.push_back(ArgName);
178 CmdArgs.push_back(".");
179 }
Bill Wendling281ca292012-03-12 21:22:35 +0000180 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000181 if (CombinedArg) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000182 CmdArgs.push_back(
183 Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
Chad Rosier616e8a52012-10-30 21:42:09 +0000184 } else {
185 CmdArgs.push_back(ArgName);
186 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
187 }
Bill Wendling281ca292012-03-12 21:22:35 +0000188 }
Nico Weber89355782012-03-19 15:00:03 +0000189 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000190 }
191
192 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000193 if (CombinedArg) {
194 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
195 } else {
196 CmdArgs.push_back(ArgName);
197 CmdArgs.push_back(".");
198 }
Bill Wendling281ca292012-03-12 21:22:35 +0000199 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000200 if (CombinedArg) {
201 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
202 } else {
203 CmdArgs.push_back(ArgName);
204 CmdArgs.push_back(Args.MakeArgString(Dirs));
205 }
Bill Wendling281ca292012-03-12 21:22:35 +0000206 }
207}
208
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000209static void AddLinkerInputs(const ToolChain &TC, const InputInfoList &Inputs,
210 const ArgList &Args, ArgStringList &CmdArgs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000211 const Driver &D = TC.getDriver();
212
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000213 // Add extra linker input arguments which are not treated as inputs
214 // (constructed via -Xarch_).
215 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
216
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000217 for (const auto &II : Inputs) {
Eric Christopherc1984072015-12-08 02:10:19 +0000218 if (!TC.HasNativeLLVMSupport() && types::isLLVMIR(II.getType()))
Daniel Dunbar54423b22010-09-17 00:24:54 +0000219 // Don't try to pass LLVM inputs unless we have native support.
Eric Christopherc1984072015-12-08 02:10:19 +0000220 D.Diag(diag::err_drv_no_linker_llvm_support) << TC.getTripleString();
Daniel Dunbar54423b22010-09-17 00:24:54 +0000221
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000222 // Add filenames immediately.
223 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000224 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000225 continue;
226 }
227
228 // Otherwise, this is a linker input argument.
229 const Arg &A = II.getInputArg();
230
231 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000232 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000233 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000234 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000235 TC.AddCCKextLibArgs(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000236 else if (A.getOption().matches(options::OPT_z)) {
237 // Pass -z prefix for gcc linker compatibility.
238 A.claim();
239 A.render(Args, CmdArgs);
240 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000241 A.renderAsInput(Args, CmdArgs);
Arthur Marble31fb6f42014-07-16 21:16:16 +0000242 }
Daniel Dunbar54423b22010-09-17 00:24:54 +0000243 }
Bill Wendling281ca292012-03-12 21:22:35 +0000244
245 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000246 // and only supported on native toolchains.
247 if (!TC.isCrossCompiling())
248 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000249}
250
John McCall31168b02011-06-15 23:02:42 +0000251/// \brief Determine whether Objective-C automated reference counting is
252/// enabled.
253static bool isObjCAutoRefCount(const ArgList &Args) {
254 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
255}
256
Ted Kremeneke65b0862012-03-06 20:05:56 +0000257/// \brief Determine whether we are linking the ObjC runtime.
258static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000259 if (isObjCAutoRefCount(Args)) {
260 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000261 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000262 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000263 return Args.hasArg(options::OPT_fobjc_link_runtime);
264}
265
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000266static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000267 // Don't forward inputs from the original command line. They are added from
268 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000269 return O.getKind() != Option::InputClass &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000270 !O.hasFlag(options::DriverOption) && !O.hasFlag(options::LinkerInput);
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000271}
272
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000273void Clang::AddPreprocessingOptions(Compilation &C, const JobAction &JA,
274 const Driver &D, const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000275 ArgStringList &CmdArgs,
276 const InputInfo &Output,
Artem Belevichfa11ab52015-11-17 22:28:46 +0000277 const InputInfoList &Inputs,
278 const ToolChain *AuxToolChain) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000279 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000280
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000281 CheckPreprocessingOptions(D, Args);
282
283 Args.AddLastArg(CmdArgs, options::OPT_C);
284 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000285
286 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000287 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000288 (A = Args.getLastArg(options::OPT_MD)) ||
289 (A = Args.getLastArg(options::OPT_MMD))) {
290 // Determine the output location.
291 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000292 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000293 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000294 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000295 } else if (Output.getType() == types::TY_Dependencies) {
296 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000297 } else if (A->getOption().matches(options::OPT_M) ||
298 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000299 DepFile = "-";
300 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000301 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000302 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 }
304 CmdArgs.push_back("-dependency-file");
305 CmdArgs.push_back(DepFile);
306
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000307 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000308 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
309 const char *DepTarget;
310
311 // If user provided -o, that is the dependency target, except
312 // when we are only generating a dependency file.
313 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
314 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000315 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000316 } else {
317 // Otherwise derive from the base input.
318 //
319 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000320 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000321 llvm::sys::path::replace_extension(P, "o");
322 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000323 }
324
325 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000326 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000327 QuoteTarget(DepTarget, Quoted);
328 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000329 }
330
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000331 if (A->getOption().matches(options::OPT_M) ||
332 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000333 CmdArgs.push_back("-sys-header-deps");
Manuel Klimekc68aa162015-03-19 12:00:22 +0000334 if ((isa<PrecompileJobAction>(JA) &&
335 !Args.hasArg(options::OPT_fno_module_file_deps)) ||
336 Args.hasArg(options::OPT_fmodule_file_deps))
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000337 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000338 }
339
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000340 if (Args.hasArg(options::OPT_MG)) {
341 if (!A || A->getOption().matches(options::OPT_MD) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000342 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000343 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000344 CmdArgs.push_back("-MG");
345 }
346
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000347 Args.AddLastArg(CmdArgs, options::OPT_MP);
Paul Robinsond7214a72015-04-27 18:14:32 +0000348 Args.AddLastArg(CmdArgs, options::OPT_MV);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000349
350 // Convert all -MQ <target> args to -MT <quoted target>
Sean Silva14facf32015-06-09 01:57:17 +0000351 for (const Arg *A : Args.filtered(options::OPT_MT, options::OPT_MQ)) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000352 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000353
Daniel Dunbara442fd52010-06-11 22:00:13 +0000354 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000355 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000356 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000357 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000358 CmdArgs.push_back(Args.MakeArgString(Quoted));
359
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000360 // -MT flag - no change
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000361 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000362 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000363 }
364 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000365
Douglas Gregor111af7d2009-04-18 00:34:01 +0000366 // Add -i* options, and automatically translate to
367 // -include-pch/-include-pth for transparent PCH support. It's
368 // wonky, but we include looking for .gch so we can support seamless
369 // replacement into a build system already set up to be generating
370 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000371 bool RenderedImplicitInclude = false;
Sean Silva14facf32015-06-09 01:57:17 +0000372 for (const Arg *A : Args.filtered(options::OPT_clang_i_Group)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000373 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000374 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
375 RenderedImplicitInclude = true;
376
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000377 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000378 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000379
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000380 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000381 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000382 SmallString<128> P(A->getValue());
383 // We want the files to have a name like foo.h.pch. Add a dummy extension
384 // so that replace_extension does the right thing.
385 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000386 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000387 llvm::sys::path::replace_extension(P, "pch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000388 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000389 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391
Douglas Gregor111af7d2009-04-18 00:34:01 +0000392 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000393 llvm::sys::path::replace_extension(P, "pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000394 if (llvm::sys::fs::exists(P))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000395 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000396 }
397
Douglas Gregor111af7d2009-04-18 00:34:01 +0000398 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000399 llvm::sys::path::replace_extension(P, "gch");
Yaron Keren92e1b622015-03-18 10:17:07 +0000400 if (llvm::sys::fs::exists(P)) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000401 FoundPCH = UsePCH;
402 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000403 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000404 }
405
406 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000407 if (IsFirstImplicitInclude) {
408 A->claim();
409 if (UsePCH)
410 CmdArgs.push_back("-include-pch");
411 else
412 CmdArgs.push_back("-include-pth");
Yaron Keren92e1b622015-03-18 10:17:07 +0000413 CmdArgs.push_back(Args.MakeArgString(P));
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000414 continue;
415 } else {
416 // Ignore the PCH if not first on command line and emit warning.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000417 D.Diag(diag::warn_drv_pch_not_first_include) << P
418 << A->getAsString(Args);
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000419 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000420 }
421 }
422
423 // Not translated, render as usual.
424 A->claim();
425 A->render(Args, CmdArgs);
426 }
427
Douglas Katzman57a9c7e2015-07-29 18:39:14 +0000428 Args.AddAllArgs(CmdArgs,
429 {options::OPT_D, options::OPT_U, options::OPT_I_Group,
430 options::OPT_F, options::OPT_index_header_map});
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000431
Douglas Katzman9dc81a42015-10-02 14:41:38 +0000432 // Add -Wp, and -Xpreprocessor if using the preprocessor.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000433
434 // FIXME: There is a very unfortunate problem here, some troubled
435 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
436 // really support that we would have to parse and then translate
437 // those options. :(
438 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
439 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000440
441 // -I- is a deprecated GCC feature, reject it.
442 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000443 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000444
445 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
446 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000447 StringRef sysroot = C.getSysRoot();
448 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000449 if (!Args.hasArg(options::OPT_isysroot)) {
450 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000451 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000452 }
453 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000454
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000455 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000456 // FIXME: We should probably sink the logic for handling these from the
457 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000458 // CPATH - included following the user specified includes (but prior to
459 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000460 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000461 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000462 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000463 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000464 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000465 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000466 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000467 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000468 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000469
Artem Belevichfa11ab52015-11-17 22:28:46 +0000470 // Optional AuxToolChain indicates that we need to include headers
471 // for more than one target. If that's the case, add include paths
472 // from AuxToolChain right after include paths of the same kind for
473 // the current target.
474
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000475 // Add C++ include arguments, if needed.
Artem Belevichfa11ab52015-11-17 22:28:46 +0000476 if (types::isCXX(Inputs[0].getType())) {
Chandler Carruth491db322011-11-04 07:34:47 +0000477 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000478 if (AuxToolChain)
479 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
480 }
Chandler Carrutha796f532011-11-05 20:17:13 +0000481
482 // Add system include arguments.
483 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Artem Belevichfa11ab52015-11-17 22:28:46 +0000484 if (AuxToolChain)
485 AuxToolChain->AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
486
487 // Add CUDA include arguments, if needed.
488 if (types::isCuda(Inputs[0].getType()))
489 getToolChain().AddCudaIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000490}
491
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000492// FIXME: Move to target hook.
493static bool isSignedCharDefault(const llvm::Triple &Triple) {
494 switch (Triple.getArch()) {
495 default:
496 return true;
497
Tim Northover9bb857a2013-01-31 12:13:10 +0000498 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000499 case llvm::Triple::aarch64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000500 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000501 case llvm::Triple::armeb:
Oliver Stannardabed2ee2014-10-24 11:28:47 +0000502 case llvm::Triple::thumb:
503 case llvm::Triple::thumbeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000504 if (Triple.isOSDarwin() || Triple.isOSWindows())
505 return true;
506 return false;
507
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000508 case llvm::Triple::ppc:
509 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000510 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000511 return true;
512 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000513
David Majnemerdcecd932015-05-23 19:23:55 +0000514 case llvm::Triple::hexagon:
Bill Schmidt778d3872013-07-26 01:36:11 +0000515 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000516 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000517 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000518 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000519 }
520}
521
Robert Lytton0e076492013-08-13 09:43:10 +0000522static bool isNoCommonDefault(const llvm::Triple &Triple) {
523 switch (Triple.getArch()) {
524 default:
525 return false;
526
527 case llvm::Triple::xcore:
Dan Gohmanc2853072015-09-03 22:51:53 +0000528 case llvm::Triple::wasm32:
529 case llvm::Triple::wasm64:
Robert Lytton0e076492013-08-13 09:43:10 +0000530 return true;
531 }
532}
533
Renato Goline17c5802015-07-27 23:44:42 +0000534// ARM tools start.
535
536// Get SubArch (vN).
537static int getARMSubArchVersionNumber(const llvm::Triple &Triple) {
538 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000539 return llvm::ARM::parseArchVersion(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000540}
541
542// True if M-profile.
543static bool isARMMProfile(const llvm::Triple &Triple) {
544 llvm::StringRef Arch = Triple.getArchName();
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000545 unsigned Profile = llvm::ARM::parseArchProfile(Arch);
Renato Goline17c5802015-07-27 23:44:42 +0000546 return Profile == llvm::ARM::PK_M;
547}
548
549// Get Arch/CPU from args.
Renato Golin7c542b42015-07-27 23:44:45 +0000550static void getARMArchCPUFromArgs(const ArgList &Args, llvm::StringRef &Arch,
551 llvm::StringRef &CPU, bool FromAs = false) {
Renato Goline17c5802015-07-27 23:44:42 +0000552 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
553 CPU = A->getValue();
554 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
555 Arch = A->getValue();
Renato Golin7c542b42015-07-27 23:44:45 +0000556 if (!FromAs)
557 return;
558
559 for (const Arg *A :
560 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
561 StringRef Value = A->getValue();
562 if (Value.startswith("-mcpu="))
563 CPU = Value.substr(6);
564 if (Value.startswith("-march="))
565 Arch = Value.substr(7);
566 }
Renato Goline17c5802015-07-27 23:44:42 +0000567}
568
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000569// Handle -mhwdiv=.
Renato Golin7c542b42015-07-27 23:44:45 +0000570// FIXME: Use ARMTargetParser.
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000571static void getARMHWDivFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000572 const ArgList &Args, StringRef HWDiv,
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000573 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000574 unsigned HWDivID = llvm::ARM::parseHWDiv(HWDiv);
575 if (!llvm::ARM::getHWDivFeatures(HWDivID, Features))
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000576 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
577}
Reid Kleckner0290c9c2014-09-15 17:45:39 +0000578
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000579// Handle -mfpu=.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000580static void getARMFPUFeatures(const Driver &D, const Arg *A,
Renato Golin7c542b42015-07-27 23:44:45 +0000581 const ArgList &Args, StringRef FPU,
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000582 std::vector<const char *> &Features) {
Chandler Carruthaa0caeb2015-08-30 02:16:36 +0000583 unsigned FPUID = llvm::ARM::parseFPU(FPU);
584 if (!llvm::ARM::getFPUFeatures(FPUID, Features))
Chad Rosiercfbfc582012-04-04 20:51:35 +0000585 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
586}
587
Bradley Smithbbf5a002015-11-18 16:33:48 +0000588// Decode ARM features from string like +[no]featureA+[no]featureB+...
589static bool DecodeARMFeatures(const Driver &D, StringRef text,
590 std::vector<const char *> &Features) {
591 SmallVector<StringRef, 8> Split;
592 text.split(Split, StringRef("+"), -1, false);
593
594 for (StringRef Feature : Split) {
595 const char *FeatureName = llvm::ARM::getArchExtFeature(Feature);
596 if (FeatureName)
597 Features.push_back(FeatureName);
598 else
599 return false;
600 }
601 return true;
602}
603
Renato Golin7c542b42015-07-27 23:44:45 +0000604// Check if -march is valid by checking if it can be canonicalised and parsed.
605// getARMArch is used here instead of just checking the -march value in order
606// to handle -march=native correctly.
607static void checkARMArchName(const Driver &D, const Arg *A, const ArgList &Args,
Renato Goline17c5802015-07-27 23:44:42 +0000608 llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000609 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000610 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000611 std::pair<StringRef, StringRef> Split = ArchName.split("+");
612
Renato Goline17c5802015-07-27 23:44:42 +0000613 std::string MArch = arm::getARMArch(ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000614 if (llvm::ARM::parseArch(MArch) == llvm::ARM::AK_INVALID ||
615 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000616 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000617}
618
Renato Golin7c542b42015-07-27 23:44:45 +0000619// Check -mcpu=. Needs ArchName to handle -mcpu=generic.
620static void checkARMCPUName(const Driver &D, const Arg *A, const ArgList &Args,
621 llvm::StringRef CPUName, llvm::StringRef ArchName,
Bradley Smithbbf5a002015-11-18 16:33:48 +0000622 std::vector<const char *> &Features,
Renato Goline17c5802015-07-27 23:44:42 +0000623 const llvm::Triple &Triple) {
Bradley Smithbbf5a002015-11-18 16:33:48 +0000624 std::pair<StringRef, StringRef> Split = CPUName.split("+");
625
Renato Goline17c5802015-07-27 23:44:42 +0000626 std::string CPU = arm::getARMTargetCPU(CPUName, ArchName, Triple);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000627 if (arm::getLLVMArchSuffixForARM(CPU, ArchName, Triple).empty() ||
628 (Split.second.size() && !DecodeARMFeatures(D, Split.second, Features)))
Renato Goline17c5802015-07-27 23:44:42 +0000629 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
John Brawn94fd9632015-05-21 12:19:49 +0000630}
631
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000632static bool useAAPCSForMachO(const llvm::Triple &T) {
633 // The backend is hardwired to assume AAPCS for M-class processors, ensure
634 // the frontend matches that.
635 return T.getEnvironment() == llvm::Triple::EABI ||
636 T.getOS() == llvm::Triple::UnknownOS || isARMMProfile(T);
637}
638
Asiri Rathnayake9e3c7cb2014-10-03 09:11:41 +0000639// Select the float ABI as determined by -msoft-float, -mhard-float, and
640// -mfloat-abi=.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000641arm::FloatABI arm::getARMFloatABI(const ToolChain &TC, const ArgList &Args) {
642 const Driver &D = TC.getDriver();
643 const llvm::Triple Triple(TC.ComputeEffectiveClangTriple(Args));
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000644 auto SubArch = getARMSubArchVersionNumber(Triple);
645 arm::FloatABI ABI = FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000646 if (Arg *A =
647 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
648 options::OPT_mfloat_abi_EQ)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000649 if (A->getOption().matches(options::OPT_msoft_float)) {
650 ABI = FloatABI::Soft;
651 } else if (A->getOption().matches(options::OPT_mhard_float)) {
652 ABI = FloatABI::Hard;
653 } else {
654 ABI = llvm::StringSwitch<arm::FloatABI>(A->getValue())
655 .Case("soft", FloatABI::Soft)
656 .Case("softfp", FloatABI::SoftFP)
657 .Case("hard", FloatABI::Hard)
658 .Default(FloatABI::Invalid);
659 if (ABI == FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000660 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000661 ABI = FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000662 }
663 }
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000664
665 // It is incorrect to select hard float ABI on MachO platforms if the ABI is
666 // "apcs-gnu".
667 if (Triple.isOSBinFormatMachO() && !useAAPCSForMachO(Triple) &&
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000668 ABI == FloatABI::Hard) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000669 D.Diag(diag::err_drv_unsupported_opt_for_target) << A->getAsString(Args)
670 << Triple.getArchName();
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000671 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000672 }
673
674 // If unspecified, choose the default based on the platform.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000675 if (ABI == FloatABI::Invalid) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000676 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000677 case llvm::Triple::Darwin:
678 case llvm::Triple::MacOSX:
Tim Northover756447a2015-10-30 16:30:36 +0000679 case llvm::Triple::IOS:
680 case llvm::Triple::TvOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000681 // Darwin defaults to "softfp" for v6 and v7.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000682 ABI = (SubArch == 6 || SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Daniel Dunbar78485922009-09-10 23:00:09 +0000683 break;
684 }
Tim Northover756447a2015-10-30 16:30:36 +0000685 case llvm::Triple::WatchOS:
686 ABI = FloatABI::Hard;
687 break;
Daniel Dunbar78485922009-09-10 23:00:09 +0000688
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000689 // FIXME: this is invalid for WindowsCE
690 case llvm::Triple::Win32:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000691 ABI = FloatABI::Hard;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000692 break;
693
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000694 case llvm::Triple::FreeBSD:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000695 switch (Triple.getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +0000696 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000697 ABI = FloatABI::Hard;
Renato Golinf4421f72014-02-19 10:44:07 +0000698 break;
699 default:
700 // FreeBSD defaults to soft float
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000701 ABI = FloatABI::Soft;
Renato Golinf4421f72014-02-19 10:44:07 +0000702 break;
703 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000704 break;
705
Daniel Dunbar78485922009-09-10 23:00:09 +0000706 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000707 switch (Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000708 case llvm::Triple::GNUEABIHF:
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000709 case llvm::Triple::EABIHF:
710 ABI = FloatABI::Hard;
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000711 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000712 case llvm::Triple::GNUEABI:
Bob Wilsond1447c42011-02-04 17:59:28 +0000713 case llvm::Triple::EABI:
714 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000715 ABI = FloatABI::SoftFP;
Bob Wilsond1447c42011-02-04 17:59:28 +0000716 break;
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000717 case llvm::Triple::Android:
718 ABI = (SubArch == 7) ? FloatABI::SoftFP : FloatABI::Soft;
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000719 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000720 default:
721 // Assume "soft", but warn the user we are guessing.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000722 ABI = FloatABI::Soft;
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000723 if (Triple.getOS() != llvm::Triple::UnknownOS ||
724 !Triple.isOSBinFormatMachO())
725 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000726 break;
727 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000728 }
729 }
730
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000731 assert(ABI != FloatABI::Invalid && "must select an ABI");
732 return ABI;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000733}
734
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000735static void getARMTargetFeatures(const ToolChain &TC,
736 const llvm::Triple &Triple,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000737 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000738 std::vector<const char *> &Features,
739 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000740 const Driver &D = TC.getDriver();
741
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000742 bool KernelOrKext =
743 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000744 arm::FloatABI ABI = arm::getARMFloatABI(TC, Args);
Renato Golin7c542b42015-07-27 23:44:45 +0000745 const Arg *WaCPU = nullptr, *WaFPU = nullptr;
746 const Arg *WaHDiv = nullptr, *WaArch = nullptr;
747
Nico Weber6e0ebae2015-04-29 21:16:40 +0000748 if (!ForAS) {
749 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
750 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
751 // stripped out by the ARM target. We should probably pass this a new
752 // -target-option, which is handled by the -cc1/-cc1as invocation.
753 //
754 // FIXME2: For consistency, it would be ideal if we set up the target
755 // machine state the same when using the frontend or the assembler. We don't
756 // currently do that for the assembler, we pass the options directly to the
757 // backend and never even instantiate the frontend TargetInfo. If we did,
758 // and used its handleTargetFeatures hook, then we could ensure the
759 // assembler and the frontend behave the same.
760
761 // Use software floating point operations?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000762 if (ABI == arm::FloatABI::Soft)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000763 Features.push_back("+soft-float");
764
765 // Use software floating point argument passing?
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000766 if (ABI != arm::FloatABI::Hard)
Nico Weber6e0ebae2015-04-29 21:16:40 +0000767 Features.push_back("+soft-float-abi");
Renato Golin7c542b42015-07-27 23:44:45 +0000768 } else {
769 // Here, we make sure that -Wa,-mfpu/cpu/arch/hwdiv will be passed down
770 // to the assembler correctly.
771 for (const Arg *A :
772 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
773 StringRef Value = A->getValue();
774 if (Value.startswith("-mfpu=")) {
775 WaFPU = A;
776 } else if (Value.startswith("-mcpu=")) {
777 WaCPU = A;
778 } else if (Value.startswith("-mhwdiv=")) {
779 WaHDiv = A;
780 } else if (Value.startswith("-march=")) {
781 WaArch = A;
782 }
783 }
Nico Weber6e0ebae2015-04-29 21:16:40 +0000784 }
785
Renato Golin7c542b42015-07-27 23:44:45 +0000786 // Check -march. ClangAs gives preference to -Wa,-march=.
787 const Arg *ArchArg = Args.getLastArg(options::OPT_march_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000788 StringRef ArchName;
Renato Golin7c542b42015-07-27 23:44:45 +0000789 if (WaArch) {
790 if (ArchArg)
791 D.Diag(clang::diag::warn_drv_unused_argument)
792 << ArchArg->getAsString(Args);
793 ArchName = StringRef(WaArch->getValue()).substr(7);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000794 checkARMArchName(D, WaArch, Args, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000795 // FIXME: Set Arch.
796 D.Diag(clang::diag::warn_drv_unused_argument) << WaArch->getAsString(Args);
797 } else if (ArchArg) {
798 ArchName = ArchArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000799 checkARMArchName(D, ArchArg, Args, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000800 }
801
Renato Golin7c542b42015-07-27 23:44:45 +0000802 // Check -mcpu. ClangAs gives preference to -Wa,-mcpu=.
803 const Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ);
Renato Goline17c5802015-07-27 23:44:42 +0000804 StringRef CPUName;
Renato Golin7c542b42015-07-27 23:44:45 +0000805 if (WaCPU) {
806 if (CPUArg)
807 D.Diag(clang::diag::warn_drv_unused_argument)
808 << CPUArg->getAsString(Args);
809 CPUName = StringRef(WaCPU->getValue()).substr(6);
Bradley Smithbbf5a002015-11-18 16:33:48 +0000810 checkARMCPUName(D, WaCPU, Args, CPUName, ArchName, Features, Triple);
Renato Golin7c542b42015-07-27 23:44:45 +0000811 } else if (CPUArg) {
812 CPUName = CPUArg->getValue();
Bradley Smithbbf5a002015-11-18 16:33:48 +0000813 checkARMCPUName(D, CPUArg, Args, CPUName, ArchName, Features, Triple);
John Brawn94fd9632015-05-21 12:19:49 +0000814 }
John Brawna95c1a82015-05-08 12:52:18 +0000815
Renato Golin23459c62015-07-30 16:40:17 +0000816 // Add CPU features for generic CPUs
817 if (CPUName == "native") {
818 llvm::StringMap<bool> HostFeatures;
819 if (llvm::sys::getHostCPUFeatures(HostFeatures))
820 for (auto &F : HostFeatures)
821 Features.push_back(
822 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
823 }
824
825 // Honor -mfpu=. ClangAs gives preference to -Wa,-mfpu=.
826 const Arg *FPUArg = Args.getLastArg(options::OPT_mfpu_EQ);
827 if (WaFPU) {
828 if (FPUArg)
829 D.Diag(clang::diag::warn_drv_unused_argument)
830 << FPUArg->getAsString(Args);
831 getARMFPUFeatures(D, WaFPU, Args, StringRef(WaFPU->getValue()).substr(6),
832 Features);
833 } else if (FPUArg) {
834 getARMFPUFeatures(D, FPUArg, Args, FPUArg->getValue(), Features);
835 }
836
837 // Honor -mhwdiv=. ClangAs gives preference to -Wa,-mhwdiv=.
838 const Arg *HDivArg = Args.getLastArg(options::OPT_mhwdiv_EQ);
839 if (WaHDiv) {
840 if (HDivArg)
841 D.Diag(clang::diag::warn_drv_unused_argument)
842 << HDivArg->getAsString(Args);
843 getARMHWDivFeatures(D, WaHDiv, Args,
844 StringRef(WaHDiv->getValue()).substr(8), Features);
845 } else if (HDivArg)
846 getARMHWDivFeatures(D, HDivArg, Args, HDivArg->getValue(), Features);
847
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000848 // Setting -msoft-float effectively disables NEON because of the GCC
849 // implementation, although the same isn't true of VFP or VFP3.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000850 if (ABI == arm::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000851 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000852 // Also need to explicitly disable features which imply NEON.
853 Features.push_back("-crypto");
854 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000855
Eric Christopher269c2a22015-04-04 03:34:43 +0000856 // En/disable crc code generation.
857 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bernard Ogden18b57012013-10-29 09:47:51 +0000858 if (A->getOption().matches(options::OPT_mcrc))
859 Features.push_back("+crc");
860 else
861 Features.push_back("-crc");
862 }
Vladimir Sukharevc6dab752015-05-14 08:25:18 +0000863
864 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v8_1a) {
865 Features.insert(Features.begin(), "+v8.1a");
866 }
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000867
Akira Hatanakac2694822015-07-07 08:28:42 +0000868 // Look for the last occurrence of -mlong-calls or -mno-long-calls. If
869 // neither options are specified, see if we are compiling for kernel/kext and
870 // decide whether to pass "+long-calls" based on the OS and its version.
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000871 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
872 options::OPT_mno_long_calls)) {
873 if (A->getOption().matches(options::OPT_mlong_calls))
874 Features.push_back("+long-calls");
Tim Northover756447a2015-10-30 16:30:36 +0000875 } else if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
876 !Triple.isWatchOS()) {
Akira Hatanaka3fb33a52015-07-07 06:42:05 +0000877 Features.push_back("+long-calls");
878 }
Akira Hatanaka580efb22015-07-16 00:43:00 +0000879
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000880 // Kernel code has more strict alignment requirements.
881 if (KernelOrKext)
882 Features.push_back("+strict-align");
883 else if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
884 options::OPT_munaligned_access)) {
885 if (A->getOption().matches(options::OPT_munaligned_access)) {
886 // No v6M core supports unaligned memory access (v6M ARM ARM A3.2).
887 if (Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
888 D.Diag(diag::err_target_unsupported_unaligned) << "v6m";
889 } else
890 Features.push_back("+strict-align");
891 } else {
892 // Assume pre-ARMv6 doesn't support unaligned accesses.
893 //
894 // ARMv6 may or may not support unaligned accesses depending on the
895 // SCTLR.U bit, which is architecture-specific. We assume ARMv6
896 // Darwin and NetBSD targets support unaligned accesses, and others don't.
897 //
898 // ARMv7 always has SCTLR.U set to 1, but it has a new SCTLR.A bit
899 // which raises an alignment fault on unaligned accesses. Linux
900 // defaults this bit to 0 and handles it as a system-wide (not
901 // per-process) setting. It is therefore safe to assume that ARMv7+
902 // Linux targets support unaligned accesses. The same goes for NaCl.
903 //
904 // The above behavior is consistent with GCC.
905 int VersionNum = getARMSubArchVersionNumber(Triple);
906 if (Triple.isOSDarwin() || Triple.isOSNetBSD()) {
Alexandros Lamprineaseda554a2015-10-05 12:45:10 +0000907 if (VersionNum < 6 ||
908 Triple.getSubArch() == llvm::Triple::SubArchType::ARMSubArch_v6m)
Akira Hatanaka7651dd82015-07-28 22:26:45 +0000909 Features.push_back("+strict-align");
910 } else if (Triple.isOSLinux() || Triple.isOSNaCl()) {
911 if (VersionNum < 7)
912 Features.push_back("+strict-align");
913 } else
914 Features.push_back("+strict-align");
915 }
916
Akira Hatanaka0a23fac2015-07-21 01:41:08 +0000917 // llvm does not support reserving registers in general. There is support
918 // for reserving r9 on ARM though (defined as a platform-specific register
919 // in ARM EABI).
920 if (Args.hasArg(options::OPT_ffixed_r9))
921 Features.push_back("+reserve-r9");
922
Akira Hatanaka580efb22015-07-16 00:43:00 +0000923 // The kext linker doesn't know how to deal with movw/movt.
924 if (KernelOrKext)
925 Features.push_back("+no-movt");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000926}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000927
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +0000928void Clang::AddARMTargetArgs(const llvm::Triple &Triple, const ArgList &Args,
929 ArgStringList &CmdArgs, bool KernelOrKext) const {
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000930 // Select the ABI to use.
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000931 // FIXME: Support -meabi.
Eric Christopher52276532014-12-10 22:58:34 +0000932 // FIXME: Parts of this are duplicated in the backend, unify this somehow.
Craig Topper92fc2df2014-05-17 16:56:41 +0000933 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000934 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000935 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000936 } else if (Triple.isOSBinFormatMachO()) {
Akira Hatanaka9d99bb52015-08-26 19:00:11 +0000937 if (useAAPCSForMachO(Triple)) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000938 ABIName = "aapcs";
Tim Northover756447a2015-10-30 16:30:36 +0000939 } else if (Triple.isWatchOS()) {
940 ABIName = "aapcs16";
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000941 } else {
942 ABIName = "apcs-gnu";
943 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000944 } else if (Triple.isOSWindows()) {
945 // FIXME: this is invalid for WindowsCE
946 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000947 } else {
948 // Select the default based on the platform.
Douglas Katzmana67e50c2015-06-26 15:47:46 +0000949 switch (Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000950 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000951 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000952 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000953 ABIName = "aapcs-linux";
954 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000955 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000956 case llvm::Triple::EABI:
957 ABIName = "aapcs";
958 break;
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000959 default:
Eric Christopher7a8b31d2014-12-18 02:08:51 +0000960 if (Triple.getOS() == llvm::Triple::NetBSD)
961 ABIName = "apcs-gnu";
962 else
963 ABIName = "aapcs";
Oliver Stannardec8b6b32014-09-04 10:38:53 +0000964 break;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000965 }
966 }
967 CmdArgs.push_back("-target-abi");
968 CmdArgs.push_back(ABIName);
969
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000970 // Determine floating point ABI from the options & target defaults.
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +0000971 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000972 if (ABI == arm::FloatABI::Soft) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000973 // Floating point operations and argument passing are soft.
Daniel Dunbar78485922009-09-10 23:00:09 +0000974 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000975 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000976 CmdArgs.push_back("-mfloat-abi");
977 CmdArgs.push_back("soft");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000978 } else if (ABI == arm::FloatABI::SoftFP) {
Daniel Dunbar78485922009-09-10 23:00:09 +0000979 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000980 CmdArgs.push_back("-mfloat-abi");
981 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000982 } else {
983 // Floating point operations and argument passing are hard.
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +0000984 assert(ABI == arm::FloatABI::Hard && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000985 CmdArgs.push_back("-mfloat-abi");
986 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000987 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000988
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000989 // Forward the -mglobal-merge option for explicit control over the pass.
Chad Rosierba3df1d2011-08-26 00:26:29 +0000990 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
991 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000992 CmdArgs.push_back("-backend-option");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000993 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +0000994 CmdArgs.push_back("-arm-global-merge=false");
995 else
996 CmdArgs.push_back("-arm-global-merge=true");
Chad Rosierba3df1d2011-08-26 00:26:29 +0000997 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000998
Bob Wilson9c8af452013-04-11 18:53:25 +0000999 if (!Args.hasFlag(options::OPT_mimplicit_float,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001000 options::OPT_mno_implicit_float, true))
Chad Rosierf1985d22012-05-16 20:40:09 +00001001 CmdArgs.push_back("-no-implicit-float");
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001002}
Renato Goline17c5802015-07-27 23:44:42 +00001003// ARM tools end.
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00001004
Tim Northover573cbee2014-05-24 12:52:07 +00001005/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
1006/// targeting.
1007static std::string getAArch64TargetCPU(const ArgList &Args) {
Kevin Qin110db6f2014-07-18 07:03:22 +00001008 Arg *A;
1009 std::string CPU;
1010 // If we have -mtune or -mcpu, use that.
1011 if ((A = Args.getLastArg(options::OPT_mtune_EQ))) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00001012 CPU = StringRef(A->getValue()).lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00001013 } else if ((A = Args.getLastArg(options::OPT_mcpu_EQ))) {
Renato Golin4045f662015-05-08 15:44:36 +00001014 StringRef Mcpu = A->getValue();
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00001015 CPU = Mcpu.split("+").first.lower();
Tim Northovera2ee4332014-03-29 15:09:45 +00001016 }
1017
Kevin Qin110db6f2014-07-18 07:03:22 +00001018 // Handle CPU name is 'native'.
1019 if (CPU == "native")
1020 return llvm::sys::getHostCPUName();
1021 else if (CPU.size())
1022 return CPU;
Tim Northovera2ee4332014-03-29 15:09:45 +00001023
James Molloy9b1586b2014-04-17 12:51:17 +00001024 // Make sure we pick "cyclone" if -arch is used.
1025 // FIXME: Should this be picked by checking the target triple instead?
1026 if (Args.getLastArg(options::OPT_arch))
1027 return "cyclone";
1028
1029 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +00001030}
1031
Tim Northover573cbee2014-05-24 12:52:07 +00001032void Clang::AddAArch64TargetArgs(const ArgList &Args,
1033 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +00001034 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
1035 llvm::Triple Triple(TripleStr);
1036
1037 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
1038 Args.hasArg(options::OPT_mkernel) ||
1039 Args.hasArg(options::OPT_fapple_kext))
1040 CmdArgs.push_back("-disable-red-zone");
1041
1042 if (!Args.hasFlag(options::OPT_mimplicit_float,
1043 options::OPT_mno_implicit_float, true))
1044 CmdArgs.push_back("-no-implicit-float");
1045
Craig Topper92fc2df2014-05-17 16:56:41 +00001046 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +00001047 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1048 ABIName = A->getValue();
1049 else if (Triple.isOSDarwin())
1050 ABIName = "darwinpcs";
1051 else
1052 ABIName = "aapcs";
1053
1054 CmdArgs.push_back("-target-abi");
1055 CmdArgs.push_back(ABIName);
1056
Bradley Smith9ff64332014-10-13 10:16:06 +00001057 if (Arg *A = Args.getLastArg(options::OPT_mfix_cortex_a53_835769,
1058 options::OPT_mno_fix_cortex_a53_835769)) {
1059 CmdArgs.push_back("-backend-option");
1060 if (A->getOption().matches(options::OPT_mfix_cortex_a53_835769))
1061 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
1062 else
1063 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=0");
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001064 } else if (Triple.isAndroid()) {
Bradley Smith04ee8aa2014-10-16 16:35:14 +00001065 // Enabled A53 errata (835769) workaround by default on android
1066 CmdArgs.push_back("-backend-option");
1067 CmdArgs.push_back("-aarch64-fix-cortex-a53-835769=1");
Bradley Smith9ff64332014-10-13 10:16:06 +00001068 }
1069
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001070 // Forward the -mglobal-merge option for explicit control over the pass.
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001071 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
1072 options::OPT_mno_global_merge)) {
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001073 CmdArgs.push_back("-backend-option");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001074 if (A->getOption().matches(options::OPT_mno_global_merge))
Ahmed Bougacha256a8692015-04-11 00:10:44 +00001075 CmdArgs.push_back("-aarch64-global-merge=false");
1076 else
1077 CmdArgs.push_back("-aarch64-global-merge=true");
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +00001078 }
Tim Northovera2ee4332014-03-29 15:09:45 +00001079}
1080
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001081// Get CPU and ABI names. They are not independent
1082// so we have to calculate them together.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001083void mips::getMipsCPUAndABI(const ArgList &Args, const llvm::Triple &Triple,
1084 StringRef &CPUName, StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +00001085 const char *DefMips32CPU = "mips32r2";
1086 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +00001087
Daniel Sanders2bf13662014-07-10 14:40:57 +00001088 // MIPS32r6 is the default for mips(el)?-img-linux-gnu and MIPS64r6 is the
1089 // default for mips64(el)?-img-linux-gnu.
1090 if (Triple.getVendor() == llvm::Triple::ImaginationTechnologies &&
1091 Triple.getEnvironment() == llvm::Triple::GNU) {
1092 DefMips32CPU = "mips32r6";
1093 DefMips64CPU = "mips64r6";
1094 }
Renato Golin7c542b42015-07-27 23:44:45 +00001095
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001096 // MIPS64r6 is the default for Android MIPS64 (mips64el-linux-android).
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001097 if (Triple.isAndroid())
Petar Jovanovic9fe32cd2015-07-17 12:57:30 +00001098 DefMips64CPU = "mips64r6";
Daniel Sanders2bf13662014-07-10 14:40:57 +00001099
Brad Smithba26f582015-01-06 02:53:17 +00001100 // MIPS3 is the default for mips64*-unknown-openbsd.
1101 if (Triple.getOS() == llvm::Triple::OpenBSD)
1102 DefMips64CPU = "mips3";
1103
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001104 if (Arg *A = Args.getLastArg(options::OPT_march_EQ, options::OPT_mcpu_EQ))
Simon Atanasyane0cc7c72013-10-09 12:12:24 +00001105 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001106
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001107 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001108 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001109 // Convert a GNU style Mips ABI name to the name
1110 // accepted by LLVM Mips backend.
1111 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001112 .Case("32", "o32")
1113 .Case("64", "n64")
1114 .Default(ABIName);
Simon Atanasyan4938ddb2013-04-21 13:30:10 +00001115 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001116
1117 // Setup default CPU and ABI names.
1118 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001119 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001120 default:
1121 llvm_unreachable("Unexpected triple arch name");
1122 case llvm::Triple::mips:
1123 case llvm::Triple::mipsel:
1124 CPUName = DefMips32CPU;
1125 break;
1126 case llvm::Triple::mips64:
1127 case llvm::Triple::mips64el:
1128 CPUName = DefMips64CPU;
1129 break;
1130 }
1131 }
1132
Simon Atanasyana42a84e2014-07-02 13:20:36 +00001133 if (ABIName.empty()) {
1134 // Deduce ABI name from the target triple.
1135 if (Triple.getArch() == llvm::Triple::mips ||
1136 Triple.getArch() == llvm::Triple::mipsel)
1137 ABIName = "o32";
1138 else
1139 ABIName = "n64";
1140 }
1141
1142 if (CPUName.empty()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001143 // Deduce CPU name from ABI name.
1144 CPUName = llvm::StringSwitch<const char *>(ABIName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001145 .Cases("o32", "eabi", DefMips32CPU)
1146 .Cases("n32", "n64", DefMips64CPU)
1147 .Default("");
Simon Atanasyan464a7f72012-09-10 08:32:41 +00001148 }
Simon Atanasyanc92717f2014-07-23 09:27:10 +00001149
1150 // FIXME: Warn on inconsistent use of -march and -mabi.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +00001151}
1152
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00001153std::string mips::getMipsABILibSuffix(const ArgList &Args,
1154 const llvm::Triple &Triple) {
1155 StringRef CPUName, ABIName;
1156 tools::mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
1157 return llvm::StringSwitch<std::string>(ABIName)
1158 .Case("o32", "")
1159 .Case("n32", "32")
1160 .Case("n64", "64");
1161}
1162
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001163// Convert ABI name to the GNU tools acceptable variant.
1164static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
1165 return llvm::StringSwitch<llvm::StringRef>(ABI)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001166 .Case("o32", "32")
1167 .Case("n64", "64")
1168 .Default(ABI);
Simon Atanasyan0da400c2013-02-27 14:55:49 +00001169}
1170
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001171// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
1172// and -mfloat-abi=.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001173static mips::FloatABI getMipsFloatABI(const Driver &D, const ArgList &Args) {
1174 mips::FloatABI ABI = mips::FloatABI::Invalid;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001175 if (Arg *A =
1176 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float,
1177 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001178 if (A->getOption().matches(options::OPT_msoft_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001179 ABI = mips::FloatABI::Soft;
Eric Christopher0b26a612010-03-02 02:41:08 +00001180 else if (A->getOption().matches(options::OPT_mhard_float))
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001181 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001182 else {
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001183 ABI = llvm::StringSwitch<mips::FloatABI>(A->getValue())
1184 .Case("soft", mips::FloatABI::Soft)
1185 .Case("hard", mips::FloatABI::Hard)
1186 .Default(mips::FloatABI::Invalid);
1187 if (ABI == mips::FloatABI::Invalid && !StringRef(A->getValue()).empty()) {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001188 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001189 ABI = mips::FloatABI::Hard;
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001190 }
1191 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001192 }
1193
1194 // If unspecified, choose the default based on the platform.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001195 if (ABI == mips::FloatABI::Invalid) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001196 // Assume "hard", because it's a default value used by gcc.
1197 // When we start to recognize specific target MIPS processors,
1198 // we will be able to select the default more correctly.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001199 ABI = mips::FloatABI::Hard;
Eric Christopher0b26a612010-03-02 02:41:08 +00001200 }
1201
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001202 assert(ABI != mips::FloatABI::Invalid && "must select an ABI");
1203 return ABI;
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001204}
1205
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001206static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001207 std::vector<const char *> &Features,
1208 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001209 StringRef FeatureName) {
1210 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001211 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001212 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001213 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001214 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001215 }
1216}
1217
Daniel Sanders379d44b2014-07-16 11:52:23 +00001218static void getMIPSTargetFeatures(const Driver &D, const llvm::Triple &Triple,
1219 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001220 std::vector<const char *> &Features) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00001221 StringRef CPUName;
1222 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001223 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00001224 ABIName = getGnuCompatibleMipsABIName(ABIName);
1225
Daniel Sandersfeb61302014-08-08 15:47:17 +00001226 AddTargetFeature(Args, Features, options::OPT_mno_abicalls,
1227 options::OPT_mabicalls, "noabicalls");
Daniel Sanderse805f442014-08-08 13:44:50 +00001228
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001229 mips::FloatABI FloatABI = getMipsFloatABI(D, Args);
1230 if (FloatABI == mips::FloatABI::Soft) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001231 // FIXME: Note, this is a hack. We need to pass the selected float
1232 // mode to the MipsTargetInfoBase to define appropriate macros there.
1233 // Now it is the only method.
1234 Features.push_back("+soft-float");
1235 }
1236
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001237 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001238 StringRef Val = StringRef(A->getValue());
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00001239 if (Val == "2008") {
1240 if (mips::getSupportedNanEncoding(CPUName) & mips::Nan2008)
1241 Features.push_back("+nan2008");
1242 else {
1243 Features.push_back("-nan2008");
1244 D.Diag(diag::warn_target_unsupported_nan2008) << CPUName;
1245 }
1246 } else if (Val == "legacy") {
1247 if (mips::getSupportedNanEncoding(CPUName) & mips::NanLegacy)
1248 Features.push_back("-nan2008");
1249 else {
1250 Features.push_back("+nan2008");
1251 D.Diag(diag::warn_target_unsupported_nanlegacy) << CPUName;
1252 }
1253 } else
Matheus Almeida602bff32014-05-07 16:16:07 +00001254 D.Diag(diag::err_drv_unsupported_option_argument)
1255 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001256 }
1257
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001258 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1259 options::OPT_mdouble_float, "single-float");
1260 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1261 "mips16");
1262 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1263 options::OPT_mno_micromips, "micromips");
1264 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1265 "dsp");
1266 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1267 "dspr2");
1268 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1269 "msa");
Daniel Sanders379d44b2014-07-16 11:52:23 +00001270
1271 // Add the last -mfp32/-mfpxx/-mfp64 or if none are given and the ABI is O32
1272 // pass -mfpxx
1273 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
1274 options::OPT_mfp64)) {
1275 if (A->getOption().matches(options::OPT_mfp32))
1276 Features.push_back(Args.MakeArgString("-fp64"));
1277 else if (A->getOption().matches(options::OPT_mfpxx)) {
1278 Features.push_back(Args.MakeArgString("+fpxx"));
1279 Features.push_back(Args.MakeArgString("+nooddspreg"));
1280 } else
1281 Features.push_back(Args.MakeArgString("+fp64"));
Toma Tabacu94ea6862015-06-16 13:54:13 +00001282 } else if (mips::shouldUseFPXX(Args, Triple, CPUName, ABIName, FloatABI)) {
Daniel Sanders2e9427a2014-07-16 09:57:54 +00001283 Features.push_back(Args.MakeArgString("+fpxx"));
1284 Features.push_back(Args.MakeArgString("+nooddspreg"));
1285 }
Daniel Sanders379d44b2014-07-16 11:52:23 +00001286
Daniel Sanders28e5d392014-07-10 10:39:51 +00001287 AddTargetFeature(Args, Features, options::OPT_mno_odd_spreg,
1288 options::OPT_modd_spreg, "nooddspreg");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001289}
1290
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001291void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001292 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001293 const Driver &D = getToolChain().getDriver();
1294 StringRef CPUName;
1295 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001296 const llvm::Triple &Triple = getToolChain().getTriple();
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001297 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001298
1299 CmdArgs.push_back("-target-abi");
1300 CmdArgs.push_back(ABIName.data());
1301
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001302 mips::FloatABI ABI = getMipsFloatABI(D, Args);
1303 if (ABI == mips::FloatABI::Soft) {
Eric Christopher0b26a612010-03-02 02:41:08 +00001304 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001305 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001306 CmdArgs.push_back("-mfloat-abi");
1307 CmdArgs.push_back("soft");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001308 } else {
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001309 // Floating point operations and argument passing are hard.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00001310 assert(ABI == mips::FloatABI::Hard && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001311 CmdArgs.push_back("-mfloat-abi");
1312 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001313 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001314
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001315 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1316 if (A->getOption().matches(options::OPT_mxgot)) {
1317 CmdArgs.push_back("-mllvm");
1318 CmdArgs.push_back("-mxgot");
1319 }
1320 }
1321
Simon Atanasyanc580b322013-05-11 06:33:44 +00001322 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1323 options::OPT_mno_ldc1_sdc1)) {
1324 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1325 CmdArgs.push_back("-mllvm");
1326 CmdArgs.push_back("-mno-ldc1-sdc1");
1327 }
1328 }
1329
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001330 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1331 options::OPT_mno_check_zero_division)) {
1332 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1333 CmdArgs.push_back("-mllvm");
1334 CmdArgs.push_back("-mno-check-zero-division");
1335 }
1336 }
1337
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001338 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001339 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001340 CmdArgs.push_back("-mllvm");
1341 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1342 A->claim();
1343 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001344}
1345
Hal Finkel8eb59282012-06-11 22:35:19 +00001346/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1347static std::string getPPCTargetCPU(const ArgList &Args) {
1348 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001349 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001350
1351 if (CPUName == "native") {
1352 std::string CPU = llvm::sys::getHostCPUName();
1353 if (!CPU.empty() && CPU != "generic")
1354 return CPU;
1355 else
1356 return "";
1357 }
1358
1359 return llvm::StringSwitch<const char *>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001360 .Case("common", "generic")
1361 .Case("440", "440")
1362 .Case("440fp", "440")
1363 .Case("450", "450")
1364 .Case("601", "601")
1365 .Case("602", "602")
1366 .Case("603", "603")
1367 .Case("603e", "603e")
1368 .Case("603ev", "603ev")
1369 .Case("604", "604")
1370 .Case("604e", "604e")
1371 .Case("620", "620")
1372 .Case("630", "pwr3")
1373 .Case("G3", "g3")
1374 .Case("7400", "7400")
1375 .Case("G4", "g4")
1376 .Case("7450", "7450")
1377 .Case("G4+", "g4+")
1378 .Case("750", "750")
1379 .Case("970", "970")
1380 .Case("G5", "g5")
1381 .Case("a2", "a2")
1382 .Case("a2q", "a2q")
1383 .Case("e500mc", "e500mc")
1384 .Case("e5500", "e5500")
1385 .Case("power3", "pwr3")
1386 .Case("power4", "pwr4")
1387 .Case("power5", "pwr5")
1388 .Case("power5x", "pwr5x")
1389 .Case("power6", "pwr6")
1390 .Case("power6x", "pwr6x")
1391 .Case("power7", "pwr7")
1392 .Case("power8", "pwr8")
1393 .Case("pwr3", "pwr3")
1394 .Case("pwr4", "pwr4")
1395 .Case("pwr5", "pwr5")
1396 .Case("pwr5x", "pwr5x")
1397 .Case("pwr6", "pwr6")
1398 .Case("pwr6x", "pwr6x")
1399 .Case("pwr7", "pwr7")
1400 .Case("pwr8", "pwr8")
1401 .Case("powerpc", "ppc")
1402 .Case("powerpc64", "ppc64")
1403 .Case("powerpc64le", "ppc64le")
1404 .Default("");
Hal Finkel8eb59282012-06-11 22:35:19 +00001405 }
1406
1407 return "";
1408}
1409
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001410static void getPPCTargetFeatures(const ArgList &Args,
1411 std::vector<const char *> &Features) {
Sean Silva14facf32015-06-09 01:57:17 +00001412 for (const Arg *A : Args.filtered(options::OPT_m_ppc_Features_Group)) {
1413 StringRef Name = A->getOption().getName();
1414 A->claim();
Eric Christopher643bb6a2013-10-16 20:40:08 +00001415
1416 // Skip over "-m".
1417 assert(Name.startswith("m") && "Invalid feature name.");
1418 Name = Name.substr(1);
1419
1420 bool IsNegative = Name.startswith("no-");
1421 if (IsNegative)
1422 Name = Name.substr(3);
1423
1424 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1425 // pass the correct option to the backend while calling the frontend
1426 // option the same.
1427 // TODO: Change the LLVM backend option maybe?
1428 if (Name == "mfcrf")
1429 Name = "mfocrf";
1430
1431 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1432 }
1433
1434 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001435 AddTargetFeature(Args, Features, options::OPT_faltivec,
1436 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001437}
1438
Ulrich Weigand8afad612014-07-28 13:17:52 +00001439void Clang::AddPPCTargetArgs(const ArgList &Args,
1440 ArgStringList &CmdArgs) const {
1441 // Select the ABI to use.
1442 const char *ABIName = nullptr;
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001443 if (getToolChain().getTriple().isOSLinux())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001444 switch (getToolChain().getArch()) {
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001445 case llvm::Triple::ppc64: {
1446 // When targeting a processor that supports QPX, or if QPX is
1447 // specifically enabled, default to using the ABI that supports QPX (so
1448 // long as it is not specifically disabled).
1449 bool HasQPX = false;
1450 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
1451 HasQPX = A->getValue() == StringRef("a2q");
1452 HasQPX = Args.hasFlag(options::OPT_mqpx, options::OPT_mno_qpx, HasQPX);
1453 if (HasQPX) {
1454 ABIName = "elfv1-qpx";
1455 break;
1456 }
1457
Ulrich Weigand8afad612014-07-28 13:17:52 +00001458 ABIName = "elfv1";
1459 break;
Hal Finkel0d0a1a52015-03-11 19:14:15 +00001460 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001461 case llvm::Triple::ppc64le:
1462 ABIName = "elfv2";
1463 break;
1464 default:
1465 break;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001466 }
Ulrich Weigand8afad612014-07-28 13:17:52 +00001467
Eric Christopher71e5e3d2015-07-10 18:25:54 +00001468 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
1469 // The ppc64 linux abis are all "altivec" abis by default. Accept and ignore
1470 // the option if given as we don't have backend support for any targets
1471 // that don't use the altivec abi.
1472 if (StringRef(A->getValue()) != "altivec")
1473 ABIName = A->getValue();
1474
Ulrich Weigand8afad612014-07-28 13:17:52 +00001475 if (ABIName) {
1476 CmdArgs.push_back("-target-abi");
1477 CmdArgs.push_back(ABIName);
1478 }
1479}
1480
1481bool ppc::hasPPCAbiArg(const ArgList &Args, const char *Value) {
1482 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
1483 return A && (A->getValue() == StringRef(Value));
1484}
1485
Tom Stellard6674c702013-04-01 20:56:53 +00001486/// Get the (LLVM) name of the R600 gpu we are targeting.
1487static std::string getR600TargetGPU(const ArgList &Args) {
1488 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001489 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001490 return llvm::StringSwitch<const char *>(GPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001491 .Cases("rv630", "rv635", "r600")
1492 .Cases("rv610", "rv620", "rs780", "rs880")
1493 .Case("rv740", "rv770")
1494 .Case("palm", "cedar")
1495 .Cases("sumo", "sumo2", "sumo")
1496 .Case("hemlock", "cypress")
1497 .Case("aruba", "cayman")
1498 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001499 }
1500 return "";
1501}
1502
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001503void Clang::AddSparcTargetArgs(const ArgList &Args,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001504 ArgStringList &CmdArgs) const {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001505 const Driver &D = getToolChain().getDriver();
James Y Knightb2406522015-06-15 20:51:24 +00001506 std::string Triple = getToolChain().ComputeEffectiveClangTriple(Args);
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001507
James Y Knightb2406522015-06-15 20:51:24 +00001508 bool SoftFloatABI = false;
1509 if (Arg *A =
1510 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001511 if (A->getOption().matches(options::OPT_msoft_float))
James Y Knightb2406522015-06-15 20:51:24 +00001512 SoftFloatABI = true;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001513 }
1514
James Y Knightb2406522015-06-15 20:51:24 +00001515 // Only the hard-float ABI on Sparc is standardized, and it is the
1516 // default. GCC also supports a nonstandard soft-float ABI mode, and
1517 // perhaps LLVM should implement that, too. However, since llvm
1518 // currently does not support Sparc soft-float, at all, display an
1519 // error if it's requested.
1520 if (SoftFloatABI) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001521 D.Diag(diag::err_drv_unsupported_opt_for_target) << "-msoft-float"
1522 << Triple;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001523 }
1524}
1525
Richard Sandiford4652d892013-07-19 16:51:51 +00001526static const char *getSystemZTargetCPU(const ArgList &Args) {
1527 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1528 return A->getValue();
1529 return "z10";
1530}
1531
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001532static void getSystemZTargetFeatures(const ArgList &Args,
1533 std::vector<const char *> &Features) {
1534 // -m(no-)htm overrides use of the transactional-execution facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001535 if (Arg *A = Args.getLastArg(options::OPT_mhtm, options::OPT_mno_htm)) {
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001536 if (A->getOption().matches(options::OPT_mhtm))
1537 Features.push_back("+transactional-execution");
1538 else
1539 Features.push_back("-transactional-execution");
1540 }
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001541 // -m(no-)vx overrides use of the vector facility.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001542 if (Arg *A = Args.getLastArg(options::OPT_mvx, options::OPT_mno_vx)) {
Ulrich Weigand66ff51b2015-05-05 19:35:52 +00001543 if (A->getOption().matches(options::OPT_mvx))
1544 Features.push_back("+vector");
1545 else
1546 Features.push_back("-vector");
1547 }
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00001548}
1549
Chandler Carruth953fb082013-01-13 11:46:33 +00001550static const char *getX86TargetCPU(const ArgList &Args,
1551 const llvm::Triple &Triple) {
1552 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001553 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001554 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001555 return "core-avx2";
1556
Chandler Carruth953fb082013-01-13 11:46:33 +00001557 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001558 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001559
1560 // FIXME: Reject attempts to use -march=native unless the target matches
1561 // the host.
1562 //
1563 // FIXME: We should also incorporate the detected target features for use
1564 // with -native.
1565 std::string CPU = llvm::sys::getHostCPUName();
1566 if (!CPU.empty() && CPU != "generic")
1567 return Args.MakeArgString(CPU);
1568 }
1569
Reid Kleckner3123eff2015-06-30 16:32:04 +00001570 if (const Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1571 // Mapping built by referring to X86TargetInfo::getDefaultFeatures().
1572 StringRef Arch = A->getValue();
1573 const char *CPU;
1574 if (Triple.getArch() == llvm::Triple::x86) {
1575 CPU = llvm::StringSwitch<const char *>(Arch)
1576 .Case("IA32", "i386")
1577 .Case("SSE", "pentium3")
1578 .Case("SSE2", "pentium4")
1579 .Case("AVX", "sandybridge")
1580 .Case("AVX2", "haswell")
1581 .Default(nullptr);
1582 } else {
1583 CPU = llvm::StringSwitch<const char *>(Arch)
1584 .Case("AVX", "sandybridge")
1585 .Case("AVX2", "haswell")
1586 .Default(nullptr);
1587 }
1588 if (CPU)
1589 return CPU;
1590 }
1591
Chandler Carruth953fb082013-01-13 11:46:33 +00001592 // Select the default CPU if none was given (or detection failed).
1593
1594 if (Triple.getArch() != llvm::Triple::x86_64 &&
1595 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001596 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001597
1598 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1599
1600 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001601 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001602 if (Triple.getArchName() == "x86_64h")
1603 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001604 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001605 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001606
Filipe Cabecinhas4b442572015-01-27 17:27:37 +00001607 // Set up default CPU name for PS4 compilers.
1608 if (Triple.isPS4CPU())
1609 return "btver2";
1610
Alexey Bataev286d1b92014-01-31 04:07:13 +00001611 // On Android use targets compatible with gcc
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001612 if (Triple.isAndroid())
Alexey Bataev286d1b92014-01-31 04:07:13 +00001613 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001614
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001615 // Everything else goes to x86-64 in 64-bit mode.
1616 if (Is64Bit)
1617 return "x86-64";
1618
1619 switch (Triple.getOS()) {
1620 case llvm::Triple::FreeBSD:
1621 case llvm::Triple::NetBSD:
1622 case llvm::Triple::OpenBSD:
1623 return "i486";
1624 case llvm::Triple::Haiku:
1625 return "i586";
1626 case llvm::Triple::Bitrig:
1627 return "i686";
1628 default:
1629 // Fallback to p4.
1630 return "pentium4";
1631 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001632}
1633
Dan Gohmanc2853072015-09-03 22:51:53 +00001634/// Get the (LLVM) name of the WebAssembly cpu we are targeting.
1635static StringRef getWebAssemblyTargetCPU(const ArgList &Args) {
1636 // If we have -mcpu=, use that.
1637 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
1638 StringRef CPU = A->getValue();
1639
1640#ifdef __wasm__
1641 // Handle "native" by examining the host. "native" isn't meaningful when
1642 // cross compiling, so only support this when the host is also WebAssembly.
1643 if (CPU == "native")
1644 return llvm::sys::getHostCPUName();
1645#endif
1646
1647 return CPU;
1648 }
1649
1650 return "generic";
1651}
1652
Renato Golin7c542b42015-07-27 23:44:45 +00001653static std::string getCPUName(const ArgList &Args, const llvm::Triple &T,
1654 bool FromAs = false) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001655 switch (T.getArch()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001656 default:
1657 return "";
1658
Amara Emerson703da2e2013-10-31 09:32:33 +00001659 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001660 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001661 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001662
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001663 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001664 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001665 case llvm::Triple::thumb:
Renato Goline17c5802015-07-27 23:44:42 +00001666 case llvm::Triple::thumbeb: {
1667 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00001668 getARMArchCPUFromArgs(Args, MArch, MCPU, FromAs);
Renato Goline17c5802015-07-27 23:44:42 +00001669 return arm::getARMTargetCPU(MCPU, MArch, T);
1670 }
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001671 case llvm::Triple::mips:
1672 case llvm::Triple::mipsel:
1673 case llvm::Triple::mips64:
1674 case llvm::Triple::mips64el: {
1675 StringRef CPUName;
1676 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00001677 mips::getMipsCPUAndABI(Args, T, CPUName, ABIName);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001678 return CPUName;
1679 }
1680
Artem Belevich0ff05cd2015-07-13 23:27:56 +00001681 case llvm::Triple::nvptx:
1682 case llvm::Triple::nvptx64:
1683 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1684 return A->getValue();
1685 return "";
1686
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001687 case llvm::Triple::ppc:
1688 case llvm::Triple::ppc64:
1689 case llvm::Triple::ppc64le: {
1690 std::string TargetCPUName = getPPCTargetCPU(Args);
1691 // LLVM may default to generating code for the native CPU,
1692 // but, like gcc, we default to a more generic option for
1693 // each architecture. (except on Darwin)
1694 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1695 if (T.getArch() == llvm::Triple::ppc64)
1696 TargetCPUName = "ppc64";
1697 else if (T.getArch() == llvm::Triple::ppc64le)
1698 TargetCPUName = "ppc64le";
1699 else
1700 TargetCPUName = "ppc";
1701 }
1702 return TargetCPUName;
1703 }
1704
1705 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00001706 case llvm::Triple::sparcel:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001707 case llvm::Triple::sparcv9:
1708 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001709 return A->getValue();
1710 return "";
1711
1712 case llvm::Triple::x86:
1713 case llvm::Triple::x86_64:
1714 return getX86TargetCPU(Args, T);
1715
1716 case llvm::Triple::hexagon:
Douglas Katzman54366072015-07-27 16:53:08 +00001717 return "hexagon" + toolchains::HexagonToolChain::GetTargetCPU(Args).str();
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001718
1719 case llvm::Triple::systemz:
1720 return getSystemZTargetCPU(Args);
1721
1722 case llvm::Triple::r600:
Tom Stellardd8e38a32015-01-06 20:34:47 +00001723 case llvm::Triple::amdgcn:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001724 return getR600TargetGPU(Args);
Dan Gohmanc2853072015-09-03 22:51:53 +00001725
1726 case llvm::Triple::wasm32:
1727 case llvm::Triple::wasm64:
1728 return getWebAssemblyTargetCPU(Args);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001729 }
1730}
1731
Alp Tokerce365ca2013-12-02 12:43:03 +00001732static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
Teresa Johnson945bc502015-10-15 20:35:53 +00001733 ArgStringList &CmdArgs, bool IsThinLTO) {
Alp Tokerce365ca2013-12-02 12:43:03 +00001734 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1735 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1736 // forward.
1737 CmdArgs.push_back("-plugin");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001738 std::string Plugin =
1739 ToolChain.getDriver().Dir + "/../lib" CLANG_LIBDIR_SUFFIX "/LLVMgold.so";
Alp Tokerce365ca2013-12-02 12:43:03 +00001740 CmdArgs.push_back(Args.MakeArgString(Plugin));
1741
1742 // Try to pass driver level flags relevant to LTO code generation down to
1743 // the plugin.
1744
1745 // Handle flags for selecting CPU variants.
1746 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1747 if (!CPU.empty())
1748 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
Teresa Johnson945bc502015-10-15 20:35:53 +00001749
Teresa Johnson6ef80dc2015-11-02 18:03:12 +00001750 if (IsThinLTO)
1751 CmdArgs.push_back("-plugin-opt=thinlto");
Alp Tokerce365ca2013-12-02 12:43:03 +00001752}
1753
Sanjay Patel2987c292015-06-11 14:53:41 +00001754/// This is a helper function for validating the optional refinement step
1755/// parameter in reciprocal argument strings. Return false if there is an error
1756/// parsing the refinement step. Otherwise, return true and set the Position
1757/// of the refinement step in the input string.
Craig Topper3db9ba42015-09-21 00:20:04 +00001758static bool getRefinementStep(StringRef In, const Driver &D,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001759 const Arg &A, size_t &Position) {
Sanjay Patel2987c292015-06-11 14:53:41 +00001760 const char RefinementStepToken = ':';
1761 Position = In.find(RefinementStepToken);
1762 if (Position != StringRef::npos) {
1763 StringRef Option = A.getOption().getName();
1764 StringRef RefStep = In.substr(Position + 1);
1765 // Allow exactly one numeric character for the additional refinement
1766 // step parameter. This is reasonable for all currently-supported
1767 // operations and architectures because we would expect that a larger value
1768 // of refinement steps would cause the estimate "optimization" to
1769 // under-perform the native operation. Also, if the estimate does not
1770 // converge quickly, it probably will not ever converge, so further
1771 // refinement steps will not produce a better answer.
1772 if (RefStep.size() != 1) {
1773 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1774 return false;
1775 }
1776 char RefStepChar = RefStep[0];
1777 if (RefStepChar < '0' || RefStepChar > '9') {
1778 D.Diag(diag::err_drv_invalid_value) << Option << RefStep;
1779 return false;
1780 }
1781 }
1782 return true;
1783}
1784
1785/// The -mrecip flag requires processing of many optional parameters.
1786static void ParseMRecip(const Driver &D, const ArgList &Args,
1787 ArgStringList &OutStrings) {
1788 StringRef DisabledPrefixIn = "!";
1789 StringRef DisabledPrefixOut = "!";
1790 StringRef EnabledPrefixOut = "";
1791 StringRef Out = "-mrecip=";
1792
1793 Arg *A = Args.getLastArg(options::OPT_mrecip, options::OPT_mrecip_EQ);
1794 if (!A)
1795 return;
1796
1797 unsigned NumOptions = A->getNumValues();
1798 if (NumOptions == 0) {
1799 // No option is the same as "all".
1800 OutStrings.push_back(Args.MakeArgString(Out + "all"));
1801 return;
1802 }
1803
1804 // Pass through "all", "none", or "default" with an optional refinement step.
1805 if (NumOptions == 1) {
1806 StringRef Val = A->getValue(0);
1807 size_t RefStepLoc;
1808 if (!getRefinementStep(Val, D, *A, RefStepLoc))
1809 return;
1810 StringRef ValBase = Val.slice(0, RefStepLoc);
1811 if (ValBase == "all" || ValBase == "none" || ValBase == "default") {
1812 OutStrings.push_back(Args.MakeArgString(Out + Val));
1813 return;
1814 }
1815 }
1816
1817 // Each reciprocal type may be enabled or disabled individually.
1818 // Check each input value for validity, concatenate them all back together,
1819 // and pass through.
1820
1821 llvm::StringMap<bool> OptionStrings;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001822 OptionStrings.insert(std::make_pair("divd", false));
1823 OptionStrings.insert(std::make_pair("divf", false));
1824 OptionStrings.insert(std::make_pair("vec-divd", false));
1825 OptionStrings.insert(std::make_pair("vec-divf", false));
1826 OptionStrings.insert(std::make_pair("sqrtd", false));
1827 OptionStrings.insert(std::make_pair("sqrtf", false));
1828 OptionStrings.insert(std::make_pair("vec-sqrtd", false));
1829 OptionStrings.insert(std::make_pair("vec-sqrtf", false));
Sanjay Patel2987c292015-06-11 14:53:41 +00001830
1831 for (unsigned i = 0; i != NumOptions; ++i) {
1832 StringRef Val = A->getValue(i);
1833
1834 bool IsDisabled = Val.startswith(DisabledPrefixIn);
1835 // Ignore the disablement token for string matching.
1836 if (IsDisabled)
1837 Val = Val.substr(1);
1838
1839 size_t RefStep;
1840 if (!getRefinementStep(Val, D, *A, RefStep))
1841 return;
1842
1843 StringRef ValBase = Val.slice(0, RefStep);
1844 llvm::StringMap<bool>::iterator OptionIter = OptionStrings.find(ValBase);
1845 if (OptionIter == OptionStrings.end()) {
1846 // Try again specifying float suffix.
1847 OptionIter = OptionStrings.find(ValBase.str() + 'f');
1848 if (OptionIter == OptionStrings.end()) {
1849 // The input name did not match any known option string.
1850 D.Diag(diag::err_drv_unknown_argument) << Val;
1851 return;
1852 }
1853 // The option was specified without a float or double suffix.
1854 // Make sure that the double entry was not already specified.
1855 // The float entry will be checked below.
1856 if (OptionStrings[ValBase.str() + 'd']) {
1857 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1858 return;
1859 }
1860 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001861
Sanjay Patel2987c292015-06-11 14:53:41 +00001862 if (OptionIter->second == true) {
1863 // Duplicate option specified.
1864 D.Diag(diag::err_drv_invalid_value) << A->getOption().getName() << Val;
1865 return;
1866 }
1867
1868 // Mark the matched option as found. Do not allow duplicate specifiers.
1869 OptionIter->second = true;
1870
1871 // If the precision was not specified, also mark the double entry as found.
1872 if (ValBase.back() != 'f' && ValBase.back() != 'd')
1873 OptionStrings[ValBase.str() + 'd'] = true;
1874
1875 // Build the output string.
1876 StringRef Prefix = IsDisabled ? DisabledPrefixOut : EnabledPrefixOut;
1877 Out = Args.MakeArgString(Out + Prefix + Val);
1878 if (i != NumOptions - 1)
1879 Out = Args.MakeArgString(Out + ",");
1880 }
1881
1882 OutStrings.push_back(Args.MakeArgString(Out));
1883}
1884
Eric Christopherc54920a2015-03-23 19:26:05 +00001885static void getX86TargetFeatures(const Driver &D, const llvm::Triple &Triple,
Jim Grosbach82eee262013-11-16 00:53:35 +00001886 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001887 std::vector<const char *> &Features) {
Craig Toppera8bd6002015-03-31 05:45:00 +00001888 // If -march=native, autodetect the feature list.
1889 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
1890 if (StringRef(A->getValue()) == "native") {
1891 llvm::StringMap<bool> HostFeatures;
1892 if (llvm::sys::getHostCPUFeatures(HostFeatures))
1893 for (auto &F : HostFeatures)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001894 Features.push_back(
1895 Args.MakeArgString((F.second ? "+" : "-") + F.first()));
Craig Toppera8bd6002015-03-31 05:45:00 +00001896 }
1897 }
1898
Jim Grosbach82eee262013-11-16 00:53:35 +00001899 if (Triple.getArchName() == "x86_64h") {
1900 // x86_64h implies quite a few of the more modern subtarget features
1901 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1902 Features.push_back("-rdrnd");
1903 Features.push_back("-aes");
1904 Features.push_back("-pclmul");
1905 Features.push_back("-rtm");
1906 Features.push_back("-hle");
1907 Features.push_back("-fsgsbase");
1908 }
1909
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001910 const llvm::Triple::ArchType ArchType = Triple.getArch();
Eric Christopherc54920a2015-03-23 19:26:05 +00001911 // Add features to be compatible with gcc for Android.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00001912 if (Triple.isAndroid()) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001913 if (ArchType == llvm::Triple::x86_64) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001914 Features.push_back("+sse4.2");
1915 Features.push_back("+popcnt");
1916 } else
1917 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001918 }
1919
Eric Christopherc54920a2015-03-23 19:26:05 +00001920 // Set features according to the -arch flag on MSVC.
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001921 if (Arg *A = Args.getLastArg(options::OPT__SLASH_arch)) {
1922 StringRef Arch = A->getValue();
1923 bool ArchUsed = false;
1924 // First, look for flags that are shared in x86 and x86-64.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001925 if (ArchType == llvm::Triple::x86_64 || ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001926 if (Arch == "AVX" || Arch == "AVX2") {
1927 ArchUsed = true;
1928 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1929 }
1930 }
1931 // Then, look for x86-specific flags.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00001932 if (ArchType == llvm::Triple::x86) {
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00001933 if (Arch == "IA32") {
1934 ArchUsed = true;
1935 } else if (Arch == "SSE" || Arch == "SSE2") {
1936 ArchUsed = true;
1937 Features.push_back(Args.MakeArgString("+" + Arch.lower()));
1938 }
1939 }
1940 if (!ArchUsed)
1941 D.Diag(clang::diag::warn_drv_unused_argument) << A->getAsString(Args);
1942 }
1943
Jim Grosbach82eee262013-11-16 00:53:35 +00001944 // Now add any that the user explicitly requested on the command line,
1945 // which may override the defaults.
Sean Silva14facf32015-06-09 01:57:17 +00001946 for (const Arg *A : Args.filtered(options::OPT_m_x86_Features_Group)) {
1947 StringRef Name = A->getOption().getName();
1948 A->claim();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001949
1950 // Skip over "-m".
1951 assert(Name.startswith("m") && "Invalid feature name.");
1952 Name = Name.substr(1);
1953
1954 bool IsNegative = Name.startswith("no-");
1955 if (IsNegative)
1956 Name = Name.substr(3);
1957
1958 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1959 }
1960}
1961
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001962void Clang::AddX86TargetArgs(const ArgList &Args,
1963 ArgStringList &CmdArgs) const {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001964 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001965 Args.hasArg(options::OPT_mkernel) ||
1966 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001967 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001968
Bob Wilson2616e2e2013-02-10 16:01:41 +00001969 // Default to avoid implicit floating-point for kernel/kext code, but allow
1970 // that to be overridden with -mno-soft-float.
1971 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1972 Args.hasArg(options::OPT_fapple_kext));
Douglas Katzmana67e50c2015-06-26 15:47:46 +00001973 if (Arg *A = Args.getLastArg(
1974 options::OPT_msoft_float, options::OPT_mno_soft_float,
1975 options::OPT_mimplicit_float, options::OPT_mno_implicit_float)) {
Bob Wilson2616e2e2013-02-10 16:01:41 +00001976 const Option &O = A->getOption();
1977 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1978 O.matches(options::OPT_msoft_float));
1979 }
1980 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001981 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001982
1983 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1984 StringRef Value = A->getValue();
1985 if (Value == "intel" || Value == "att") {
1986 CmdArgs.push_back("-mllvm");
1987 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1988 } else {
1989 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1990 << A->getOption().getName() << Value;
1991 }
1992 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001993}
1994
Tony Linthicum76329bf2011-12-12 21:14:55 +00001995void Clang::AddHexagonTargetArgs(const ArgList &Args,
1996 ArgStringList &CmdArgs) const {
Matthew Curtis6b222782012-12-07 13:52:44 +00001997 CmdArgs.push_back("-mqdsp6-compat");
1998 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001999
Douglas Katzman54366072015-07-27 16:53:08 +00002000 if (const char *v =
2001 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002002 std::string SmallDataThreshold = "-hexagon-small-data-threshold=";
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002003 SmallDataThreshold += v;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002004 CmdArgs.push_back("-mllvm");
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00002005 CmdArgs.push_back(Args.MakeArgString(SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00002006 }
2007
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002008 if (!Args.hasArg(options::OPT_fno_short_enums))
2009 CmdArgs.push_back("-fshort-enums");
2010 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002011 CmdArgs.push_back("-mllvm");
2012 CmdArgs.push_back("-enable-hexagon-ieee-rnd-near");
Sirish Pande11ebc4e2012-05-10 20:19:54 +00002013 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002014 CmdArgs.push_back("-mllvm");
2015 CmdArgs.push_back("-machine-sink-split=0");
Tony Linthicum76329bf2011-12-12 21:14:55 +00002016}
2017
Kevin Qin110db6f2014-07-18 07:03:22 +00002018// Decode AArch64 features from string like +[no]featureA+[no]featureB+...
Craig Topperbf3e3272014-08-30 16:55:52 +00002019static bool DecodeAArch64Features(const Driver &D, StringRef text,
Kevin Qin110db6f2014-07-18 07:03:22 +00002020 std::vector<const char *> &Features) {
2021 SmallVector<StringRef, 8> Split;
2022 text.split(Split, StringRef("+"), -1, false);
2023
Benjamin Kramer72e64312015-09-24 14:48:49 +00002024 for (StringRef Feature : Split) {
Douglas Katzman2675d012015-06-29 19:12:56 +00002025 const char *result = llvm::StringSwitch<const char *>(Feature)
Kevin Qin110db6f2014-07-18 07:03:22 +00002026 .Case("fp", "+fp-armv8")
2027 .Case("simd", "+neon")
2028 .Case("crc", "+crc")
2029 .Case("crypto", "+crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002030 .Case("fp16", "+fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002031 .Case("profile", "+spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002032 .Case("nofp", "-fp-armv8")
2033 .Case("nosimd", "-neon")
2034 .Case("nocrc", "-crc")
2035 .Case("nocrypto", "-crypto")
Oliver Stannard76afca72015-11-26 15:36:42 +00002036 .Case("nofp16", "-fullfp16")
Oliver Stannard4cc70802015-11-26 15:38:54 +00002037 .Case("noprofile", "-spe")
Kevin Qin110db6f2014-07-18 07:03:22 +00002038 .Default(nullptr);
2039 if (result)
2040 Features.push_back(result);
Douglas Katzman2675d012015-06-29 19:12:56 +00002041 else if (Feature == "neon" || Feature == "noneon")
Kevin Qin110db6f2014-07-18 07:03:22 +00002042 D.Diag(diag::err_drv_no_neon_modifier);
2043 else
2044 return false;
2045 }
2046 return true;
2047}
2048
2049// Check if the CPU name and feature modifiers in -mcpu are legal. If yes,
2050// decode CPU and feature.
2051static bool DecodeAArch64Mcpu(const Driver &D, StringRef Mcpu, StringRef &CPU,
2052 std::vector<const char *> &Features) {
2053 std::pair<StringRef, StringRef> Split = Mcpu.split("+");
2054 CPU = Split.first;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002055 if (CPU == "cyclone" || CPU == "cortex-a53" || CPU == "cortex-a57" ||
Christof Doumaba13ad52015-12-02 12:03:42 +00002056 CPU == "cortex-a72" || CPU == "cortex-a35") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002057 Features.push_back("+neon");
2058 Features.push_back("+crc");
2059 Features.push_back("+crypto");
2060 } else if (CPU == "generic") {
2061 Features.push_back("+neon");
2062 } else {
2063 return false;
2064 }
2065
2066 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2067 return false;
2068
2069 return true;
2070}
2071
2072static bool
2073getAArch64ArchFeaturesFromMarch(const Driver &D, StringRef March,
2074 const ArgList &Args,
2075 std::vector<const char *> &Features) {
Gabor Ballabas36451492015-06-18 14:23:12 +00002076 std::string MarchLowerCase = March.lower();
2077 std::pair<StringRef, StringRef> Split = StringRef(MarchLowerCase).split("+");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002078
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002079 if (Split.first == "armv8-a" || Split.first == "armv8a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002080 // ok, no additional features.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002081 } else if (Split.first == "armv8.1-a" || Split.first == "armv8.1a") {
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002082 Features.push_back("+v8.1a");
Oliver Stannard76afca72015-11-26 15:36:42 +00002083 } else if (Split.first == "armv8.2-a" || Split.first == "armv8.2a" ) {
2084 Features.push_back("+v8.2a");
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002085 } else {
Kevin Qin110db6f2014-07-18 07:03:22 +00002086 return false;
Vladimir Sukhareve851e042015-04-16 15:53:09 +00002087 }
Kevin Qin110db6f2014-07-18 07:03:22 +00002088
2089 if (Split.second.size() && !DecodeAArch64Features(D, Split.second, Features))
2090 return false;
2091
2092 return true;
2093}
2094
2095static bool
2096getAArch64ArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2097 const ArgList &Args,
2098 std::vector<const char *> &Features) {
2099 StringRef CPU;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002100 std::string McpuLowerCase = Mcpu.lower();
2101 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, Features))
Kevin Qin110db6f2014-07-18 07:03:22 +00002102 return false;
2103
2104 return true;
2105}
2106
2107static bool
2108getAArch64MicroArchFeaturesFromMtune(const Driver &D, StringRef Mtune,
2109 const ArgList &Args,
2110 std::vector<const char *> &Features) {
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002111 std::string MtuneLowerCase = Mtune.lower();
Kevin Qin110db6f2014-07-18 07:03:22 +00002112 // Handle CPU name is 'native'.
Gabor Ballabasa24a1a42015-07-20 11:28:20 +00002113 if (MtuneLowerCase == "native")
2114 MtuneLowerCase = llvm::sys::getHostCPUName();
2115 if (MtuneLowerCase == "cyclone") {
Kevin Qin110db6f2014-07-18 07:03:22 +00002116 Features.push_back("+zcm");
2117 Features.push_back("+zcz");
2118 }
2119 return true;
2120}
2121
2122static bool
2123getAArch64MicroArchFeaturesFromMcpu(const Driver &D, StringRef Mcpu,
2124 const ArgList &Args,
2125 std::vector<const char *> &Features) {
2126 StringRef CPU;
2127 std::vector<const char *> DecodedFeature;
Gabor Ballabas726ce7f2015-06-12 17:33:37 +00002128 std::string McpuLowerCase = Mcpu.lower();
2129 if (!DecodeAArch64Mcpu(D, McpuLowerCase, CPU, DecodedFeature))
Kevin Qin110db6f2014-07-18 07:03:22 +00002130 return false;
2131
2132 return getAArch64MicroArchFeaturesFromMtune(D, CPU, Args, Features);
2133}
2134
Justin Bognerf9052562015-11-13 23:07:31 +00002135static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002136 std::vector<const char *> &Features) {
Kevin Qin110db6f2014-07-18 07:03:22 +00002137 Arg *A;
2138 bool success = true;
2139 // Enable NEON by default.
2140 Features.push_back("+neon");
2141 if ((A = Args.getLastArg(options::OPT_march_EQ)))
2142 success = getAArch64ArchFeaturesFromMarch(D, A->getValue(), Args, Features);
2143 else if ((A = Args.getLastArg(options::OPT_mcpu_EQ)))
2144 success = getAArch64ArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002145 else if (Args.hasArg(options::OPT_arch))
2146 success = getAArch64ArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args), Args,
2147 Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002148
2149 if (success && (A = Args.getLastArg(options::OPT_mtune_EQ)))
2150 success =
2151 getAArch64MicroArchFeaturesFromMtune(D, A->getValue(), Args, Features);
2152 else if (success && (A = Args.getLastArg(options::OPT_mcpu_EQ)))
2153 success =
2154 getAArch64MicroArchFeaturesFromMcpu(D, A->getValue(), Args, Features);
Tim Northover642e7702014-11-10 21:17:23 +00002155 else if (Args.hasArg(options::OPT_arch))
2156 success = getAArch64MicroArchFeaturesFromMcpu(D, getAArch64TargetCPU(Args),
2157 Args, Features);
Kevin Qin110db6f2014-07-18 07:03:22 +00002158
2159 if (!success)
2160 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Amara Emerson04e2ecf2014-01-23 15:48:30 +00002161
2162 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
2163 Features.push_back("-fp-armv8");
2164 Features.push_back("-crypto");
2165 Features.push_back("-neon");
2166 }
Bradley Smith418c5932014-05-02 15:17:51 +00002167
2168 // En/disable crc
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002169 if (Arg *A = Args.getLastArg(options::OPT_mcrc, options::OPT_mnocrc)) {
Bradley Smith418c5932014-05-02 15:17:51 +00002170 if (A->getOption().matches(options::OPT_mcrc))
2171 Features.push_back("+crc");
2172 else
2173 Features.push_back("-crc");
2174 }
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002175
Akira Hatanaka085da7e2015-07-29 14:25:58 +00002176 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
2177 options::OPT_munaligned_access))
2178 if (A->getOption().matches(options::OPT_mno_unaligned_access))
2179 Features.push_back("+strict-align");
2180
Justin Bognerf9052562015-11-13 23:07:31 +00002181 if (Args.hasArg(options::OPT_ffixed_x18))
Akira Hatanaka4e3c86f2015-07-25 00:18:00 +00002182 Features.push_back("+reserve-x18");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002183}
2184
Dan Gohmanc2853072015-09-03 22:51:53 +00002185static void getWebAssemblyTargetFeatures(const ArgList &Args,
2186 std::vector<const char *> &Features) {
2187 for (const Arg *A : Args.filtered(options::OPT_m_wasm_Features_Group)) {
2188 StringRef Name = A->getOption().getName();
2189 A->claim();
2190
2191 // Skip over "-m".
2192 assert(Name.startswith("m") && "Invalid feature name.");
2193 Name = Name.substr(1);
2194
2195 bool IsNegative = Name.startswith("no-");
2196 if (IsNegative)
2197 Name = Name.substr(3);
2198
2199 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
2200 }
2201}
2202
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002203static void getTargetFeatures(const ToolChain &TC, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002204 const ArgList &Args, ArgStringList &CmdArgs,
2205 bool ForAS) {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002206 const Driver &D = TC.getDriver();
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002207 std::vector<const char *> Features;
2208 switch (Triple.getArch()) {
2209 default:
2210 break;
2211 case llvm::Triple::mips:
2212 case llvm::Triple::mipsel:
2213 case llvm::Triple::mips64:
2214 case llvm::Triple::mips64el:
Daniel Sanders379d44b2014-07-16 11:52:23 +00002215 getMIPSTargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002216 break;
2217
2218 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002219 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002220 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002221 case llvm::Triple::thumbeb:
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00002222 getARMTargetFeatures(TC, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002223 break;
2224
2225 case llvm::Triple::ppc:
2226 case llvm::Triple::ppc64:
2227 case llvm::Triple::ppc64le:
2228 getPPCTargetFeatures(Args, Features);
2229 break;
Ulrich Weigand3a610eb2015-04-01 12:54:25 +00002230 case llvm::Triple::systemz:
2231 getSystemZTargetFeatures(Args, Features);
2232 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002233 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00002234 case llvm::Triple::aarch64_be:
Justin Bognerf9052562015-11-13 23:07:31 +00002235 getAArch64TargetFeatures(D, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002236 break;
2237 case llvm::Triple::x86:
2238 case llvm::Triple::x86_64:
Ehsan Akhgarieeb7e652014-07-15 18:27:51 +00002239 getX86TargetFeatures(D, Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002240 break;
Dan Gohmanc2853072015-09-03 22:51:53 +00002241 case llvm::Triple::wasm32:
2242 case llvm::Triple::wasm64:
2243 getWebAssemblyTargetFeatures(Args, Features);
2244 break;
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002245 }
Rafael Espindola43964802013-08-21 17:34:32 +00002246
2247 // Find the last of each feature.
2248 llvm::StringMap<unsigned> LastOpt;
2249 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2250 const char *Name = Features[I];
2251 assert(Name[0] == '-' || Name[0] == '+');
2252 LastOpt[Name + 1] = I;
2253 }
2254
2255 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
2256 // If this feature was overridden, ignore it.
2257 const char *Name = Features[I];
2258 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
2259 assert(LastI != LastOpt.end());
2260 unsigned Last = LastI->second;
2261 if (Last != I)
2262 continue;
2263
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002264 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00002265 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002266 }
Tim Northover2fe823a2013-08-01 09:23:19 +00002267}
2268
David Majnemerae394812014-12-09 00:12:30 +00002269static bool
2270shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
2271 const llvm::Triple &Triple) {
2272 // We use the zero-cost exception tables for Objective-C if the non-fragile
2273 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
2274 // later.
2275 if (runtime.isNonFragile())
2276 return true;
2277
2278 if (!Triple.isMacOSX())
2279 return false;
2280
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002281 return (!Triple.isMacOSXVersionLT(10, 5) &&
David Majnemerae394812014-12-09 00:12:30 +00002282 (Triple.getArch() == llvm::Triple::x86_64 ||
2283 Triple.getArch() == llvm::Triple::arm));
2284}
2285
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002286/// Adds exception related arguments to the driver command arguments. There's a
2287/// master flag, -fexceptions and also language specific flags to enable/disable
2288/// C++ and Objective-C exceptions. This makes it possible to for example
2289/// disable C++ exceptions but enable Objective-C exceptions.
Anders Carlssone96ab552011-02-28 02:27:16 +00002290static void addExceptionArgs(const ArgList &Args, types::ID InputType,
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002291 const ToolChain &TC, bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00002292 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00002293 ArgStringList &CmdArgs) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002294 const Driver &D = TC.getDriver();
2295 const llvm::Triple &Triple = TC.getTriple();
2296
Chad Rosier4fab82c2012-03-26 22:04:46 +00002297 if (KernelOrKext) {
2298 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
2299 // arguments now to avoid warnings about unused arguments.
2300 Args.ClaimAllArgs(options::OPT_fexceptions);
2301 Args.ClaimAllArgs(options::OPT_fno_exceptions);
2302 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
2303 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
2304 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
2305 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002306 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00002307 }
Anders Carlssone96ab552011-02-28 02:27:16 +00002308
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002309 // See if the user explicitly enabled exceptions.
2310 bool EH = Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
2311 false);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00002312
David Majnemerae394812014-12-09 00:12:30 +00002313 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
2314 // is not necessarily sensible, but follows GCC.
2315 if (types::isObjC(InputType) &&
2316 Args.hasFlag(options::OPT_fobjc_exceptions,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002317 options::OPT_fno_objc_exceptions, true)) {
David Majnemerae394812014-12-09 00:12:30 +00002318 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00002319
David Majnemerae394812014-12-09 00:12:30 +00002320 EH |= shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00002321 }
2322
2323 if (types::isCXX(InputType)) {
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00002324 // Disable C++ EH by default on XCore, PS4, and MSVC.
2325 // FIXME: Remove MSVC from this list once things work.
2326 bool CXXExceptionsEnabled = Triple.getArch() != llvm::Triple::xcore &&
2327 !Triple.isPS4CPU() &&
2328 !Triple.isWindowsMSVCEnvironment();
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002329 Arg *ExceptionArg = Args.getLastArg(
2330 options::OPT_fcxx_exceptions, options::OPT_fno_cxx_exceptions,
2331 options::OPT_fexceptions, options::OPT_fno_exceptions);
2332 if (ExceptionArg)
David Majnemer8de68642014-12-05 08:11:58 +00002333 CXXExceptionsEnabled =
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002334 ExceptionArg->getOption().matches(options::OPT_fcxx_exceptions) ||
2335 ExceptionArg->getOption().matches(options::OPT_fexceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00002336
2337 if (CXXExceptionsEnabled) {
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00002338 if (Triple.isPS4CPU()) {
2339 ToolChain::RTTIMode RTTIMode = TC.getRTTIMode();
2340 assert(ExceptionArg &&
2341 "On the PS4 exceptions should only be enabled if passing "
2342 "an argument");
2343 if (RTTIMode == ToolChain::RM_DisabledExplicitly) {
2344 const Arg *RTTIArg = TC.getRTTIArg();
2345 assert(RTTIArg && "RTTI disabled explicitly but no RTTIArg!");
2346 D.Diag(diag::err_drv_argument_not_allowed_with)
2347 << RTTIArg->getAsString(Args) << ExceptionArg->getAsString(Args);
2348 } else if (RTTIMode == ToolChain::RM_EnabledImplicitly)
2349 D.Diag(diag::warn_drv_enabling_rtti_with_exceptions);
2350 } else
2351 assert(TC.getRTTIMode() != ToolChain::RM_DisabledImplicitly);
2352
Anders Carlssone96ab552011-02-28 02:27:16 +00002353 CmdArgs.push_back("-fcxx-exceptions");
2354
David Majnemer8de68642014-12-05 08:11:58 +00002355 EH = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00002356 }
2357 }
2358
David Majnemer8de68642014-12-05 08:11:58 +00002359 if (EH)
Anders Carlssone96ab552011-02-28 02:27:16 +00002360 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00002361}
2362
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002363static bool ShouldDisableAutolink(const ArgList &Args, const ToolChain &TC) {
Daniel Dunbare246fbe2013-04-16 18:21:19 +00002364 bool Default = true;
2365 if (TC.getTriple().isOSDarwin()) {
2366 // The native darwin assembler doesn't support the linker_option directives,
2367 // so we disable them if we think the .s file will be passed to it.
2368 Default = TC.useIntegratedAs();
2369 }
2370 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
2371 Default);
2372}
2373
Ted Kremenek62093662013-03-12 17:02:12 +00002374static bool ShouldDisableDwarfDirectory(const ArgList &Args,
2375 const ToolChain &TC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002376 bool UseDwarfDirectory =
2377 Args.hasFlag(options::OPT_fdwarf_directory_asm,
2378 options::OPT_fno_dwarf_directory_asm, TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00002379 return !UseDwarfDirectory;
2380}
2381
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002382/// \brief Check whether the given input tree contains any compilation actions.
2383static bool ContainsCompileAction(const Action *A) {
Bob Wilson23a55f12014-12-21 07:00:00 +00002384 if (isa<CompileJobAction>(A) || isa<BackendJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002385 return true;
2386
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002387 for (const auto &Act : *A)
2388 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002389 return true;
2390
2391 return false;
2392}
2393
2394/// \brief Check if -relax-all should be passed to the internal assembler.
2395/// This is done by default when compiling non-assembler source with -O0.
2396static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
2397 bool RelaxDefault = true;
2398
2399 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2400 RelaxDefault = A->getOption().matches(options::OPT_O0);
2401
2402 if (RelaxDefault) {
2403 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00002404 for (const auto &Act : C.getActions()) {
2405 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002406 RelaxDefault = true;
2407 break;
2408 }
2409 }
2410 }
2411
2412 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002413 RelaxDefault);
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00002414}
2415
Douglas Katzman3459ce22015-10-08 04:24:12 +00002416// Extract the integer N from a string spelled "-dwarf-N", returning 0
2417// on mismatch. The StringRef input (rather than an Arg) allows
2418// for use by the "-Xassembler" option parser.
2419static unsigned DwarfVersionNum(StringRef ArgValue) {
2420 return llvm::StringSwitch<unsigned>(ArgValue)
2421 .Case("-gdwarf-2", 2)
2422 .Case("-gdwarf-3", 3)
2423 .Case("-gdwarf-4", 4)
2424 .Default(0);
2425}
2426
2427static void RenderDebugEnablingArgs(const ArgList &Args, ArgStringList &CmdArgs,
2428 CodeGenOptions::DebugInfoKind DebugInfoKind,
2429 unsigned DwarfVersion) {
2430 switch (DebugInfoKind) {
2431 case CodeGenOptions::DebugLineTablesOnly:
2432 CmdArgs.push_back("-debug-info-kind=line-tables-only");
2433 break;
2434 case CodeGenOptions::LimitedDebugInfo:
2435 CmdArgs.push_back("-debug-info-kind=limited");
2436 break;
2437 case CodeGenOptions::FullDebugInfo:
2438 CmdArgs.push_back("-debug-info-kind=standalone");
2439 break;
2440 default:
2441 break;
2442 }
2443 if (DwarfVersion > 0)
2444 CmdArgs.push_back(
Benjamin Kramer32bd3c82015-10-08 10:31:17 +00002445 Args.MakeArgString("-dwarf-version=" + Twine(DwarfVersion)));
Douglas Katzman3459ce22015-10-08 04:24:12 +00002446}
2447
David Blaikie9260ed62013-07-25 21:19:01 +00002448static void CollectArgsForIntegratedAssembler(Compilation &C,
2449 const ArgList &Args,
2450 ArgStringList &CmdArgs,
2451 const Driver &D) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002452 if (UseRelaxAll(C, Args))
2453 CmdArgs.push_back("-mrelax-all");
David Blaikie9260ed62013-07-25 21:19:01 +00002454
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002455 // When passing -I arguments to the assembler we sometimes need to
2456 // unconditionally take the next argument. For example, when parsing
2457 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
2458 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
2459 // arg after parsing the '-I' arg.
2460 bool TakeNextArg = false;
David Peixottodfb66142013-11-14 22:52:58 +00002461
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002462 // When using an integrated assembler, translate -Wa, and -Xassembler
2463 // options.
2464 bool CompressDebugSections = false;
2465 for (const Arg *A :
2466 Args.filtered(options::OPT_Wa_COMMA, options::OPT_Xassembler)) {
2467 A->claim();
David Blaikie9260ed62013-07-25 21:19:01 +00002468
Benjamin Kramer72e64312015-09-24 14:48:49 +00002469 for (StringRef Value : A->getValues()) {
Renato Golin7c542b42015-07-27 23:44:45 +00002470 if (TakeNextArg) {
2471 CmdArgs.push_back(Value.data());
2472 TakeNextArg = false;
2473 continue;
2474 }
David Blaikie9260ed62013-07-25 21:19:01 +00002475
Daniel Sanders3d5e5682015-10-27 18:04:42 +00002476 switch (C.getDefaultToolChain().getArch()) {
2477 default:
2478 break;
2479 case llvm::Triple::mips:
2480 case llvm::Triple::mipsel:
2481 case llvm::Triple::mips64:
2482 case llvm::Triple::mips64el:
2483 if (Value == "--trap") {
2484 CmdArgs.push_back("-target-feature");
2485 CmdArgs.push_back("+use-tcc-in-div");
2486 continue;
2487 }
2488 if (Value == "--break") {
2489 CmdArgs.push_back("-target-feature");
2490 CmdArgs.push_back("-use-tcc-in-div");
2491 continue;
2492 }
2493 if (Value.startswith("-msoft-float")) {
2494 CmdArgs.push_back("-target-feature");
2495 CmdArgs.push_back("+soft-float");
2496 continue;
2497 }
2498 if (Value.startswith("-mhard-float")) {
2499 CmdArgs.push_back("-target-feature");
2500 CmdArgs.push_back("-soft-float");
2501 continue;
2502 }
2503 break;
2504 }
2505
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002506 if (Value == "-force_cpusubtype_ALL") {
2507 // Do nothing, this is the default and we don't support anything else.
2508 } else if (Value == "-L") {
2509 CmdArgs.push_back("-msave-temp-labels");
2510 } else if (Value == "--fatal-warnings") {
2511 CmdArgs.push_back("-massembler-fatal-warnings");
2512 } else if (Value == "--noexecstack") {
2513 CmdArgs.push_back("-mnoexecstack");
2514 } else if (Value == "-compress-debug-sections" ||
2515 Value == "--compress-debug-sections") {
2516 CompressDebugSections = true;
2517 } else if (Value == "-nocompress-debug-sections" ||
2518 Value == "--nocompress-debug-sections") {
2519 CompressDebugSections = false;
2520 } else if (Value.startswith("-I")) {
2521 CmdArgs.push_back(Value.data());
2522 // We need to consume the next argument if the current arg is a plain
2523 // -I. The next arg will be the include directory.
2524 if (Value == "-I")
2525 TakeNextArg = true;
2526 } else if (Value.startswith("-gdwarf-")) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00002527 // "-gdwarf-N" options are not cc1as options.
2528 unsigned DwarfVersion = DwarfVersionNum(Value);
2529 if (DwarfVersion == 0) { // Send it onward, and let cc1as complain.
2530 CmdArgs.push_back(Value.data());
2531 } else {
2532 RenderDebugEnablingArgs(
2533 Args, CmdArgs, CodeGenOptions::LimitedDebugInfo, DwarfVersion);
2534 }
Renato Golin7c542b42015-07-27 23:44:45 +00002535 } else if (Value.startswith("-mcpu") || Value.startswith("-mfpu") ||
2536 Value.startswith("-mhwdiv") || Value.startswith("-march")) {
2537 // Do nothing, we'll validate it later.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002538 } else {
2539 D.Diag(diag::err_drv_unsupported_option_argument)
David Blaikie9260ed62013-07-25 21:19:01 +00002540 << A->getOption().getName() << Value;
David Blaikie9260ed62013-07-25 21:19:01 +00002541 }
2542 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002543 }
2544 if (CompressDebugSections) {
2545 if (llvm::zlib::isAvailable())
2546 CmdArgs.push_back("-compress-debug-sections");
2547 else
2548 D.Diag(diag::warn_debug_compression_unavailable);
2549 }
David Blaikie9260ed62013-07-25 21:19:01 +00002550}
2551
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00002552// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00002553// FIXME: Make sure we can also emit shared objects if they're requested
2554// and available, check for possible errors, etc.
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00002555static void addClangRT(const ToolChain &TC, const ArgList &Args,
2556 ArgStringList &CmdArgs) {
Xinliang David Li69306c02015-10-22 06:15:31 +00002557 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "builtins"));
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002558}
2559
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002560namespace {
2561enum OpenMPRuntimeKind {
2562 /// An unknown OpenMP runtime. We can't generate effective OpenMP code
2563 /// without knowing what runtime to target.
2564 OMPRT_Unknown,
2565
2566 /// The LLVM OpenMP runtime. When completed and integrated, this will become
2567 /// the default for Clang.
2568 OMPRT_OMP,
2569
2570 /// The GNU OpenMP runtime. Clang doesn't support generating OpenMP code for
2571 /// this runtime but can swallow the pragmas, and find and link against the
2572 /// runtime library itself.
2573 OMPRT_GOMP,
2574
Chandler Carruthc6625c62015-05-28 21:10:31 +00002575 /// The legacy name for the LLVM OpenMP runtime from when it was the Intel
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002576 /// OpenMP runtime. We support this mode for users with existing dependencies
2577 /// on this runtime library name.
2578 OMPRT_IOMP5
2579};
Alexander Kornienkoab9db512015-06-22 23:07:51 +00002580}
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002581
2582/// Compute the desired OpenMP runtime from the flag provided.
Chandler Carruthc6625c62015-05-28 21:10:31 +00002583static OpenMPRuntimeKind getOpenMPRuntime(const ToolChain &TC,
2584 const ArgList &Args) {
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002585 StringRef RuntimeName(CLANG_DEFAULT_OPENMP_RUNTIME);
2586
2587 const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ);
2588 if (A)
2589 RuntimeName = A->getValue();
2590
2591 auto RT = llvm::StringSwitch<OpenMPRuntimeKind>(RuntimeName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002592 .Case("libomp", OMPRT_OMP)
2593 .Case("libgomp", OMPRT_GOMP)
2594 .Case("libiomp5", OMPRT_IOMP5)
2595 .Default(OMPRT_Unknown);
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002596
2597 if (RT == OMPRT_Unknown) {
2598 if (A)
2599 TC.getDriver().Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002600 << A->getOption().getName() << A->getValue();
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00002601 else
2602 // FIXME: We could use a nicer diagnostic here.
2603 TC.getDriver().Diag(diag::err_drv_unsupported_opt) << "-fopenmp";
2604 }
2605
2606 return RT;
2607}
2608
Joerg Sonnenberger95a90132015-09-23 14:06:52 +00002609static void addOpenMPRuntime(ArgStringList &CmdArgs, const ToolChain &TC,
2610 const ArgList &Args) {
2611 if (!Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
2612 options::OPT_fno_openmp, false))
2613 return;
2614
2615 switch (getOpenMPRuntime(TC, Args)) {
2616 case OMPRT_OMP:
2617 CmdArgs.push_back("-lomp");
2618 break;
2619 case OMPRT_GOMP:
2620 CmdArgs.push_back("-lgomp");
2621 break;
2622 case OMPRT_IOMP5:
2623 CmdArgs.push_back("-liomp5");
2624 break;
2625 case OMPRT_Unknown:
2626 // Already diagnosed.
2627 break;
2628 }
2629}
2630
Alexey Samsonov52550342014-09-15 19:58:40 +00002631static void addSanitizerRuntime(const ToolChain &TC, const ArgList &Args,
2632 ArgStringList &CmdArgs, StringRef Sanitizer,
2633 bool IsShared) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002634 // Static runtimes must be forced into executable, so we wrap them in
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002635 // whole-archive.
Xinliang David Li69306c02015-10-22 06:15:31 +00002636 if (!IsShared) CmdArgs.push_back("-whole-archive");
2637 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Sanitizer, IsShared));
2638 if (!IsShared) CmdArgs.push_back("-no-whole-archive");
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00002639}
2640
Alexey Samsonov52550342014-09-15 19:58:40 +00002641// Tries to use a file with the list of dynamic symbols that need to be exported
2642// from the runtime library. Returns true if the file was found.
2643static bool addSanitizerDynamicList(const ToolChain &TC, const ArgList &Args,
2644 ArgStringList &CmdArgs,
2645 StringRef Sanitizer) {
Vasileios Kalintiris447e3572015-10-01 16:54:58 +00002646 SmallString<128> SanRT(TC.getCompilerRT(Args, Sanitizer));
Saleem Abdulrasool68150942014-12-30 22:52:08 +00002647 if (llvm::sys::fs::exists(SanRT + ".syms")) {
2648 CmdArgs.push_back(Args.MakeArgString("--dynamic-list=" + SanRT + ".syms"));
Alexey Samsonov52550342014-09-15 19:58:40 +00002649 return true;
2650 }
2651 return false;
2652}
2653
2654static void linkSanitizerRuntimeDeps(const ToolChain &TC,
2655 ArgStringList &CmdArgs) {
2656 // Force linking against the system libraries sanitizers depends on
2657 // (see PR15823 why this is necessary).
2658 CmdArgs.push_back("--no-as-needed");
2659 CmdArgs.push_back("-lpthread");
2660 CmdArgs.push_back("-lrt");
2661 CmdArgs.push_back("-lm");
2662 // There's no libdl on FreeBSD.
2663 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
2664 CmdArgs.push_back("-ldl");
2665}
2666
2667static void
2668collectSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2669 SmallVectorImpl<StringRef> &SharedRuntimes,
2670 SmallVectorImpl<StringRef> &StaticRuntimes,
2671 SmallVectorImpl<StringRef> &HelperStaticRuntimes) {
2672 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
2673 // Collect shared runtimes.
2674 if (SanArgs.needsAsanRt() && SanArgs.needsSharedAsanRt()) {
2675 SharedRuntimes.push_back("asan");
Evgeniy Stepanov77866712012-04-25 08:59:22 +00002676 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002677
Alexey Samsonov52550342014-09-15 19:58:40 +00002678 // Collect static runtimes.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00002679 if (Args.hasArg(options::OPT_shared) || TC.getTriple().isAndroid()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002680 // Don't link static runtimes into DSOs or if compiling for Android.
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00002681 return;
Alexey Samsonov52550342014-09-15 19:58:40 +00002682 }
2683 if (SanArgs.needsAsanRt()) {
2684 if (SanArgs.needsSharedAsanRt()) {
2685 HelperStaticRuntimes.push_back("asan-preinit");
2686 } else {
2687 StaticRuntimes.push_back("asan");
2688 if (SanArgs.linkCXXRuntimes())
2689 StaticRuntimes.push_back("asan_cxx");
2690 }
2691 }
2692 if (SanArgs.needsDfsanRt())
2693 StaticRuntimes.push_back("dfsan");
2694 if (SanArgs.needsLsanRt())
2695 StaticRuntimes.push_back("lsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002696 if (SanArgs.needsMsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002697 StaticRuntimes.push_back("msan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002698 if (SanArgs.linkCXXRuntimes())
2699 StaticRuntimes.push_back("msan_cxx");
2700 }
2701 if (SanArgs.needsTsanRt()) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002702 StaticRuntimes.push_back("tsan");
Alexey Samsonov381845d2015-04-27 22:07:50 +00002703 if (SanArgs.linkCXXRuntimes())
2704 StaticRuntimes.push_back("tsan_cxx");
2705 }
Alexey Samsonov52550342014-09-15 19:58:40 +00002706 if (SanArgs.needsUbsanRt()) {
Alexey Samsonov31095462015-04-01 22:42:25 +00002707 StaticRuntimes.push_back("ubsan_standalone");
2708 if (SanArgs.linkCXXRuntimes())
2709 StaticRuntimes.push_back("ubsan_standalone_cxx");
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002710 }
Peter Collingbournec4122c12015-06-15 21:08:13 +00002711 if (SanArgs.needsSafeStackRt())
2712 StaticRuntimes.push_back("safestack");
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002713}
2714
Alexey Samsonov52550342014-09-15 19:58:40 +00002715// Should be called before we add system libraries (C++ ABI, libstdc++/libc++,
2716// C runtime, etc). Returns true if sanitizer system deps need to be linked in.
2717static bool addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002718 ArgStringList &CmdArgs) {
Alexey Samsonov52550342014-09-15 19:58:40 +00002719 SmallVector<StringRef, 4> SharedRuntimes, StaticRuntimes,
2720 HelperStaticRuntimes;
2721 collectSanitizerRuntimes(TC, Args, SharedRuntimes, StaticRuntimes,
2722 HelperStaticRuntimes);
2723 for (auto RT : SharedRuntimes)
2724 addSanitizerRuntime(TC, Args, CmdArgs, RT, true);
2725 for (auto RT : HelperStaticRuntimes)
2726 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2727 bool AddExportDynamic = false;
2728 for (auto RT : StaticRuntimes) {
2729 addSanitizerRuntime(TC, Args, CmdArgs, RT, false);
2730 AddExportDynamic |= !addSanitizerDynamicList(TC, Args, CmdArgs, RT);
2731 }
2732 // If there is a static runtime with no dynamic list, force all the symbols
2733 // to be dynamic to be sure we export sanitizer interface functions.
2734 if (AddExportDynamic)
2735 CmdArgs.push_back("-export-dynamic");
2736 return !StaticRuntimes.empty();
Peter Collingbournec3772752013-08-07 22:47:34 +00002737}
2738
Reid Kleckner86ea7702015-02-04 23:45:07 +00002739static bool areOptimizationsEnabled(const ArgList &Args) {
2740 // Find the last -O arg and see if it is non-zero.
2741 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2742 return !A->getOption().matches(options::OPT_O0);
2743 // Defaults to -O0.
2744 return false;
2745}
2746
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002747static bool shouldUseFramePointerForTarget(const ArgList &Args,
2748 const llvm::Triple &Triple) {
Dan Gohmanc2853072015-09-03 22:51:53 +00002749 switch (Triple.getArch()) {
2750 case llvm::Triple::xcore:
2751 case llvm::Triple::wasm32:
2752 case llvm::Triple::wasm64:
2753 // XCore never wants frame pointers, regardless of OS.
2754 // WebAssembly never wants frame pointers.
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002755 return false;
Dan Gohmanc2853072015-09-03 22:51:53 +00002756 default:
2757 break;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002758 }
Reid Kleckner86ea7702015-02-04 23:45:07 +00002759
2760 if (Triple.isOSLinux()) {
2761 switch (Triple.getArch()) {
2762 // Don't use a frame pointer on linux if optimizing for certain targets.
2763 case llvm::Triple::mips64:
2764 case llvm::Triple::mips64el:
2765 case llvm::Triple::mips:
2766 case llvm::Triple::mipsel:
2767 case llvm::Triple::systemz:
2768 case llvm::Triple::x86:
2769 case llvm::Triple::x86_64:
2770 return !areOptimizationsEnabled(Args);
2771 default:
2772 return true;
2773 }
2774 }
2775
2776 if (Triple.isOSWindows()) {
2777 switch (Triple.getArch()) {
2778 case llvm::Triple::x86:
2779 return !areOptimizationsEnabled(Args);
Saleem Abdulrasoola8180a22015-10-03 03:39:28 +00002780 case llvm::Triple::arm:
2781 case llvm::Triple::thumb:
2782 // Windows on ARM builds with FPO disabled to aid fast stack walking
2783 return true;
Reid Kleckner86ea7702015-02-04 23:45:07 +00002784 default:
2785 // All other supported Windows ISAs use xdata unwind information, so frame
2786 // pointers are not generally useful.
2787 return false;
2788 }
2789 }
2790
2791 return true;
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002792}
2793
Rafael Espindola224dd632011-12-14 21:02:23 +00002794static bool shouldUseFramePointer(const ArgList &Args,
2795 const llvm::Triple &Triple) {
2796 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2797 options::OPT_fomit_frame_pointer))
2798 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002799 if (Args.hasArg(options::OPT_pg))
2800 return true;
Rafael Espindola224dd632011-12-14 21:02:23 +00002801
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002802 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002803}
2804
Eric Christopherb7d97e92013-04-03 01:58:53 +00002805static bool shouldUseLeafFramePointer(const ArgList &Args,
2806 const llvm::Triple &Triple) {
2807 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2808 options::OPT_momit_leaf_frame_pointer))
2809 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
Xinliang David Li4dff8752015-11-23 17:30:31 +00002810 if (Args.hasArg(options::OPT_pg))
2811 return true;
Eric Christopherb7d97e92013-04-03 01:58:53 +00002812
Filipe Cabecinhasb1e6c2d2015-01-27 18:08:32 +00002813 if (Triple.isPS4CPU())
2814 return false;
2815
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002816 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002817}
2818
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002819/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002820static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002821 SmallString<128> cwd;
2822 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002823 CmdArgs.push_back("-fdebug-compilation-dir");
2824 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002825 }
2826}
2827
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002828static const char *SplitDebugName(const ArgList &Args, const InputInfo &Input) {
Eric Christopherd3804002013-02-22 20:12:52 +00002829 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2830 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2831 SmallString<128> T(FinalOutput->getValue());
2832 llvm::sys::path::replace_extension(T, "dwo");
2833 return Args.MakeArgString(T);
2834 } else {
2835 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002836 SmallString<128> T(
2837 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Artem Belevichba558952015-05-06 18:20:23 +00002838 SmallString<128> F(llvm::sys::path::stem(Input.getBaseInput()));
Eric Christopherd3804002013-02-22 20:12:52 +00002839 llvm::sys::path::replace_extension(F, "dwo");
2840 T += F;
2841 return Args.MakeArgString(F);
2842 }
2843}
2844
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002845static void SplitDebugInfo(const ToolChain &TC, Compilation &C, const Tool &T,
2846 const JobAction &JA, const ArgList &Args,
2847 const InputInfo &Output, const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002848 ArgStringList ExtractArgs;
2849 ExtractArgs.push_back("--extract-dwo");
2850
2851 ArgStringList StripArgs;
2852 StripArgs.push_back("--strip-dwo");
2853
2854 // Grabbing the output of the earlier compile step.
2855 StripArgs.push_back(Output.getFilename());
2856 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002857 ExtractArgs.push_back(OutFile);
2858
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002859 const char *Exec = Args.MakeArgString(TC.GetProgramPath("objcopy"));
Justin Bognerd3371d82015-07-17 03:35:54 +00002860 InputInfo II(Output.getFilename(), types::TY_Object, Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002861
2862 // First extract the dwo sections.
Justin Bognerd3371d82015-07-17 03:35:54 +00002863 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, ExtractArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002864
2865 // Then remove them from the original .o file.
Justin Bognerd3371d82015-07-17 03:35:54 +00002866 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, StripArgs, II));
Eric Christopher248357f2013-02-21 22:35:01 +00002867}
2868
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002869/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002870/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2871static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002872 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002873 if (A->getOption().matches(options::OPT_O4) ||
2874 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002875 return true;
2876
2877 if (A->getOption().matches(options::OPT_O0))
2878 return false;
2879
2880 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2881
Rafael Espindola91780de2013-08-26 14:05:41 +00002882 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002883 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002884 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002885 return true;
2886
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002887 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002888 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002889 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002890
2891 unsigned OptLevel = 0;
2892 if (S.getAsInteger(10, OptLevel))
2893 return false;
2894
2895 return OptLevel > 1;
2896 }
2897
2898 return false;
2899}
2900
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002901/// Add -x lang to \p CmdArgs for \p Input.
2902static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2903 ArgStringList &CmdArgs) {
2904 // When using -verify-pch, we don't want to provide the type
2905 // 'precompiled-header' if it was inferred from the file extension
2906 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2907 return;
2908
2909 CmdArgs.push_back("-x");
2910 if (Args.hasArg(options::OPT_rewrite_objc))
2911 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2912 else
2913 CmdArgs.push_back(types::getTypeName(Input.getType()));
2914}
2915
David Majnemerc371ff02015-03-22 08:39:22 +00002916static VersionTuple getMSCompatibilityVersion(unsigned Version) {
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002917 if (Version < 100)
David Majnemerc371ff02015-03-22 08:39:22 +00002918 return VersionTuple(Version);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002919
2920 if (Version < 10000)
David Majnemerc371ff02015-03-22 08:39:22 +00002921 return VersionTuple(Version / 100, Version % 100);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002922
2923 unsigned Build = 0, Factor = 1;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002924 for (; Version > 10000; Version = Version / 10, Factor = Factor * 10)
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002925 Build = Build + (Version % 10) * Factor;
David Majnemerc371ff02015-03-22 08:39:22 +00002926 return VersionTuple(Version / 100, Version % 100, Build);
Saleem Abdulrasoolc68237b2014-07-16 03:13:50 +00002927}
2928
Rafael Espindola577637a2015-01-03 00:06:04 +00002929// Claim options we don't want to warn if they are unused. We do this for
Rafael Espindola7a45e872015-01-05 13:44:59 +00002930// options that build systems might add but are unused when assembling or only
2931// running the preprocessor for example.
Rafael Espindola577637a2015-01-03 00:06:04 +00002932static void claimNoWarnArgs(const ArgList &Args) {
2933 // Don't warn about unused -f(no-)?lto. This can happen when we're
Rafael Espindola7a45e872015-01-05 13:44:59 +00002934 // preprocessing, precompiling or assembling.
Teresa Johnson945bc502015-10-15 20:35:53 +00002935 Args.ClaimAllArgs(options::OPT_flto_EQ);
Rafael Espindola577637a2015-01-03 00:06:04 +00002936 Args.ClaimAllArgs(options::OPT_flto);
2937 Args.ClaimAllArgs(options::OPT_fno_lto);
2938}
2939
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002940static void appendUserToPath(SmallVectorImpl<char> &Result) {
2941#ifdef LLVM_ON_UNIX
2942 const char *Username = getenv("LOGNAME");
2943#else
2944 const char *Username = getenv("USERNAME");
2945#endif
2946 if (Username) {
2947 // Validate that LoginName can be used in a path, and get its length.
2948 size_t Len = 0;
2949 for (const char *P = Username; *P; ++P, ++Len) {
Ben Langmuire056ec32015-02-04 18:34:23 +00002950 if (!isAlphanumeric(*P) && *P != '_') {
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002951 Username = nullptr;
2952 break;
2953 }
2954 }
2955
2956 if (Username && Len > 0) {
2957 Result.append(Username, Username + Len);
2958 return;
2959 }
2960 }
2961
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002962// Fallback to user id.
Ben Langmuir3b7b5402015-02-03 19:28:37 +00002963#ifdef LLVM_ON_UNIX
2964 std::string UID = llvm::utostr(getuid());
2965#else
2966 // FIXME: Windows seems to have an 'SID' that might work.
2967 std::string UID = "9999";
2968#endif
2969 Result.append(UID.begin(), UID.end());
2970}
2971
David Majnemere11d3732015-06-08 00:22:46 +00002972VersionTuple visualstudio::getMSVCVersion(const Driver *D,
2973 const llvm::Triple &Triple,
2974 const llvm::opt::ArgList &Args,
2975 bool IsWindowsMSVC) {
2976 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
2977 IsWindowsMSVC) ||
2978 Args.hasArg(options::OPT_fmsc_version) ||
2979 Args.hasArg(options::OPT_fms_compatibility_version)) {
2980 const Arg *MSCVersion = Args.getLastArg(options::OPT_fmsc_version);
2981 const Arg *MSCompatibilityVersion =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00002982 Args.getLastArg(options::OPT_fms_compatibility_version);
David Majnemere11d3732015-06-08 00:22:46 +00002983
2984 if (MSCVersion && MSCompatibilityVersion) {
2985 if (D)
2986 D->Diag(diag::err_drv_argument_not_allowed_with)
2987 << MSCVersion->getAsString(Args)
2988 << MSCompatibilityVersion->getAsString(Args);
2989 return VersionTuple();
2990 }
2991
2992 if (MSCompatibilityVersion) {
2993 VersionTuple MSVT;
2994 if (MSVT.tryParse(MSCompatibilityVersion->getValue()) && D)
2995 D->Diag(diag::err_drv_invalid_value)
2996 << MSCompatibilityVersion->getAsString(Args)
2997 << MSCompatibilityVersion->getValue();
2998 return MSVT;
2999 }
3000
3001 if (MSCVersion) {
3002 unsigned Version = 0;
3003 if (StringRef(MSCVersion->getValue()).getAsInteger(10, Version) && D)
3004 D->Diag(diag::err_drv_invalid_value) << MSCVersion->getAsString(Args)
3005 << MSCVersion->getValue();
3006 return getMSCompatibilityVersion(Version);
3007 }
3008
3009 unsigned Major, Minor, Micro;
3010 Triple.getEnvironmentVersion(Major, Minor, Micro);
3011 if (Major || Minor || Micro)
3012 return VersionTuple(Major, Minor, Micro);
3013
3014 return VersionTuple(18);
3015 }
3016 return VersionTuple();
3017}
3018
Diego Novilloa0545962015-07-10 18:00:07 +00003019static void addPGOAndCoverageFlags(Compilation &C, const Driver &D,
3020 const InputInfo &Output, const ArgList &Args,
3021 ArgStringList &CmdArgs) {
3022 auto *ProfileGenerateArg = Args.getLastArg(
3023 options::OPT_fprofile_instr_generate,
3024 options::OPT_fprofile_instr_generate_EQ, options::OPT_fprofile_generate,
Diego Novillo758f3f52015-08-05 21:49:51 +00003025 options::OPT_fprofile_generate_EQ,
3026 options::OPT_fno_profile_instr_generate);
3027 if (ProfileGenerateArg &&
3028 ProfileGenerateArg->getOption().matches(
3029 options::OPT_fno_profile_instr_generate))
3030 ProfileGenerateArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003031
3032 auto *ProfileUseArg = Args.getLastArg(
3033 options::OPT_fprofile_instr_use, options::OPT_fprofile_instr_use_EQ,
Diego Novillo758f3f52015-08-05 21:49:51 +00003034 options::OPT_fprofile_use, options::OPT_fprofile_use_EQ,
3035 options::OPT_fno_profile_instr_use);
3036 if (ProfileUseArg &&
3037 ProfileUseArg->getOption().matches(options::OPT_fno_profile_instr_use))
3038 ProfileUseArg = nullptr;
Diego Novilloa0545962015-07-10 18:00:07 +00003039
3040 if (ProfileGenerateArg && ProfileUseArg)
3041 D.Diag(diag::err_drv_argument_not_allowed_with)
Renato Golin7c542b42015-07-27 23:44:45 +00003042 << ProfileGenerateArg->getSpelling() << ProfileUseArg->getSpelling();
Diego Novilloa0545962015-07-10 18:00:07 +00003043
Diego Novillo758f3f52015-08-05 21:49:51 +00003044 if (ProfileGenerateArg) {
3045 if (ProfileGenerateArg->getOption().matches(
3046 options::OPT_fprofile_instr_generate_EQ))
3047 ProfileGenerateArg->render(Args, CmdArgs);
3048 else if (ProfileGenerateArg->getOption().matches(
3049 options::OPT_fprofile_generate_EQ)) {
3050 SmallString<128> Path(ProfileGenerateArg->getValue());
3051 llvm::sys::path::append(Path, "default.profraw");
3052 CmdArgs.push_back(
3053 Args.MakeArgString(Twine("-fprofile-instr-generate=") + Path));
3054 } else
3055 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
3056 }
Diego Novilloa0545962015-07-10 18:00:07 +00003057
Diego Novillo758f3f52015-08-05 21:49:51 +00003058 if (ProfileUseArg) {
3059 if (ProfileUseArg->getOption().matches(options::OPT_fprofile_instr_use_EQ))
3060 ProfileUseArg->render(Args, CmdArgs);
3061 else if ((ProfileUseArg->getOption().matches(
3062 options::OPT_fprofile_use_EQ) ||
3063 ProfileUseArg->getOption().matches(
3064 options::OPT_fprofile_instr_use))) {
3065 SmallString<128> Path(
3066 ProfileUseArg->getNumValues() == 0 ? "" : ProfileUseArg->getValue());
3067 if (Path.empty() || llvm::sys::fs::is_directory(Path))
3068 llvm::sys::path::append(Path, "default.profdata");
3069 CmdArgs.push_back(
3070 Args.MakeArgString(Twine("-fprofile-instr-use=") + Path));
3071 }
Diego Novilloa0545962015-07-10 18:00:07 +00003072 }
3073
3074 if (Args.hasArg(options::OPT_ftest_coverage) ||
3075 Args.hasArg(options::OPT_coverage))
3076 CmdArgs.push_back("-femit-coverage-notes");
3077 if (Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
3078 false) ||
3079 Args.hasArg(options::OPT_coverage))
3080 CmdArgs.push_back("-femit-coverage-data");
3081
Diego Novilloc4b94da2015-08-05 23:27:40 +00003082 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3083 options::OPT_fno_coverage_mapping, false) &&
3084 !ProfileGenerateArg)
Diego Novilloa0545962015-07-10 18:00:07 +00003085 D.Diag(diag::err_drv_argument_only_allowed_with)
3086 << "-fcoverage-mapping"
3087 << "-fprofile-instr-generate";
3088
Diego Novilloc4b94da2015-08-05 23:27:40 +00003089 if (Args.hasFlag(options::OPT_fcoverage_mapping,
3090 options::OPT_fno_coverage_mapping, false))
Diego Novilloa0545962015-07-10 18:00:07 +00003091 CmdArgs.push_back("-fcoverage-mapping");
3092
3093 if (C.getArgs().hasArg(options::OPT_c) ||
3094 C.getArgs().hasArg(options::OPT_S)) {
3095 if (Output.isFilename()) {
3096 CmdArgs.push_back("-coverage-file");
3097 SmallString<128> CoverageFilename;
3098 if (Arg *FinalOutput = C.getArgs().getLastArg(options::OPT_o)) {
3099 CoverageFilename = FinalOutput->getValue();
3100 } else {
3101 CoverageFilename = llvm::sys::path::filename(Output.getBaseInput());
3102 }
3103 if (llvm::sys::path::is_relative(CoverageFilename)) {
3104 SmallString<128> Pwd;
3105 if (!llvm::sys::fs::current_path(Pwd)) {
3106 llvm::sys::path::append(Pwd, CoverageFilename);
3107 CoverageFilename.swap(Pwd);
3108 }
3109 }
3110 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
3111 }
3112 }
3113}
3114
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003115/// Parses the various -fpic/-fPIC/-fpie/-fPIE arguments. Then,
3116/// smooshes them together with platform defaults, to decide whether
3117/// this compile should be using PIC mode or not. Returns a tuple of
3118/// (RelocationModel, PICLevel, IsPIE).
3119static std::tuple<llvm::Reloc::Model, unsigned, bool>
3120ParsePICArgs(const ToolChain &ToolChain, const llvm::Triple &Triple,
3121 const ArgList &Args) {
3122 // FIXME: why does this code...and so much everywhere else, use both
3123 // ToolChain.getTriple() and Triple?
3124 bool PIE = ToolChain.isPIEDefault();
3125 bool PIC = PIE || ToolChain.isPICDefault();
3126 bool IsPICLevelTwo = PIC;
3127
3128 bool KernelOrKext =
3129 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
3130
3131 // Android-specific defaults for PIC/PIE
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00003132 if (ToolChain.getTriple().isAndroid()) {
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003133 switch (ToolChain.getArch()) {
3134 case llvm::Triple::arm:
3135 case llvm::Triple::armeb:
3136 case llvm::Triple::thumb:
3137 case llvm::Triple::thumbeb:
3138 case llvm::Triple::aarch64:
3139 case llvm::Triple::mips:
3140 case llvm::Triple::mipsel:
3141 case llvm::Triple::mips64:
3142 case llvm::Triple::mips64el:
3143 PIC = true; // "-fpic"
3144 break;
3145
3146 case llvm::Triple::x86:
3147 case llvm::Triple::x86_64:
3148 PIC = true; // "-fPIC"
3149 IsPICLevelTwo = true;
3150 break;
3151
3152 default:
3153 break;
3154 }
3155 }
3156
3157 // OpenBSD-specific defaults for PIE
3158 if (ToolChain.getTriple().getOS() == llvm::Triple::OpenBSD) {
3159 switch (ToolChain.getArch()) {
3160 case llvm::Triple::mips64:
3161 case llvm::Triple::mips64el:
3162 case llvm::Triple::sparcel:
3163 case llvm::Triple::x86:
3164 case llvm::Triple::x86_64:
3165 IsPICLevelTwo = false; // "-fpie"
3166 break;
3167
3168 case llvm::Triple::ppc:
3169 case llvm::Triple::sparc:
3170 case llvm::Triple::sparcv9:
3171 IsPICLevelTwo = true; // "-fPIE"
3172 break;
3173
3174 default:
3175 break;
3176 }
3177 }
3178
3179 // The last argument relating to either PIC or PIE wins, and no
3180 // other argument is used. If the last argument is any flavor of the
3181 // '-fno-...' arguments, both PIC and PIE are disabled. Any PIE
3182 // option implicitly enables PIC at the same level.
3183 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
3184 options::OPT_fpic, options::OPT_fno_pic,
3185 options::OPT_fPIE, options::OPT_fno_PIE,
3186 options::OPT_fpie, options::OPT_fno_pie);
3187 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
3188 // is forced, then neither PIC nor PIE flags will have no effect.
3189 if (!ToolChain.isPICDefaultForced()) {
3190 if (LastPICArg) {
3191 Option O = LastPICArg->getOption();
3192 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
3193 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
3194 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
3195 PIC =
3196 PIE || O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic);
3197 IsPICLevelTwo =
3198 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fPIC);
3199 } else {
3200 PIE = PIC = false;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003201 if (Triple.isPS4CPU()) {
3202 Arg *ModelArg = Args.getLastArg(options::OPT_mcmodel_EQ);
3203 StringRef Model = ModelArg ? ModelArg->getValue() : "";
3204 if (Model != "kernel") {
3205 PIC = true;
3206 ToolChain.getDriver().Diag(diag::warn_drv_ps4_force_pic)
3207 << LastPICArg->getSpelling();
3208 }
3209 }
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003210 }
3211 }
3212 }
3213
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003214 // Introduce a Darwin and PS4-specific hack. If the default is PIC, but the
3215 // PIC level would've been set to level 1, force it back to level 2 PIC
3216 // instead.
3217 if (PIC && (ToolChain.getTriple().isOSDarwin() || Triple.isPS4CPU()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003218 IsPICLevelTwo |= ToolChain.isPICDefault();
3219
James Y Knightc4015d32015-08-21 04:14:55 +00003220 // This kernel flags are a trump-card: they will disable PIC/PIE
3221 // generation, independent of the argument order.
Tim Northover6f3ff222015-10-30 16:30:27 +00003222 if (KernelOrKext && ((!Triple.isiOS() || Triple.isOSVersionLT(6)) &&
3223 !Triple.isWatchOS()))
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003224 PIC = PIE = false;
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003225
3226 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
3227 // This is a very special mode. It trumps the other modes, almost no one
3228 // uses it, and it isn't even valid on any OS but Darwin.
3229 if (!ToolChain.getTriple().isOSDarwin())
3230 ToolChain.getDriver().Diag(diag::err_drv_unsupported_opt_for_target)
3231 << A->getSpelling() << ToolChain.getTriple().str();
3232
3233 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
3234
3235 // Only a forced PIC mode can cause the actual compile to have PIC defines
3236 // etc., no flags are sufficient. This behavior was selected to closely
3237 // match that of llvm-gcc and Apple GCC before that.
3238 PIC = ToolChain.isPICDefault() && ToolChain.isPICDefaultForced();
3239
3240 return std::make_tuple(llvm::Reloc::DynamicNoPIC, PIC ? 2 : 0, false);
3241 }
3242
3243 if (PIC)
3244 return std::make_tuple(llvm::Reloc::PIC_, IsPICLevelTwo ? 2 : 1, PIE);
3245
3246 return std::make_tuple(llvm::Reloc::Static, 0, false);
3247}
3248
3249static const char *RelocationModelName(llvm::Reloc::Model Model) {
3250 switch (Model) {
3251 case llvm::Reloc::Default:
3252 return nullptr;
3253 case llvm::Reloc::Static:
3254 return "static";
3255 case llvm::Reloc::PIC_:
3256 return "pic";
3257 case llvm::Reloc::DynamicNoPIC:
3258 return "dynamic-no-pic";
3259 }
Aaron Ballman2ec49282015-08-20 13:31:16 +00003260 llvm_unreachable("Unknown Reloc::Model kind");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003261}
3262
3263static void AddAssemblerKPIC(const ToolChain &ToolChain, const ArgList &Args,
3264 ArgStringList &CmdArgs) {
3265 llvm::Reloc::Model RelocationModel;
3266 unsigned PICLevel;
3267 bool IsPIE;
3268 std::tie(RelocationModel, PICLevel, IsPIE) =
3269 ParsePICArgs(ToolChain, ToolChain.getTriple(), Args);
3270
3271 if (RelocationModel != llvm::Reloc::Static)
3272 CmdArgs.push_back("-KPIC");
3273}
3274
Daniel Dunbar1a093d22009-03-18 06:00:36 +00003275void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003276 const InputInfo &Output, const InputInfoList &Inputs,
3277 const ArgList &Args, const char *LinkingOutput) const {
James Y Knight2db38f32015-08-15 03:45:25 +00003278 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
3279 const llvm::Triple Triple(TripleStr);
3280
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003281 bool KernelOrKext =
3282 Args.hasArg(options::OPT_mkernel, options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00003283 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00003284 ArgStringList CmdArgs;
3285
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003286 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00003287 bool IsWindowsCygnus =
3288 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003289 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003290 bool IsPS4CPU = getToolChain().getTriple().isPS4CPU();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003291
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003292 // Check number of inputs for sanity. We need at least one input.
3293 assert(Inputs.size() >= 1 && "Must have at least one input.");
Artem Belevichba558952015-05-06 18:20:23 +00003294 const InputInfo &Input = Inputs[0];
Artem Belevich0ff05cd2015-07-13 23:27:56 +00003295 // CUDA compilation may have multiple inputs (source file + results of
3296 // device-side compilations). All other jobs are expected to have exactly one
3297 // input.
3298 bool IsCuda = types::isCuda(Input.getType());
3299 assert((IsCuda || Inputs.size() == 1) && "Unable to handle multiple inputs.");
Daniel Dunbare521a892009-03-31 20:53:55 +00003300
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00003301 // Invoke ourselves in -cc1 mode.
3302 //
3303 // FIXME: Implement custom jobs for internal actions.
3304 CmdArgs.push_back("-cc1");
3305
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003306 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00003307 CmdArgs.push_back("-triple");
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003308 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00003309
Artem Belevichfa11ab52015-11-17 22:28:46 +00003310 const ToolChain *AuxToolChain = nullptr;
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003311 if (IsCuda) {
3312 // FIXME: We need a (better) way to pass information about
3313 // particular compilation pass we're constructing here. For now we
3314 // can check which toolchain we're using and pick the other one to
3315 // extract the triple.
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003316 if (&getToolChain() == C.getCudaDeviceToolChain())
3317 AuxToolChain = C.getCudaHostToolChain();
3318 else if (&getToolChain() == C.getCudaHostToolChain())
3319 AuxToolChain = C.getCudaDeviceToolChain();
3320 else
3321 llvm_unreachable("Can't figure out CUDA compilation mode.");
3322 assert(AuxToolChain != nullptr && "No aux toolchain.");
3323 CmdArgs.push_back("-aux-triple");
3324 CmdArgs.push_back(Args.MakeArgString(AuxToolChain->getTriple().str()));
Artem Belevich86017332015-11-17 22:28:55 +00003325 CmdArgs.push_back("-fcuda-target-overloads");
3326 CmdArgs.push_back("-fcuda-disable-target-call-checks");
Artem Belevich5e2a3ec2015-11-17 22:28:40 +00003327 }
3328
James Y Knight2db38f32015-08-15 03:45:25 +00003329 if (Triple.isOSWindows() && (Triple.getArch() == llvm::Triple::arm ||
3330 Triple.getArch() == llvm::Triple::thumb)) {
3331 unsigned Offset = Triple.getArch() == llvm::Triple::arm ? 4 : 6;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003332 unsigned Version;
James Y Knight2db38f32015-08-15 03:45:25 +00003333 Triple.getArchName().substr(Offset).getAsInteger(10, Version);
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003334 if (Version < 7)
James Y Knight2db38f32015-08-15 03:45:25 +00003335 D.Diag(diag::err_target_unsupported_arch) << Triple.getArchName()
Nico Webere8e53112014-05-11 01:04:02 +00003336 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00003337 }
3338
Tim Northover336f1892014-03-29 13:16:12 +00003339 // Push all default warning arguments that are specific to
3340 // the given target. These come before user provided warning options
3341 // are provided.
3342 getToolChain().addClangWarningOptions(CmdArgs);
3343
Daniel Dunbar624c21b2009-10-30 18:12:20 +00003344 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00003345 RewriteKind rewriteKind = RK_None;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003346
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003347 if (isa<AnalyzeJobAction>(JA)) {
3348 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
3349 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003350 } else if (isa<MigrateJobAction>(JA)) {
3351 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003352 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003353 if (Output.getType() == types::TY_Dependencies)
3354 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003355 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00003356 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00003357 if (Args.hasArg(options::OPT_rewrite_objc) &&
3358 !Args.hasArg(options::OPT_g_Group))
3359 CmdArgs.push_back("-P");
3360 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00003361 } else if (isa<AssembleJobAction>(JA)) {
3362 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00003363
David Blaikie9260ed62013-07-25 21:19:01 +00003364 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00003365
3366 // Also ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003367 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003368 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00003369 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003370 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00003371
Aaron Ballman1f10cc52012-07-31 01:21:00 +00003372 if (JA.getType() == types::TY_Nothing)
3373 CmdArgs.push_back("-fsyntax-only");
3374 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00003375 CmdArgs.push_back("-emit-pch");
3376 else
3377 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003378 } else if (isa<VerifyPCHJobAction>(JA)) {
3379 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003380 } else {
Bob Wilson23a55f12014-12-21 07:00:00 +00003381 assert((isa<CompileJobAction>(JA) || isa<BackendJobAction>(JA)) &&
3382 "Invalid action for clang tool.");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003383 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00003384 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003385 } else if (JA.getType() == types::TY_LLVM_IR ||
3386 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003387 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00003388 } else if (JA.getType() == types::TY_LLVM_BC ||
3389 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003390 CmdArgs.push_back("-emit-llvm-bc");
3391 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00003392 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00003393 } else if (JA.getType() == types::TY_AST) {
3394 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00003395 } else if (JA.getType() == types::TY_ModuleFile) {
3396 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003397 } else if (JA.getType() == types::TY_RewrittenObjC) {
3398 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003399 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00003400 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
3401 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00003402 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00003403 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003404 assert(JA.getType() == types::TY_PP_Asm && "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003405 }
Duncan P. N. Exon Smithd863f6f2015-04-14 18:30:13 +00003406
3407 // Preserve use-list order by default when emitting bitcode, so that
3408 // loading the bitcode up in 'opt' or 'llc' and running passes gives the
3409 // same result as running passes here. For LTO, we don't need to preserve
3410 // the use-list order, since serialization to bitcode is part of the flow.
Duncan P. N. Exon Smithbb618252015-04-15 01:16:18 +00003411 if (JA.getType() == types::TY_LLVM_BC)
3412 CmdArgs.push_back("-emit-llvm-uselists");
Teresa Johnson945bc502015-10-15 20:35:53 +00003413
3414 if (D.isUsingLTO())
3415 Args.AddLastArg(CmdArgs, options::OPT_flto, options::OPT_flto_EQ);
Daniel Dunbara3246a02009-03-18 08:07:30 +00003416 }
3417
Teresa Johnsonaff22322015-12-07 19:21:34 +00003418 if (const Arg *A = Args.getLastArg(options::OPT_fthinlto_index_EQ)) {
3419 if (!types::isLLVMIR(Input.getType()))
3420 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
3421 << "-x ir";
3422 Args.AddLastArg(CmdArgs, options::OPT_fthinlto_index_EQ);
3423 }
3424
Justin Bognera88f0122014-06-20 22:59:50 +00003425 // We normally speed up the clang process a bit by skipping destructors at
3426 // exit, but when we're generating diagnostics we can rely on some of the
3427 // cleanup.
3428 if (!C.isForDiagnostics())
3429 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003430
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003431// Disable the verification pass in -asserts builds.
John McCallbb79b5f2010-02-13 03:50:24 +00003432#ifdef NDEBUG
3433 CmdArgs.push_back("-disable-llvm-verifier");
3434#endif
3435
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003436 // Set the main file name, so that debug info works even with
3437 // -save-temps.
3438 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00003439 CmdArgs.push_back(getBaseInputName(Args, Input));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00003440
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003441 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00003442 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00003443 if (Args.hasArg(options::OPT_static))
3444 CmdArgs.push_back("-static-define");
3445
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003446 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00003447 // Enable region store model by default.
3448 CmdArgs.push_back("-analyzer-store=region");
3449
Ted Kremenek7bea9a12009-12-07 22:26:14 +00003450 // Treat blocks as analysis entry points.
3451 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
3452
Ted Kremenek49c79792011-03-24 00:28:47 +00003453 CmdArgs.push_back("-analyzer-eagerly-assume");
3454
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003455 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003456 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003457 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00003458
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003459 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003460 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00003461
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00003462 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00003463 CmdArgs.push_back("-analyzer-checker=osx");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003464
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00003465 CmdArgs.push_back("-analyzer-checker=deadcode");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003466
Artem Belevichba558952015-05-06 18:20:23 +00003467 if (types::isCXX(Input.getType()))
Jordan Rose10ad0812013-04-05 17:55:07 +00003468 CmdArgs.push_back("-analyzer-checker=cplusplus");
3469
Nico Webere8e53112014-05-11 01:04:02 +00003470 // Enable the following experimental checkers for testing.
3471 CmdArgs.push_back(
3472 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00003473 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
3474 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003475 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
Ted Kremenek37e96522012-01-26 02:27:38 +00003476 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
3477 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Gabor Horvathe3085992015-09-14 20:34:06 +00003478
3479 // Default nullability checks.
3480 CmdArgs.push_back("-analyzer-checker=nullability.NullPassedToNonnull");
3481 CmdArgs.push_back(
3482 "-analyzer-checker=nullability.NullReturnedFromNonnull");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003483 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003484
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003485 // Set the output format. The default is plist, for (lame) historical
3486 // reasons.
3487 CmdArgs.push_back("-analyzer-output");
3488 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00003489 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00003490 else
3491 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003492
Ted Kremenekfe449a22010-03-22 22:32:05 +00003493 // Disable the presentation of standard compiler warnings when
3494 // using --analyze. We only want to show static analyzer diagnostics
3495 // or frontend errors.
3496 CmdArgs.push_back("-w");
3497
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003498 // Add -Xanalyzer arguments when running as analyzer.
3499 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00003500 }
3501
Daniel Dunbar4eadb602009-09-10 01:21:12 +00003502 CheckCodeGenerationOptions(D, Args);
3503
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003504 llvm::Reloc::Model RelocationModel;
3505 unsigned PICLevel;
3506 bool IsPIE;
3507 std::tie(RelocationModel, PICLevel, IsPIE) =
3508 ParsePICArgs(getToolChain(), Triple, Args);
Peter Collingbourne54d770c2013-04-09 04:35:11 +00003509
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003510 const char *RMName = RelocationModelName(RelocationModel);
3511 if (RMName) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003512 CmdArgs.push_back("-mrelocation-model");
James Y Knight5bdf7ab2015-08-19 15:12:02 +00003513 CmdArgs.push_back(RMName);
3514 }
3515 if (PICLevel > 0) {
3516 CmdArgs.push_back("-pic-level");
3517 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
3518 if (IsPIE) {
3519 CmdArgs.push_back("-pie-level");
3520 CmdArgs.push_back(PICLevel == 1 ? "1" : "2");
Chandler Carruth76a943b2012-11-19 03:52:03 +00003521 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003522 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00003523
Renato Golin4854d802015-11-09 12:40:41 +00003524 if (Arg *A = Args.getLastArg(options::OPT_meabi)) {
3525 CmdArgs.push_back("-meabi");
3526 CmdArgs.push_back(A->getValue());
3527 }
3528
Jonathan Roelofsb140a102014-10-03 21:57:44 +00003529 CmdArgs.push_back("-mthread-model");
3530 if (Arg *A = Args.getLastArg(options::OPT_mthread_model))
3531 CmdArgs.push_back(A->getValue());
3532 else
3533 CmdArgs.push_back(Args.MakeArgString(getToolChain().getThreadModel()));
3534
Michael Zolotukhinc888dd02015-03-17 20:03:11 +00003535 Args.AddLastArg(CmdArgs, options::OPT_fveclib);
3536
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00003537 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
3538 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00003539 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00003540
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003541 // LLVM Code Generator Options.
3542
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003543 if (Args.hasArg(options::OPT_frewrite_map_file) ||
3544 Args.hasArg(options::OPT_frewrite_map_file_EQ)) {
Sean Silva14facf32015-06-09 01:57:17 +00003545 for (const Arg *A : Args.filtered(options::OPT_frewrite_map_file,
3546 options::OPT_frewrite_map_file_EQ)) {
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003547 CmdArgs.push_back("-frewrite-map-file");
Sean Silva14facf32015-06-09 01:57:17 +00003548 CmdArgs.push_back(A->getValue());
3549 A->claim();
Saleem Abdulrasool76a4b952015-01-09 05:10:20 +00003550 }
3551 }
3552
Alp Tokerfb8d02b2014-06-05 22:10:59 +00003553 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
3554 StringRef v = A->getValue();
3555 CmdArgs.push_back("-mllvm");
3556 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
3557 A->claim();
3558 }
3559
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003560 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
3561 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00003562 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00003563 }
3564
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00003565 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
3566 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003567 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00003568 D.Diag(diag::err_drv_unsupported_opt_for_target)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003569 << A->getSpelling() << getToolChain().getTriple().str();
John McCall1fe2a8c2013-06-18 02:46:29 +00003570 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
3571 CmdArgs.push_back("-fpcc-struct-return");
3572 } else {
3573 assert(A->getOption().matches(options::OPT_freg_struct_return));
3574 CmdArgs.push_back("-freg-struct-return");
3575 }
3576 }
3577
Roman Divacky65b88cd2011-03-01 17:40:53 +00003578 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
3579 CmdArgs.push_back("-mrtd");
3580
Rafael Espindola224dd632011-12-14 21:02:23 +00003581 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003582 CmdArgs.push_back("-mdisable-fp-elim");
3583 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
3584 options::OPT_fno_zero_initialized_in_bss))
3585 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003586
3587 bool OFastEnabled = isOptimizationLevelFast(Args);
3588 // If -Ofast is the optimization level, then -fstrict-aliasing should be
3589 // enabled. This alias option is being used to simplify the hasFlag logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003590 OptSpecifier StrictAliasingAliasOption =
3591 OFastEnabled ? options::OPT_Ofast : options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003592 // We turn strict aliasing off by default if we're in CL mode, since MSVC
3593 // doesn't do any TBAA.
3594 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003595 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00003596 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00003597 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00003598 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
3599 options::OPT_fno_struct_path_tbaa))
3600 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00003601 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
3602 false))
3603 CmdArgs.push_back("-fstrict-enums");
Piotr Padlewski338c9d02015-09-15 21:46:47 +00003604 if (Args.hasFlag(options::OPT_fstrict_vtable_pointers,
3605 options::OPT_fno_strict_vtable_pointers,
3606 false))
3607 CmdArgs.push_back("-fstrict-vtable-pointers");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00003608 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
3609 options::OPT_fno_optimize_sibling_calls))
3610 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003611
Eric Christopher006208c2013-04-04 06:29:47 +00003612 // Handle segmented stacks.
3613 if (Args.hasArg(options::OPT_fsplit_stack))
3614 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003615
3616 // If -Ofast is the optimization level, then -ffast-math should be enabled.
3617 // This alias option is being used to simplify the getLastArg logic.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003618 OptSpecifier FastMathAliasOption =
3619 OFastEnabled ? options::OPT_Ofast : options::OPT_ffast_math;
3620
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003621 // Handle various floating point optimization flags, mapping them to the
3622 // appropriate LLVM code generation flags. The pattern for all of these is to
3623 // default off the codegen optimizations, and if any flag enables them and no
3624 // flag disables them after the flag enabling them, enable the codegen
3625 // optimization. This is complicated by several "umbrella" flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003626 if (Arg *A = Args.getLastArg(
3627 options::OPT_ffast_math, FastMathAliasOption,
3628 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3629 options::OPT_fno_finite_math_only, options::OPT_fhonor_infinities,
3630 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003631 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3632 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003633 A->getOption().getID() != options::OPT_fhonor_infinities)
3634 CmdArgs.push_back("-menable-no-infs");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003635 if (Arg *A = Args.getLastArg(
3636 options::OPT_ffast_math, FastMathAliasOption,
3637 options::OPT_fno_fast_math, options::OPT_ffinite_math_only,
3638 options::OPT_fno_finite_math_only, options::OPT_fhonor_nans,
3639 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003640 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3641 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003642 A->getOption().getID() != options::OPT_fhonor_nans)
3643 CmdArgs.push_back("-menable-no-nans");
3644
Benjamin Kramerc242ef22012-05-02 14:55:48 +00003645 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
3646 bool MathErrno = getToolChain().IsMathErrnoDefault();
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003647 if (Arg *A =
3648 Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3649 options::OPT_fno_fast_math, options::OPT_fmath_errno,
3650 options::OPT_fno_math_errno)) {
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00003651 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
3652 // However, turning *off* -ffast_math merely restores the toolchain default
3653 // (which may be false).
3654 if (A->getOption().getID() == options::OPT_fno_math_errno ||
3655 A->getOption().getID() == options::OPT_ffast_math ||
3656 A->getOption().getID() == options::OPT_Ofast)
3657 MathErrno = false;
3658 else if (A->getOption().getID() == options::OPT_fmath_errno)
3659 MathErrno = true;
3660 }
Chandler Carruth3634c662012-04-26 02:10:51 +00003661 if (MathErrno)
3662 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003663
3664 // There are several flags which require disabling very specific
3665 // optimizations. Any of these being disabled forces us to turn off the
3666 // entire set of LLVM optimizations, so collect them through all the flag
3667 // madness.
3668 bool AssociativeMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003669 if (Arg *A = Args.getLastArg(
3670 options::OPT_ffast_math, FastMathAliasOption,
3671 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3672 options::OPT_fno_unsafe_math_optimizations,
3673 options::OPT_fassociative_math, options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003674 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3675 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003676 A->getOption().getID() != options::OPT_fno_associative_math)
3677 AssociativeMath = true;
3678 bool ReciprocalMath = false;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003679 if (Arg *A = Args.getLastArg(
3680 options::OPT_ffast_math, FastMathAliasOption,
3681 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3682 options::OPT_fno_unsafe_math_optimizations,
3683 options::OPT_freciprocal_math, options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003684 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3685 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003686 A->getOption().getID() != options::OPT_fno_reciprocal_math)
3687 ReciprocalMath = true;
3688 bool SignedZeros = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003689 if (Arg *A = Args.getLastArg(
3690 options::OPT_ffast_math, FastMathAliasOption,
3691 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3692 options::OPT_fno_unsafe_math_optimizations,
3693 options::OPT_fsigned_zeros, options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003694 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3695 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003696 A->getOption().getID() != options::OPT_fsigned_zeros)
3697 SignedZeros = false;
3698 bool TrappingMath = true;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003699 if (Arg *A = Args.getLastArg(
3700 options::OPT_ffast_math, FastMathAliasOption,
3701 options::OPT_fno_fast_math, options::OPT_funsafe_math_optimizations,
3702 options::OPT_fno_unsafe_math_optimizations,
3703 options::OPT_ftrapping_math, options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003704 if (A->getOption().getID() != options::OPT_fno_fast_math &&
3705 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003706 A->getOption().getID() != options::OPT_ftrapping_math)
3707 TrappingMath = false;
3708 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
3709 !TrappingMath)
3710 CmdArgs.push_back("-menable-unsafe-fp-math");
3711
Sanjay Patel76c9e092015-01-23 16:40:50 +00003712 if (!SignedZeros)
3713 CmdArgs.push_back("-fno-signed-zeros");
Lang Hamesaa53b932012-07-06 00:59:19 +00003714
Sanjay Patel359b1052015-04-09 15:03:23 +00003715 if (ReciprocalMath)
3716 CmdArgs.push_back("-freciprocal-math");
3717
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003718 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003719 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003720 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00003721 options::OPT_ffp_contract)) {
3722 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003723 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00003724 if (Val == "fast" || Val == "on" || Val == "off") {
3725 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
3726 } else {
3727 D.Diag(diag::err_drv_unsupported_option_argument)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003728 << A->getOption().getName() << Val;
Lang Hamesaa53b932012-07-06 00:59:19 +00003729 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003730 } else if (A->getOption().matches(options::OPT_ffast_math) ||
3731 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00003732 // If fast-math is set then set the fp-contract mode to fast.
3733 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
3734 }
3735 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003736
Sanjay Patel2987c292015-06-11 14:53:41 +00003737 ParseMRecip(getToolChain().getDriver(), Args, CmdArgs);
Lang Hamesaa53b932012-07-06 00:59:19 +00003738
Bob Wilson6a039162012-07-19 03:52:53 +00003739 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
3740 // and if we find them, tell the frontend to provide the appropriate
3741 // preprocessor macros. This is distinct from enabling any optimizations as
3742 // these options induce language changes which must survive serialization
3743 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00003744 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
3745 options::OPT_fno_fast_math))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003746 if (!A->getOption().matches(options::OPT_fno_fast_math))
3747 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00003748 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
3749 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00003750 if (A->getOption().matches(options::OPT_ffinite_math_only))
3751 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00003752
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003753 // Decide whether to use verbose asm. Verbose assembly is the default on
3754 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003755 bool IsIntegratedAssemblerDefault =
3756 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003757 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003758 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003759 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003760 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00003761
Rafael Espindolab8a12932015-05-22 20:44:03 +00003762 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
3763 IsIntegratedAssemblerDefault))
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00003764 CmdArgs.push_back("-no-integrated-as");
3765
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003766 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
3767 CmdArgs.push_back("-mdebug-pass");
3768 CmdArgs.push_back("Structure");
3769 }
3770 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
3771 CmdArgs.push_back("-mdebug-pass");
3772 CmdArgs.push_back("Arguments");
3773 }
3774
John McCall8517abc2010-02-19 02:45:38 +00003775 // Enable -mconstructor-aliases except on darwin, where we have to
3776 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00003777 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00003778 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003779
John McCall7ef5cb32011-03-18 02:56:14 +00003780 // Darwin's kernel doesn't support guard variables; just die if we
3781 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00003782 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00003783 CmdArgs.push_back("-fforbid-guard-variables");
3784
Akira Hatanaka02028482015-11-12 17:21:22 +00003785 if (Args.hasFlag(options::OPT_mms_bitfields, options::OPT_mno_ms_bitfields,
3786 false)) {
Douglas Gregordbe39272011-02-01 15:15:22 +00003787 CmdArgs.push_back("-mms-bitfields");
3788 }
John McCall8517abc2010-02-19 02:45:38 +00003789
Daniel Dunbar306945d2009-09-16 06:17:29 +00003790 // This is a coarse approximation of what llvm-gcc actually does, both
3791 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
3792 // complicated ways.
3793 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00003794 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
3795 options::OPT_fno_asynchronous_unwind_tables,
3796 (getToolChain().IsUnwindTablesDefault() ||
3797 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
3798 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00003799 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
3800 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003801 CmdArgs.push_back("-munwind-tables");
3802
Chandler Carruth05fb5852012-11-21 23:40:23 +00003803 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00003804
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003805 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
3806 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00003807 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003808 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00003809
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003810 // FIXME: Handle -mtune=.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003811 (void)Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00003812
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003813 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00003814 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00003815 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00003816 }
3817
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003818 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00003819 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ false);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003820 if (!CPU.empty()) {
3821 CmdArgs.push_back("-target-cpu");
3822 CmdArgs.push_back(Args.MakeArgString(CPU));
3823 }
3824
Rafael Espindolaeb265472013-08-21 21:59:03 +00003825 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
3826 CmdArgs.push_back("-mfpmath");
3827 CmdArgs.push_back(A->getValue());
3828 }
3829
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003830 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00003831 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00003832
Rafael Espindola22ce34a2013-08-20 22:12:08 +00003833 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003834 switch (getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003835 default:
3836 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00003837
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003838 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003839 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003840 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00003841 case llvm::Triple::thumbeb:
Saleem Abdulrasoolce63ce92015-09-19 18:19:44 +00003842 // Use the effective triple, which takes into account the deployment target.
3843 AddARMTargetArgs(Triple, Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00003844 break;
3845
Tim Northover573cbee2014-05-24 12:52:07 +00003846 case llvm::Triple::aarch64:
3847 case llvm::Triple::aarch64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00003848 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00003849 break;
3850
Eric Christopher0b26a612010-03-02 02:41:08 +00003851 case llvm::Triple::mips:
3852 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00003853 case llvm::Triple::mips64:
3854 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00003855 AddMIPSTargetArgs(Args, CmdArgs);
3856 break;
3857
Ulrich Weigand8afad612014-07-28 13:17:52 +00003858 case llvm::Triple::ppc:
3859 case llvm::Triple::ppc64:
3860 case llvm::Triple::ppc64le:
3861 AddPPCTargetArgs(Args, CmdArgs);
3862 break;
3863
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003864 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00003865 case llvm::Triple::sparcel:
Brad Smith10cd0f42014-07-11 20:12:08 +00003866 case llvm::Triple::sparcv9:
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00003867 AddSparcTargetArgs(Args, CmdArgs);
3868 break;
3869
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00003870 case llvm::Triple::x86:
3871 case llvm::Triple::x86_64:
3872 AddX86TargetArgs(Args, CmdArgs);
3873 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00003874
3875 case llvm::Triple::hexagon:
3876 AddHexagonTargetArgs(Args, CmdArgs);
3877 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00003878 }
3879
Douglas Katzman3459ce22015-10-08 04:24:12 +00003880 // The 'g' groups options involve a somewhat intricate sequence of decisions
3881 // about what to pass from the driver to the frontend, but by the time they
3882 // reach cc1 they've been factored into two well-defined orthogonal choices:
3883 // * what level of debug info to generate
3884 // * what dwarf version to write
3885 // This avoids having to monkey around further in cc1 other than to disable
3886 // codeview if not running in a Windows environment. Perhaps even that
3887 // decision should be made in the driver as well though.
3888 enum CodeGenOptions::DebugInfoKind DebugInfoKind =
3889 CodeGenOptions::NoDebugInfo;
3890 // These two are potentially updated by AddClangCLArgs.
3891 unsigned DwarfVersion = 0;
3892 bool EmitCodeView = false;
3893
Hans Wennborg75958c42013-08-08 00:17:41 +00003894 // Add clang-cl arguments.
3895 if (getToolChain().getDriver().IsCLMode())
Douglas Katzman3459ce22015-10-08 04:24:12 +00003896 AddClangCLArgs(Args, CmdArgs, &DebugInfoKind, &EmitCodeView);
Hans Wennborg75958c42013-08-08 00:17:41 +00003897
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003898 // Pass the linker version in use.
3899 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
3900 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00003901 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00003902 }
3903
Eric Christopherb7d97e92013-04-03 01:58:53 +00003904 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00003905 CmdArgs.push_back("-momit-leaf-frame-pointer");
3906
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003907 // Explicitly error on some things we know we don't support and can't just
3908 // ignore.
Artem Belevichba558952015-05-06 18:20:23 +00003909 types::ID InputType = Input.getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003910 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
3911 Arg *Unsupported;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003912 if (types::isCXX(InputType) && getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003913 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00003914 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
3915 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003916 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003917 << Unsupported->getOption().getName();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00003918 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00003919 }
3920
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003921 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00003922 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00003923 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00003924 CmdArgs.push_back("-header-include-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003925 CmdArgs.push_back(D.CCPrintHeadersFilename ? D.CCPrintHeadersFilename
3926 : "-");
Daniel Dunbarac540b32011-02-02 21:11:35 +00003927 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003928 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00003929 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003930
Chad Rosierbe10f982011-08-02 17:58:04 +00003931 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003932 CmdArgs.push_back("-diagnostic-log-file");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00003933 CmdArgs.push_back(D.CCLogDiagnosticsFilename ? D.CCLogDiagnosticsFilename
3934 : "-");
Daniel Dunbar529c03b2011-04-07 18:01:20 +00003935 }
3936
Rafael Espindola08a692a2010-03-07 04:46:18 +00003937 Args.ClaimAllArgs(options::OPT_g_Group);
David Blaikiece3e7a62015-07-30 21:42:22 +00003938 Arg *SplitDwarfArg = Args.getLastArg(options::OPT_gsplit_dwarf);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003939 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003940 // If you say "-gline-tables-only -gsplit-dwarf", split-dwarf wins,
3941 // which mandates turning on "-g". But -split-dwarf is not a g_group option,
3942 // hence it takes a nontrivial test to decide about line-tables-only.
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003943 if (A->getOption().matches(options::OPT_gline_tables_only) &&
David Blaikiece3e7a62015-07-30 21:42:22 +00003944 (!SplitDwarfArg || A->getIndex() > SplitDwarfArg->getIndex())) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003945 DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
David Blaikiece3e7a62015-07-30 21:42:22 +00003946 SplitDwarfArg = nullptr;
Douglas Katzman9a2ef282015-09-30 15:55:59 +00003947 } else if (!A->getOption().matches(options::OPT_g0)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003948 // Some 'g' group option other than one expressly disabling debug info
3949 // must have been the final (winning) one. They're all equivalent.
3950 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl549c5142014-02-17 17:40:52 +00003951 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00003952 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003953
Douglas Katzman3459ce22015-10-08 04:24:12 +00003954 // If a -gdwarf argument appeared, use it, unless DebugInfoKind is None
3955 // (because that would mean that "-g0" was the rightmost 'g' group option).
3956 // FIXME: specifying "-gdwarf-<N>" "-g1" in that order works,
3957 // but "-g1" "-gdwarf-<N>" does not. A deceptively simple (but wrong) "fix"
3958 // exists of removing the gdwarf options from the g_group.
3959 if (Arg *A = Args.getLastArg(options::OPT_gdwarf_2, options::OPT_gdwarf_3,
3960 options::OPT_gdwarf_4))
3961 DwarfVersion = DwarfVersionNum(A->getSpelling());
3962
Reid Kleckner124955a2015-08-05 18:51:13 +00003963 // Forward -gcodeview.
Douglas Katzman3459ce22015-10-08 04:24:12 +00003964 // 'EmitCodeView might have been set by CL-compatibility argument parsing.
3965 if (Args.hasArg(options::OPT_gcodeview) || EmitCodeView) {
3966 // DwarfVersion remains at 0 if no explicit choice was made.
3967 CmdArgs.push_back("-gcodeview");
3968 } else if (DwarfVersion == 0 &&
3969 DebugInfoKind != CodeGenOptions::NoDebugInfo) {
3970 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
3971 }
Reid Kleckner124955a2015-08-05 18:51:13 +00003972
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003973 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
3974 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003975
3976 // PS4 defaults to no column info
Diego Novillo94b276d2014-07-10 23:29:28 +00003977 if (Args.hasFlag(options::OPT_gcolumn_info, options::OPT_gno_column_info,
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00003978 /*Default=*/ !IsPS4CPU))
Eric Christophera2f7eb72012-10-18 21:52:18 +00003979 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00003980
Eric Christopher138c32b2013-09-13 22:37:55 +00003981 // FIXME: Move backend command line options to the module.
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003982 if (Args.hasArg(options::OPT_gmodules)) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003983 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Adrian Prantl6b21ab22015-08-27 19:46:20 +00003984 CmdArgs.push_back("-dwarf-ext-refs");
3985 CmdArgs.push_back("-fmodule-format=obj");
3986 }
3987
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003988 // -gsplit-dwarf should turn on -g and enable the backend dwarf
3989 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00003990 // FIXME: Currently only works on Linux.
David Blaikiece3e7a62015-07-30 21:42:22 +00003991 if (getToolChain().getTriple().isOSLinux() && SplitDwarfArg) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00003992 DebugInfoKind = CodeGenOptions::LimitedDebugInfo;
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00003993 CmdArgs.push_back("-backend-option");
3994 CmdArgs.push_back("-split-dwarf=Enable");
3995 }
3996
Douglas Katzman3459ce22015-10-08 04:24:12 +00003997 // After we've dealt with all combinations of things that could
3998 // make DebugInfoKind be other than None or DebugLineTablesOnly,
3999 // figure out if we need to "upgrade" it to standalone debug info.
4000 // We parse these two '-f' options whether or not they will be used,
4001 // to claim them even if you wrote "-fstandalone-debug -gline-tables-only"
4002 bool NeedFullDebug = Args.hasFlag(options::OPT_fstandalone_debug,
4003 options::OPT_fno_standalone_debug,
4004 getToolChain().GetDefaultStandaloneDebug());
4005 if (DebugInfoKind == CodeGenOptions::LimitedDebugInfo && NeedFullDebug)
4006 DebugInfoKind = CodeGenOptions::FullDebugInfo;
4007 RenderDebugEnablingArgs(Args, CmdArgs, DebugInfoKind, DwarfVersion);
4008
Eric Christopher138c32b2013-09-13 22:37:55 +00004009 // -ggnu-pubnames turns on gnu style pubnames in the backend.
4010 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
4011 CmdArgs.push_back("-backend-option");
4012 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
4013 }
Eric Christophereec89c22013-06-18 00:03:50 +00004014
Eric Christopher0d403d22014-02-14 01:27:03 +00004015 // -gdwarf-aranges turns on the emission of the aranges section in the
4016 // backend.
Filipe Cabecinhasc888e192015-10-14 12:25:43 +00004017 // Always enabled on the PS4.
4018 if (Args.hasArg(options::OPT_gdwarf_aranges) || IsPS4CPU) {
Eric Christopher0d403d22014-02-14 01:27:03 +00004019 CmdArgs.push_back("-backend-option");
4020 CmdArgs.push_back("-generate-arange-section");
4021 }
4022
David Blaikief36d9ba2014-01-27 18:52:43 +00004023 if (Args.hasFlag(options::OPT_fdebug_types_section,
4024 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00004025 CmdArgs.push_back("-backend-option");
4026 CmdArgs.push_back("-generate-type-units");
4027 }
Eric Christophereec89c22013-06-18 00:03:50 +00004028
Ed Schouten6e576152015-03-26 17:50:28 +00004029 // CloudABI uses -ffunction-sections and -fdata-sections by default.
4030 bool UseSeparateSections = Triple.getOS() == llvm::Triple::CloudABI;
4031
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004032 if (Args.hasFlag(options::OPT_ffunction_sections,
Ed Schouten6e576152015-03-26 17:50:28 +00004033 options::OPT_fno_function_sections, UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004034 CmdArgs.push_back("-ffunction-sections");
4035 }
4036
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004037 if (Args.hasFlag(options::OPT_fdata_sections, options::OPT_fno_data_sections,
4038 UseSeparateSections)) {
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00004039 CmdArgs.push_back("-fdata-sections");
4040 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00004041
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004042 if (!Args.hasFlag(options::OPT_funique_section_names,
Rafael Espindolab8a12932015-05-22 20:44:03 +00004043 options::OPT_fno_unique_section_names, true))
Rafael Espindola6b07a1c2015-02-20 18:08:57 +00004044 CmdArgs.push_back("-fno-unique-section-names");
4045
Chris Lattner3c77a352010-06-22 00:03:40 +00004046 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
4047
Diego Novilloa0545962015-07-10 18:00:07 +00004048 addPGOAndCoverageFlags(C, D, Output, Args, CmdArgs);
Nick Lewycky480cb992011-05-04 20:46:58 +00004049
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004050 // Pass options for controlling the default header search paths.
4051 if (Args.hasArg(options::OPT_nostdinc)) {
4052 CmdArgs.push_back("-nostdsysteminc");
4053 CmdArgs.push_back("-nobuiltininc");
4054 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00004055 if (Args.hasArg(options::OPT_nostdlibinc))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004056 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00004057 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
4058 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
4059 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004060
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004061 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00004062 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00004063 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00004064
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00004065 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
4066
Ted Kremenekf7639e12012-03-06 20:06:33 +00004067 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00004068 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004069 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004070 options::OPT_ccc_arcmt_modify,
4071 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004072 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00004073 switch (A->getOption().getID()) {
4074 default:
4075 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004076 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00004077 CmdArgs.push_back("-arcmt-check");
4078 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00004079 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00004080 CmdArgs.push_back("-arcmt-modify");
4081 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004082 case options::OPT_ccc_arcmt_migrate:
4083 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004084 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004085 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00004086
4087 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
4088 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00004089 break;
John McCalld70fb982011-06-15 23:25:17 +00004090 }
4091 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00004092 } else {
4093 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
4094 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
4095 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00004096 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004097
Ted Kremenekf7639e12012-03-06 20:06:33 +00004098 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
4099 if (ARCMTEnabled) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004100 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4101 << "-ccc-arcmt-migrate";
Ted Kremenekf7639e12012-03-06 20:06:33 +00004102 }
4103 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00004104 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00004105
4106 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004107 options::OPT_objcmt_migrate_subscripting,
4108 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00004109 // None specified, means enable them all.
4110 CmdArgs.push_back("-objcmt-migrate-literals");
4111 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004112 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00004113 } else {
4114 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4115 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00004116 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004117 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004118 } else {
4119 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
4120 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
4121 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
4122 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
4123 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
4124 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
Fariborz Jahanian773fa2c2015-03-03 17:15:38 +00004125 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property_dot_syntax);
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00004126 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
4127 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
4128 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
4129 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
4130 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
4131 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
4132 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00004133 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00004134 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00004135 }
4136
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004137 // Add preprocessing options like -I, -D, etc. if we are using the
4138 // preprocessor.
4139 //
4140 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004141 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Artem Belevichfa11ab52015-11-17 22:28:46 +00004142 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs,
4143 AuxToolChain);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004144
Rafael Espindolaa7431922011-07-21 23:40:37 +00004145 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
4146 // that "The compiler can only warn and ignore the option if not recognized".
4147 // When building with ccache, it will pass -D options to clang even on
4148 // preprocessed inputs and configure concludes that -fPIC is not supported.
4149 Args.ClaimAllArgs(options::OPT_D);
4150
Alp Toker7874bdc2013-11-15 20:40:58 +00004151 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00004152 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
4153 if (A->getOption().matches(options::OPT_O4)) {
4154 CmdArgs.push_back("-O3");
4155 D.Diag(diag::warn_O4_is_O3);
4156 } else {
4157 A->render(Args, CmdArgs);
4158 }
4159 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004160
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004161 // Warn about ignored options to clang.
Sean Silva14facf32015-06-09 01:57:17 +00004162 for (const Arg *A :
4163 Args.filtered(options::OPT_clang_ignored_gcc_optimization_f_Group)) {
4164 D.Diag(diag::warn_ignored_gcc_optimization) << A->getAsString(Args);
Douglas Katzman8b50e012015-08-05 18:03:47 +00004165 A->claim();
Sylvestre Ledru2fe501e2014-07-11 11:43:57 +00004166 }
4167
Rafael Espindola577637a2015-01-03 00:06:04 +00004168 claimNoWarnArgs(Args);
Chad Rosier86b82082012-12-12 20:06:31 +00004169
Richard Smith3be1cb22014-08-07 00:24:21 +00004170 Args.AddAllArgs(CmdArgs, options::OPT_R_Group);
Daniel Dunbar945577c2009-10-29 02:24:45 +00004171 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00004172 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
4173 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00004174 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004175 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004176
4177 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00004178 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004179 //
4180 // If a std is supplied, only add -trigraphs if it follows the
4181 // option.
David Majnemer8db91762015-05-18 04:49:30 +00004182 bool ImplyVCPPCXXVer = false;
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004183 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
4184 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00004185 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004186 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00004187 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004188 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004189 else
4190 Std->render(Args, CmdArgs);
4191
Nico Weber00721502014-12-23 22:32:37 +00004192 // If -f(no-)trigraphs appears after the language standard flag, honor it.
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004193 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
Nico Weber00721502014-12-23 22:32:37 +00004194 options::OPT_ftrigraphs,
4195 options::OPT_fno_trigraphs))
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00004196 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00004197 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004198 } else {
4199 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00004200 //
4201 // FIXME: Clang doesn't correctly handle -std= when the input language
4202 // doesn't match. For the time being just ignore this for C++ inputs;
4203 // eventually we want to do all the standard defaulting here instead of
4204 // splitting it between the driver and clang -cc1.
4205 if (!types::isCXX(InputType))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004206 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ, "-std=",
4207 /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004208 else if (IsWindowsMSVC)
David Majnemer8db91762015-05-18 04:49:30 +00004209 ImplyVCPPCXXVer = true;
Nico Weber723b4f02012-08-30 02:08:31 +00004210
Nico Weber00721502014-12-23 22:32:37 +00004211 Args.AddLastArg(CmdArgs, options::OPT_ftrigraphs,
4212 options::OPT_fno_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00004213 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004214
Richard Smith282b4492013-09-04 22:50:31 +00004215 // GCC's behavior for -Wwrite-strings is a bit strange:
4216 // * In C, this "warning flag" changes the types of string literals from
4217 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
4218 // for the discarded qualifier.
4219 // * In C++, this is just a normal warning flag.
4220 //
4221 // Implementing this warning correctly in C is hard, so we follow GCC's
4222 // behavior for now. FIXME: Directly diagnose uses of a string literal as
4223 // a non-const char* in C, rather than using this crude hack.
4224 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00004225 // FIXME: This should behave just like a warning flag, and thus should also
4226 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
4227 Arg *WriteStrings =
4228 Args.getLastArg(options::OPT_Wwrite_strings,
4229 options::OPT_Wno_write_strings, options::OPT_w);
4230 if (WriteStrings &&
4231 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00004232 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00004233 }
4234
Chandler Carruth61fbf622011-04-23 09:27:53 +00004235 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00004236 // during C++ compilation, which it is by default. GCC keeps this define even
4237 // in the presence of '-w', match this behavior bug-for-bug.
4238 if (types::isCXX(InputType) &&
4239 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
4240 true)) {
4241 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00004242 }
4243
Chandler Carruthe0391482010-05-22 02:21:53 +00004244 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
4245 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
4246 if (Asm->getOption().matches(options::OPT_fasm))
4247 CmdArgs.push_back("-fgnu-keywords");
4248 else
4249 CmdArgs.push_back("-fno-gnu-keywords");
4250 }
4251
Nick Lewycky1d617ac2011-10-17 23:05:52 +00004252 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
4253 CmdArgs.push_back("-fno-dwarf-directory-asm");
4254
Daniel Dunbare246fbe2013-04-16 18:21:19 +00004255 if (ShouldDisableAutolink(Args, getToolChain()))
4256 CmdArgs.push_back("-fno-autolink");
4257
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004258 // Add in -fdebug-compilation-dir if necessary.
4259 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00004260
Saleem Abdulrasool436256a2015-10-12 20:21:08 +00004261 for (const Arg *A : Args.filtered(options::OPT_fdebug_prefix_map_EQ)) {
4262 StringRef Map = A->getValue();
4263 if (Map.find('=') == StringRef::npos)
4264 D.Diag(diag::err_drv_invalid_argument_to_fdebug_prefix_map) << Map;
4265 else
4266 CmdArgs.push_back(Args.MakeArgString("-fdebug-prefix-map=" + Map));
4267 A->claim();
4268 }
4269
Richard Smith9a568822011-11-21 19:36:32 +00004270 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
4271 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004272 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004273 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004274 }
4275
Richard Smith79c927b2013-11-06 19:31:51 +00004276 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
4277 CmdArgs.push_back("-foperator-arrow-depth");
4278 CmdArgs.push_back(A->getValue());
4279 }
4280
Richard Smith9a568822011-11-21 19:36:32 +00004281 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
4282 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00004283 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00004284 }
4285
Richard Smitha3d3bd22013-05-08 02:12:03 +00004286 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
4287 CmdArgs.push_back("-fconstexpr-steps");
4288 CmdArgs.push_back(A->getValue());
4289 }
4290
Richard Smithb3a14522013-02-22 01:59:51 +00004291 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
4292 CmdArgs.push_back("-fbracket-depth");
4293 CmdArgs.push_back(A->getValue());
4294 }
4295
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00004296 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
4297 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004298 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004299 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00004300 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
4301 } else
4302 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00004303 }
4304
Michael J. Spencer929fccd2012-10-22 22:13:48 +00004305 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00004306 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00004307
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004308 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
4309 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00004310 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00004311 }
David Chisnall5778fce2009-08-31 16:41:57 +00004312
Chris Lattnere23003d2010-01-09 21:54:33 +00004313 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
4314 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00004315 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00004316 }
4317
Chris Lattnerb35583d2010-04-07 20:49:23 +00004318 CmdArgs.push_back("-ferror-limit");
4319 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00004320 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00004321 else
4322 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00004323
Chandler Carrutha77a7272010-05-06 04:55:18 +00004324 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
4325 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004326 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004327 }
4328
4329 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
4330 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004331 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00004332 }
4333
Richard Smithf6f003a2011-12-16 19:06:07 +00004334 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
4335 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00004336 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00004337 }
4338
Nick Lewycky24653262014-12-16 21:39:02 +00004339 if (Arg *A = Args.getLastArg(options::OPT_fspell_checking_limit_EQ)) {
4340 CmdArgs.push_back("-fspell-checking-limit");
4341 CmdArgs.push_back(A->getValue());
4342 }
4343
Daniel Dunbar2c978472009-11-04 06:24:47 +00004344 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00004345 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00004346 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004347 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00004348 } else {
4349 // If -fmessage-length=N was not specified, determine whether this is a
4350 // terminal and, if so, implicitly define -fmessage-length appropriately.
4351 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004352 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00004353 }
4354
John McCallb4a99d32013-02-19 01:57:35 +00004355 // -fvisibility= and -fvisibility-ms-compat are of a piece.
4356 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
4357 options::OPT_fvisibility_ms_compat)) {
4358 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
4359 CmdArgs.push_back("-fvisibility");
4360 CmdArgs.push_back(A->getValue());
4361 } else {
4362 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
4363 CmdArgs.push_back("-fvisibility");
4364 CmdArgs.push_back("hidden");
4365 CmdArgs.push_back("-ftype-visibility");
4366 CmdArgs.push_back("default");
4367 }
Daniel Dunbare357d562009-12-03 18:42:11 +00004368 }
4369
Douglas Gregor08329632010-06-15 17:05:35 +00004370 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004371
Hans Wennborgf60f6af2012-06-28 08:01:44 +00004372 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
4373
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004374 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00004375 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
4376 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00004377 CmdArgs.push_back("-ffreestanding");
4378
Daniel Dunbare357d562009-12-03 18:42:11 +00004379 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004380 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004381 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Eric Christopher86050822011-10-25 07:13:06 +00004382 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004383 // Emulated TLS is enabled by default on Android, and can be enabled manually
4384 // with -femulated-tls.
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00004385 bool EmulatedTLSDefault = Triple.isAndroid();
Chih-Hung Hsieh2c656c92015-07-28 16:27:56 +00004386 if (Args.hasFlag(options::OPT_femulated_tls, options::OPT_fno_emulated_tls,
4387 EmulatedTLSDefault))
4388 CmdArgs.push_back("-femulated-tls");
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004389 // AltiVec-like language extensions aren't relevant for assembling.
4390 if (!isa<PreprocessJobAction>(JA) || Output.getType() != types::TY_PP_Asm) {
Bill Schmidtb3b804e2013-07-03 15:36:02 +00004391 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004392 Args.AddLastArg(CmdArgs, options::OPT_fzvector);
4393 }
Richard Trieu91844232012-06-26 18:18:47 +00004394 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
4395 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00004396
Alexey Bataevdb390212015-05-20 04:24:19 +00004397 // Forward flags for OpenMP
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004398 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
4399 options::OPT_fno_openmp, false))
4400 switch (getOpenMPRuntime(getToolChain(), Args)) {
4401 case OMPRT_OMP:
4402 case OMPRT_IOMP5:
4403 // Clang can generate useful OpenMP code for these two runtime libraries.
4404 CmdArgs.push_back("-fopenmp");
Samuel Antaof8b50122015-07-13 22:54:53 +00004405
4406 // If no option regarding the use of TLS in OpenMP codegeneration is
4407 // given, decide a default based on the target. Otherwise rely on the
4408 // options and pass the right information to the frontend.
4409 if (!Args.hasFlag(options::OPT_fopenmp_use_tls,
Alexey Bataev6a43c002015-09-10 12:06:58 +00004410 options::OPT_fnoopenmp_use_tls, /*Default=*/true))
Samuel Antaof8b50122015-07-13 22:54:53 +00004411 CmdArgs.push_back("-fnoopenmp-use-tls");
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00004412 break;
4413 default:
4414 // By default, if Clang doesn't know how to generate useful OpenMP code
4415 // for a specific runtime library, we just don't pass the '-fopenmp' flag
4416 // down to the actual compilation.
4417 // FIXME: It would be better to have a mode which *only* omits IR
4418 // generation based on the OpenMP support so that we get consistent
4419 // semantic analysis, etc.
4420 break;
4421 }
Alexey Bataevdb390212015-05-20 04:24:19 +00004422
Peter Collingbourne32701642013-11-01 18:16:25 +00004423 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
Peter Collingbourne581f4382015-07-02 01:48:12 +00004424 Sanitize.addArgs(getToolChain(), Args, CmdArgs, InputType);
Richard Smith52be6192012-11-05 22:04:41 +00004425
Eric Christopher459d2712013-02-19 06:16:53 +00004426 // Report an error for -faltivec on anything other than PowerPC.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004427 if (const Arg *A = Args.getLastArg(options::OPT_faltivec)) {
4428 const llvm::Triple::ArchType Arch = getToolChain().getArch();
4429 if (!(Arch == llvm::Triple::ppc || Arch == llvm::Triple::ppc64 ||
4430 Arch == llvm::Triple::ppc64le))
4431 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
4432 << "ppc/ppc64/ppc64le";
4433 }
Chad Rosier864dfe12012-03-13 23:45:51 +00004434
Ulrich Weigand3c5038a2015-07-30 14:08:36 +00004435 // -fzvector is incompatible with -faltivec.
4436 if (Arg *A = Args.getLastArg(options::OPT_fzvector))
4437 if (Args.hasArg(options::OPT_faltivec))
4438 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
4439 << "-faltivec";
4440
Daniel Dunbar733b0f82011-03-01 18:49:30 +00004441 if (getToolChain().SupportsProfiling())
4442 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00004443
4444 // -flax-vector-conversions is default.
4445 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
4446 options::OPT_fno_lax_vector_conversions))
4447 CmdArgs.push_back("-fno-lax-vector-conversions");
4448
John Brawna7b4ec02015-08-10 11:11:28 +00004449 if (Args.getLastArg(options::OPT_fapple_kext) ||
4450 (Args.hasArg(options::OPT_mkernel) && types::isCXX(InputType)))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00004451 CmdArgs.push_back("-fapple-kext");
4452
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00004453 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00004454 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00004455 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004456 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
4457 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00004458
4459 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
4460 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00004461 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00004462 }
4463
Bob Wilson14adb362012-02-03 06:27:22 +00004464 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00004465
Chandler Carruth6e501032011-03-27 00:04:55 +00004466 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
4467 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004468 if (Arg *A = Args.getLastArg(options::OPT_fwrapv, options::OPT_fno_wrapv)) {
Chandler Carruth6e501032011-03-27 00:04:55 +00004469 if (A->getOption().matches(options::OPT_fwrapv))
4470 CmdArgs.push_back("-fwrapv");
4471 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
4472 options::OPT_fno_strict_overflow)) {
4473 if (A->getOption().matches(options::OPT_fno_strict_overflow))
4474 CmdArgs.push_back("-fwrapv");
4475 }
Hal Finkelce0697f2013-11-17 16:03:29 +00004476
4477 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
4478 options::OPT_fno_reroll_loops))
4479 if (A->getOption().matches(options::OPT_freroll_loops))
4480 CmdArgs.push_back("-freroll-loops");
4481
Daniel Dunbar3a148f22009-04-07 21:51:40 +00004482 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00004483 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
4484 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004485
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00004486 Args.AddLastArg(CmdArgs, options::OPT_pthread);
4487
Daniel Dunbar4930e332009-11-17 08:07:36 +00004488 // -stack-protector=0 is default.
4489 unsigned StackProtectorLevel = 0;
Peter Collingbournec4122c12015-06-15 21:08:13 +00004490 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
4491 Args.ClaimAllArgs(options::OPT_fno_stack_protector);
4492 Args.ClaimAllArgs(options::OPT_fstack_protector_all);
4493 Args.ClaimAllArgs(options::OPT_fstack_protector_strong);
4494 Args.ClaimAllArgs(options::OPT_fstack_protector);
4495 } else if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004496 options::OPT_fstack_protector_all,
4497 options::OPT_fstack_protector_strong,
4498 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00004499 if (A->getOption().matches(options::OPT_fstack_protector)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004500 StackProtectorLevel = std::max<unsigned>(
4501 LangOptions::SSPOn,
4502 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
Rafael Espindolace5c6092014-05-22 22:57:39 +00004503 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004504 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00004505 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00004506 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00004507 } else {
4508 StackProtectorLevel =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004509 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
Nico Weberdd473632011-08-23 07:38:27 +00004510 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00004511 if (StackProtectorLevel) {
4512 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004513 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004514 }
Chad Rosierdb3da832012-08-21 16:16:06 +00004515
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004516 // --param ssp-buffer-size=
Sean Silva14facf32015-06-09 01:57:17 +00004517 for (const Arg *A : Args.filtered(options::OPT__param)) {
4518 StringRef Str(A->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00004519 if (Str.startswith("ssp-buffer-size=")) {
4520 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00004521 CmdArgs.push_back("-stack-protector-buffer-size");
4522 // FIXME: Verify the argument is a valid integer.
4523 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00004524 }
Sean Silva14facf32015-06-09 01:57:17 +00004525 A->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00004526 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00004527 }
4528
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004529 // Translate -mstackrealign
4530 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
Akira Hatanakaaecca042015-09-11 18:55:09 +00004531 false))
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004532 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00004533
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00004534 if (Args.hasArg(options::OPT_mstack_alignment)) {
4535 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
4536 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00004537 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00004538
Hans Wennborg77dc2362015-01-20 19:45:50 +00004539 if (Args.hasArg(options::OPT_mstack_probe_size)) {
4540 StringRef Size = Args.getLastArgValue(options::OPT_mstack_probe_size);
4541
4542 if (!Size.empty())
4543 CmdArgs.push_back(Args.MakeArgString("-mstack-probe-size=" + Size));
4544 else
4545 CmdArgs.push_back("-mstack-probe-size=0");
4546 }
4547
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004548 switch (getToolChain().getArch()) {
4549 case llvm::Triple::aarch64:
4550 case llvm::Triple::aarch64_be:
4551 case llvm::Triple::arm:
4552 case llvm::Triple::armeb:
4553 case llvm::Triple::thumb:
4554 case llvm::Triple::thumbeb:
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004555 CmdArgs.push_back("-fallow-half-arguments-and-returns");
Oliver Stannarddc2854c2015-09-03 12:40:58 +00004556 break;
4557
4558 default:
4559 break;
4560 }
Oliver Stannarded8ecc82014-08-27 16:31:57 +00004561
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004562 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
4563 options::OPT_mno_restrict_it)) {
4564 if (A->getOption().matches(options::OPT_mrestrict_it)) {
4565 CmdArgs.push_back("-backend-option");
4566 CmdArgs.push_back("-arm-restrict-it");
4567 } else {
4568 CmdArgs.push_back("-backend-option");
4569 CmdArgs.push_back("-arm-no-restrict-it");
4570 }
James Y Knight2db38f32015-08-15 03:45:25 +00004571 } else if (Triple.isOSWindows() &&
4572 (Triple.getArch() == llvm::Triple::arm ||
4573 Triple.getArch() == llvm::Triple::thumb)) {
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00004574 // Windows on ARM expects restricted IT blocks
4575 CmdArgs.push_back("-backend-option");
4576 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00004577 }
4578
Daniel Dunbard18049a2009-04-07 21:16:11 +00004579 // Forward -f options with positive and negative forms; we translate
4580 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00004581 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
4582 StringRef fname = A->getValue();
4583 if (!llvm::sys::fs::exists(fname))
4584 D.Diag(diag::err_drv_no_such_file) << fname;
4585 else
4586 A->render(Args, CmdArgs);
4587 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004588
John Brawna7b4ec02015-08-10 11:11:28 +00004589 // -fbuiltin is default unless -mkernel is used
4590 if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin,
4591 !Args.hasArg(options::OPT_mkernel)))
Daniel Dunbar484afa22009-11-19 04:55:23 +00004592 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00004593
Nuno Lopes13c88c72009-12-16 16:59:22 +00004594 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4595 options::OPT_fno_assume_sane_operator_new))
4596 CmdArgs.push_back("-fno-assume-sane-operator-new");
4597
Daniel Dunbar4930e332009-11-17 08:07:36 +00004598 // -fblocks=0 is default.
4599 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00004600 getToolChain().IsBlocksDefault()) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004601 (Args.hasArg(options::OPT_fgnu_runtime) &&
4602 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
4603 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00004604 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00004605
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004606 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
John McCall7959fee2011-09-09 20:41:01 +00004607 !getToolChain().hasBlocksRuntime())
4608 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00004609 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00004610
Richard Smith47972af2015-06-16 00:08:24 +00004611 // -fmodules enables the use of precompiled modules (off by default).
Richard Smithffb65082014-09-30 23:10:19 +00004612 // Users can pass -fno-cxx-modules to turn off modules support for
Richard Smith47972af2015-06-16 00:08:24 +00004613 // C++/Objective-C++ programs.
Douglas Gregorc60437f2013-01-16 01:23:41 +00004614 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00004615 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004616 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
4617 options::OPT_fno_cxx_modules, true);
Douglas Gregorc60437f2013-01-16 01:23:41 +00004618 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00004619 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00004620 HaveModules = true;
4621 }
4622 }
4623
Richard Smith47972af2015-06-16 00:08:24 +00004624 // -fmodule-maps enables implicit reading of module map files. By default,
4625 // this is enabled if we are using precompiled modules.
Richard Smithcf18b792015-06-16 00:20:23 +00004626 if (Args.hasFlag(options::OPT_fimplicit_module_maps,
4627 options::OPT_fno_implicit_module_maps, HaveModules)) {
Richard Smith47972af2015-06-16 00:08:24 +00004628 CmdArgs.push_back("-fimplicit-module-maps");
Daniel Jasper07e6c402013-08-05 20:26:17 +00004629 }
4630
Daniel Jasperac42b752013-10-21 06:34:34 +00004631 // -fmodules-decluse checks that modules used are declared so (off by
4632 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004633 if (Args.hasFlag(options::OPT_fmodules_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004634 options::OPT_fno_modules_decluse, false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00004635 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00004636 }
4637
Daniel Jasper962b38e2014-04-11 11:47:45 +00004638 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
4639 // all #included headers are part of modules.
4640 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004641 options::OPT_fno_modules_strict_decluse, false)) {
Daniel Jasper962b38e2014-04-11 11:47:45 +00004642 CmdArgs.push_back("-fmodules-strict-decluse");
4643 }
4644
Manuel Klimekd2e8b042015-02-20 11:44:41 +00004645 // -fno-implicit-modules turns off implicitly compiling modules on demand.
4646 if (!Args.hasFlag(options::OPT_fimplicit_modules,
4647 options::OPT_fno_implicit_modules)) {
4648 CmdArgs.push_back("-fno-implicit-modules");
4649 }
4650
Daniel Jasperac42b752013-10-21 06:34:34 +00004651 // -fmodule-name specifies the module that is currently being built (or
4652 // used for header checking by -fmodule-maps).
Richard Smith9887d792014-10-17 01:42:53 +00004653 Args.AddLastArg(CmdArgs, options::OPT_fmodule_name);
Daniel Jasperac42b752013-10-21 06:34:34 +00004654
Richard Smith9887d792014-10-17 01:42:53 +00004655 // -fmodule-map-file can be used to specify files containing module
Daniel Jasperac42b752013-10-21 06:34:34 +00004656 // definitions.
Richard Smith9887d792014-10-17 01:42:53 +00004657 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_map_file);
Daniel Jasperac42b752013-10-21 06:34:34 +00004658
Richard Smithe842a472014-10-22 02:05:46 +00004659 // -fmodule-file can be used to specify files containing precompiled modules.
Richard Smith7acebe42015-09-11 03:58:07 +00004660 if (HaveModules)
4661 Args.AddAllArgs(CmdArgs, options::OPT_fmodule_file);
4662 else
4663 Args.ClaimAllArgs(options::OPT_fmodule_file);
Richard Smithe842a472014-10-22 02:05:46 +00004664
4665 // -fmodule-cache-path specifies where our implicitly-built module files
4666 // should be written.
Diego Novilloa0545962015-07-10 18:00:07 +00004667 SmallString<128> Path;
Justin Bognera88f0122014-06-20 22:59:50 +00004668 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
Daniel Jasper7450f912015-07-10 08:25:54 +00004669 Path = A->getValue();
Justin Bognera88f0122014-06-20 22:59:50 +00004670 if (HaveModules) {
4671 if (C.isForDiagnostics()) {
4672 // When generating crash reports, we want to emit the modules along with
4673 // the reproduction sources, so we ignore any provided module path.
Daniel Jasper7450f912015-07-10 08:25:54 +00004674 Path = Output.getFilename();
4675 llvm::sys::path::replace_extension(Path, ".cache");
4676 llvm::sys::path::append(Path, "modules");
4677 } else if (Path.empty()) {
Justin Bognera88f0122014-06-20 22:59:50 +00004678 // No module path was provided: use the default.
Renato Golin7c542b42015-07-27 23:44:45 +00004679 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false, Path);
Daniel Jasper7450f912015-07-10 08:25:54 +00004680 llvm::sys::path::append(Path, "org.llvm.clang.");
4681 appendUserToPath(Path);
4682 llvm::sys::path::append(Path, "ModuleCache");
Justin Bognera88f0122014-06-20 22:59:50 +00004683 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00004684 const char Arg[] = "-fmodules-cache-path=";
Daniel Jasper7450f912015-07-10 08:25:54 +00004685 Path.insert(Path.begin(), Arg, Arg + strlen(Arg));
4686 CmdArgs.push_back(Args.MakeArgString(Path));
Justin Bognera88f0122014-06-20 22:59:50 +00004687 }
4688
4689 // When building modules and generating crashdumps, we need to dump a module
4690 // dependency VFS alongside the output.
4691 if (HaveModules && C.isForDiagnostics()) {
4692 SmallString<128> VFSDir(Output.getFilename());
4693 llvm::sys::path::replace_extension(VFSDir, ".cache");
Justin Bogner659ecc32014-10-20 22:47:23 +00004694 // Add the cache directory as a temp so the crash diagnostics pick it up.
4695 C.addTempFile(Args.MakeArgString(VFSDir));
4696
Justin Bognera88f0122014-06-20 22:59:50 +00004697 llvm::sys::path::append(VFSDir, "vfs");
4698 CmdArgs.push_back("-module-dependency-dir");
4699 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00004700 }
4701
Richard Smith9887d792014-10-17 01:42:53 +00004702 if (HaveModules)
4703 Args.AddLastArg(CmdArgs, options::OPT_fmodules_user_build_path);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00004704
Douglas Gregor35b04d62013-02-07 19:01:24 +00004705 // Pass through all -fmodules-ignore-macro arguments.
4706 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00004707 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
4708 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00004709
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004710 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
4711
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004712 if (Arg *A = Args.getLastArg(options::OPT_fbuild_session_file)) {
4713 if (Args.hasArg(options::OPT_fbuild_session_timestamp))
4714 D.Diag(diag::err_drv_argument_not_allowed_with)
4715 << A->getAsString(Args) << "-fbuild-session-timestamp";
4716
4717 llvm::sys::fs::file_status Status;
4718 if (llvm::sys::fs::status(A->getValue(), Status))
4719 D.Diag(diag::err_drv_no_such_file) << A->getValue();
Benjamin Kramer320fc262015-02-14 18:19:55 +00004720 CmdArgs.push_back(Args.MakeArgString(
4721 "-fbuild-session-timestamp=" +
4722 Twine((uint64_t)Status.getLastModificationTime().toEpochTime())));
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004723 }
4724
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004725 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
Ben Langmuir19e6acb2014-08-01 22:12:21 +00004726 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp,
4727 options::OPT_fbuild_session_file))
Dmitri Gribenkof430da42014-02-12 10:33:14 +00004728 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
4729
4730 Args.AddLastArg(CmdArgs,
4731 options::OPT_fmodules_validate_once_per_build_session);
4732 }
4733
Ben Langmuirdcf73862014-03-12 00:06:17 +00004734 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
4735
John McCalldfea9982010-04-09 19:12:06 +00004736 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00004737 if (Args.hasFlag(options::OPT_fno_access_control,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004738 options::OPT_faccess_control, false))
John McCall3155f572010-04-09 19:03:51 +00004739 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00004740
Anders Carlssond470fef2010-11-21 00:09:52 +00004741 // -felide-constructors is the default.
4742 if (Args.hasFlag(options::OPT_fno_elide_constructors,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004743 options::OPT_felide_constructors, false))
Anders Carlssond470fef2010-11-21 00:09:52 +00004744 CmdArgs.push_back("-fno-elide-constructors");
4745
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004746 ToolChain::RTTIMode RTTIMode = getToolChain().getRTTIMode();
Filipe Cabecinhas28f353c2015-01-29 23:56:43 +00004747
Filipe Cabecinhasc4732552015-03-20 23:51:15 +00004748 if (KernelOrKext || (types::isCXX(InputType) &&
4749 (RTTIMode == ToolChain::RM_DisabledExplicitly ||
4750 RTTIMode == ToolChain::RM_DisabledImplicitly)))
Filipe Cabecinhasec5d0e62015-02-19 01:04:49 +00004751 CmdArgs.push_back("-fno-rtti");
Richard Smith52be6192012-11-05 22:04:41 +00004752
Tony Linthicum76329bf2011-12-12 21:14:55 +00004753 // -fshort-enums=0 is default for all architectures except Hexagon.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004754 if (Args.hasFlag(options::OPT_fshort_enums, options::OPT_fno_short_enums,
4755 getToolChain().getArch() == llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00004756 CmdArgs.push_back("-fshort-enums");
4757
Daniel Dunbard609b7b2009-11-17 06:37:03 +00004758 // -fsigned-char is default.
David Majnemerc3658d22015-05-23 18:48:37 +00004759 if (Arg *A = Args.getLastArg(
4760 options::OPT_fsigned_char, options::OPT_fno_signed_char,
4761 options::OPT_funsigned_char, options::OPT_fno_unsigned_char)) {
4762 if (A->getOption().matches(options::OPT_funsigned_char) ||
4763 A->getOption().matches(options::OPT_fno_signed_char)) {
4764 CmdArgs.push_back("-fno-signed-char");
4765 }
4766 } else if (!isSignedCharDefault(getToolChain().getTriple())) {
Daniel Dunbar5fe08662009-11-29 02:39:08 +00004767 CmdArgs.push_back("-fno-signed-char");
David Majnemerc3658d22015-05-23 18:48:37 +00004768 }
Eli Friedman327f0b52009-06-05 07:21:14 +00004769
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004770 // -fuse-cxa-atexit is default.
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00004771 if (!Args.hasFlag(
4772 options::OPT_fuse_cxa_atexit, options::OPT_fno_use_cxa_atexit,
4773 !IsWindowsCygnus && !IsWindowsGNU &&
4774 getToolChain().getTriple().getOS() != llvm::Triple::Solaris &&
4775 getToolChain().getArch() != llvm::Triple::hexagon &&
4776 getToolChain().getArch() != llvm::Triple::xcore &&
4777 ((getToolChain().getTriple().getVendor() !=
4778 llvm::Triple::MipsTechnologies) ||
4779 getToolChain().getTriple().hasEnvironment())) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00004780 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00004781 CmdArgs.push_back("-fno-use-cxa-atexit");
4782
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004783 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00004784 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004785 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00004786 CmdArgs.push_back("-fms-extensions");
4787
Reid Kleckner1df0fea2015-02-26 00:17:25 +00004788 // -fno-use-line-directives is default.
4789 if (Args.hasFlag(options::OPT_fuse_line_directives,
4790 options::OPT_fno_use_line_directives, false))
4791 CmdArgs.push_back("-fuse-line-directives");
4792
Francois Pichet1b4f1632011-09-17 04:32:15 +00004793 // -fms-compatibility=0 is default.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004794 if (Args.hasFlag(options::OPT_fms_compatibility,
Douglas Gregor2b4907e2011-10-24 15:49:38 +00004795 options::OPT_fno_ms_compatibility,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004796 (IsWindowsMSVC &&
4797 Args.hasFlag(options::OPT_fms_extensions,
4798 options::OPT_fno_ms_extensions, true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00004799 CmdArgs.push_back("-fms-compatibility");
4800
David Majnemerc371ff02015-03-22 08:39:22 +00004801 // -fms-compatibility-version=18.00 is default.
David Majnemere11d3732015-06-08 00:22:46 +00004802 VersionTuple MSVT = visualstudio::getMSVCVersion(
4803 &D, getToolChain().getTriple(), Args, IsWindowsMSVC);
4804 if (!MSVT.empty())
David Majnemerc371ff02015-03-22 08:39:22 +00004805 CmdArgs.push_back(
4806 Args.MakeArgString("-fms-compatibility-version=" + MSVT.getAsString()));
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00004807
David Majnemer8db91762015-05-18 04:49:30 +00004808 bool IsMSVC2015Compatible = MSVT.getMajor() >= 19;
4809 if (ImplyVCPPCXXVer) {
4810 if (IsMSVC2015Compatible)
4811 CmdArgs.push_back("-std=c++14");
4812 else
4813 CmdArgs.push_back("-std=c++11");
4814 }
4815
Eric Christopher5ecce122013-02-18 00:38:31 +00004816 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00004817 if (Args.hasFlag(options::OPT_fborland_extensions,
4818 options::OPT_fno_borland_extensions, false))
4819 CmdArgs.push_back("-fborland-extensions");
4820
Saleem Abdulrasoold170c4b2015-10-04 17:51:05 +00004821 // -fno-declspec is default, except for PS4.
4822 if (Args.hasFlag(options::OPT_fdeclspec, options::OPT_fno_declspec,
4823 getToolChain().getTriple().isPS4()))
4824 CmdArgs.push_back("-fdeclspec");
4825 else if (Args.hasArg(options::OPT_fno_declspec))
4826 CmdArgs.push_back("-fno-declspec"); // Explicitly disabling __declspec.
4827
David Majnemerc371ff02015-03-22 08:39:22 +00004828 // -fthreadsafe-static is default, except for MSVC compatibility versions less
4829 // than 19.
4830 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
4831 options::OPT_fno_threadsafe_statics,
David Majnemer8db91762015-05-18 04:49:30 +00004832 !IsWindowsMSVC || IsMSVC2015Compatible))
David Majnemerc371ff02015-03-22 08:39:22 +00004833 CmdArgs.push_back("-fno-threadsafe-statics");
4834
Francois Pichet02744872011-09-01 16:38:08 +00004835 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
4836 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00004837 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00004838 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00004839 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00004840
Chandler Carruthe03aa552010-04-17 20:17:31 +00004841 // -fgnu-keywords default varies depending on language; only pass if
4842 // specified.
4843 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00004844 options::OPT_fno_gnu_keywords))
4845 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00004846
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004847 if (Args.hasFlag(options::OPT_fgnu89_inline, options::OPT_fno_gnu89_inline,
Rafael Espindola922a6242011-06-02 17:30:53 +00004848 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00004849 CmdArgs.push_back("-fgnu89-inline");
4850
Chad Rosier9c76d242012-03-15 22:31:42 +00004851 if (Args.hasArg(options::OPT_fno_inline))
4852 CmdArgs.push_back("-fno-inline");
4853
Chad Rosier64d6be92012-03-06 21:17:19 +00004854 if (Args.hasArg(options::OPT_fno_inline_functions))
4855 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00004856
John McCall5fb5df92012-06-20 06:18:46 +00004857 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00004858
John McCall5fb5df92012-06-20 06:18:46 +00004859 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00004860 // legacy is the default. Except for deployment taget of 10.5,
4861 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
4862 // gets ignored silently.
4863 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00004864 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
4865 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00004866 objcRuntime.isLegacyDispatchDefaultForArch(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004867 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00004868 if (getToolChain().UseObjCMixedDispatch())
4869 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
4870 else
4871 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
4872 }
4873 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00004874
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004875 // When ObjectiveC legacy runtime is in effect on MacOSX,
4876 // turn on the option to do Array/Dictionary subscripting
4877 // by default.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00004878 if (getToolChain().getArch() == llvm::Triple::x86 &&
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00004879 getToolChain().getTriple().isMacOSX() &&
4880 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
4881 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00004882 objcRuntime.isNeXTFamily())
4883 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004884
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00004885 // -fencode-extended-block-signature=1 is default.
4886 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
4887 CmdArgs.push_back("-fencode-extended-block-signature");
4888 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004889
John McCall24fc0de2011-07-06 00:26:06 +00004890 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
4891 // NOTE: This logic is duplicated in ToolChains.cpp.
4892 bool ARC = isObjCAutoRefCount(Args);
4893 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00004894 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00004895
John McCall24fc0de2011-07-06 00:26:06 +00004896 CmdArgs.push_back("-fobjc-arc");
4897
Chandler Carruth491db322011-11-04 07:34:47 +00004898 // FIXME: It seems like this entire block, and several around it should be
4899 // wrapped in isObjC, but for now we just use it here as this is where it
4900 // was being used previously.
4901 if (types::isCXX(InputType) && types::isObjC(InputType)) {
4902 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
4903 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
4904 else
4905 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
4906 }
4907
John McCall24fc0de2011-07-06 00:26:06 +00004908 // Allow the user to enable full exceptions code emission.
4909 // We define off for Objective-CC, on for Objective-C++.
4910 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
4911 options::OPT_fno_objc_arc_exceptions,
4912 /*default*/ types::isCXX(InputType)))
4913 CmdArgs.push_back("-fobjc-arc-exceptions");
John McCall460ce582015-10-22 18:38:17 +00004914
John McCall24fc0de2011-07-06 00:26:06 +00004915 }
4916
4917 // -fobjc-infer-related-result-type is the default, except in the Objective-C
4918 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00004919 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00004920 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004921
John McCall24fc0de2011-07-06 00:26:06 +00004922 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
4923 // takes precedence.
4924 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
4925 if (!GCArg)
4926 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
4927 if (GCArg) {
4928 if (ARC) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004929 D.Diag(diag::err_drv_objc_gc_arr) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004930 } else if (getToolChain().SupportsObjCGC()) {
4931 GCArg->render(Args, CmdArgs);
4932 } else {
4933 // FIXME: We should move this to a hard error.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004934 D.Diag(diag::warn_drv_objc_gc_unsupported) << GCArg->getAsString(Args);
John McCall24fc0de2011-07-06 00:26:06 +00004935 }
4936 }
4937
John McCallfbe5ed72015-11-05 19:19:56 +00004938 // Pass down -fobjc-weak or -fno-objc-weak if present.
4939 if (types::isObjC(InputType)) {
4940 auto WeakArg = Args.getLastArg(options::OPT_fobjc_weak,
4941 options::OPT_fno_objc_weak);
4942 if (!WeakArg) {
4943 // nothing to do
4944 } else if (GCArg) {
4945 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4946 D.Diag(diag::err_objc_weak_with_gc);
4947 } else if (!objcRuntime.allowsWeak()) {
4948 if (WeakArg->getOption().matches(options::OPT_fobjc_weak))
4949 D.Diag(diag::err_objc_weak_unsupported);
4950 } else {
4951 WeakArg->render(Args, CmdArgs);
4952 }
4953 }
4954
Bob Wilsonb111ec92015-03-02 19:01:14 +00004955 if (Args.hasFlag(options::OPT_fapplication_extension,
4956 options::OPT_fno_application_extension, false))
4957 CmdArgs.push_back("-fapplication-extension");
4958
Reid Klecknerc542d372014-06-27 17:02:02 +00004959 // Handle GCC-style exception args.
4960 if (!C.getDriver().IsCLMode())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004961 addExceptionArgs(Args, InputType, getToolChain(), KernelOrKext, objcRuntime,
4962 CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00004963
Tim Northovere931f9f2015-10-30 16:30:41 +00004964 if (getToolChain().UseSjLjExceptions(Args))
John McCallb5f652e2011-06-22 00:53:57 +00004965 CmdArgs.push_back("-fsjlj-exceptions");
4966
4967 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00004968 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
4969 options::OPT_fno_assume_sane_operator_new))
4970 CmdArgs.push_back("-fno-assume-sane-operator-new");
4971
Reid Kleckner7ffc3fb2015-03-20 00:31:07 +00004972 // -fsized-deallocation is off by default, as it is an ABI-breaking change for
4973 // most platforms.
4974 if (Args.hasFlag(options::OPT_fsized_deallocation,
4975 options::OPT_fno_sized_deallocation, false))
4976 CmdArgs.push_back("-fsized-deallocation");
4977
Daniel Dunbar34d7a992010-04-27 15:34:57 +00004978 // -fconstant-cfstrings is default, and may be subject to argument translation
4979 // on Darwin.
4980 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
4981 options::OPT_fno_constant_cfstrings) ||
4982 !Args.hasFlag(options::OPT_mconstant_cfstrings,
4983 options::OPT_mno_constant_cfstrings))
4984 CmdArgs.push_back("-fno-constant-cfstrings");
4985
John Thompsoned4e2952009-11-05 20:14:16 +00004986 // -fshort-wchar default varies depending on platform; only
4987 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00004988 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
4989 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00004990 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00004991
Hans Wennborg28c96312013-07-31 23:39:13 +00004992 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004993 if (Args.hasFlag(options::OPT_fpascal_strings,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00004994 options::OPT_fno_pascal_strings, false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00004995 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00004996
Daniel Dunbar096ed292011-10-05 21:04:55 +00004997 // Honor -fpack-struct= and -fpack-struct, if given. Note that
4998 // -fno-pack-struct doesn't apply to -fpack-struct=.
4999 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00005000 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00005001 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00005002 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00005003 } else if (Args.hasFlag(options::OPT_fpack_struct,
5004 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00005005 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00005006 }
5007
Fariborz Jahanianbcd82af2014-08-05 18:37:48 +00005008 // Handle -fmax-type-align=N and -fno-type-align
5009 bool SkipMaxTypeAlign = Args.hasArg(options::OPT_fno_max_type_align);
5010 if (Arg *A = Args.getLastArg(options::OPT_fmax_type_align_EQ)) {
5011 if (!SkipMaxTypeAlign) {
5012 std::string MaxTypeAlignStr = "-fmax-type-align=";
5013 MaxTypeAlignStr += A->getValue();
5014 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5015 }
5016 } else if (getToolChain().getTriple().isOSDarwin()) {
5017 if (!SkipMaxTypeAlign) {
5018 std::string MaxTypeAlignStr = "-fmax-type-align=16";
5019 CmdArgs.push_back(Args.MakeArgString(MaxTypeAlignStr));
5020 }
5021 }
5022
John Brawna7b4ec02015-08-10 11:11:28 +00005023 // -fcommon is the default unless compiling kernel code or the target says so
5024 bool NoCommonDefault =
5025 KernelOrKext || isNoCommonDefault(getToolChain().getTriple());
5026 if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common,
5027 !NoCommonDefault))
Daniel Dunbard18049a2009-04-07 21:16:11 +00005028 CmdArgs.push_back("-fno-common");
5029
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005030 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00005031 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00005032 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005033 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005034 D.Diag(diag::warn_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005035 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
Daniel Dunbar2edd9232009-04-15 02:37:43 +00005036
Daniel Dunbar6358d682010-10-15 22:30:42 +00005037 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005038 if (!Args.hasFlag(options::OPT_ffor_scope, options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005039 D.Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005040 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
Daniel Dunbar6358d682010-10-15 22:30:42 +00005041
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005042 // -finput_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005043 if (Arg *inputCharset = Args.getLastArg(options::OPT_finput_charset_EQ)) {
5044 StringRef value = inputCharset->getValue();
5045 if (value != "UTF-8")
5046 D.Diag(diag::err_drv_invalid_value) << inputCharset->getAsString(Args)
5047 << value;
Sylvestre Ledru91f380a2014-07-01 17:24:27 +00005048 }
5049
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005050 // -fexec_charset=UTF-8 is default. Reject others
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005051 if (Arg *execCharset = Args.getLastArg(options::OPT_fexec_charset_EQ)) {
5052 StringRef value = execCharset->getValue();
5053 if (value != "UTF-8")
5054 D.Diag(diag::err_drv_invalid_value) << execCharset->getAsString(Args)
5055 << value;
Sylvestre Ledrub8198f0222014-08-11 18:09:03 +00005056 }
5057
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00005058 // -fcaret-diagnostics is default.
5059 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
5060 options::OPT_fno_caret_diagnostics, true))
5061 CmdArgs.push_back("-fno-caret-diagnostics");
5062
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005063 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00005064 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00005065 options::OPT_fno_diagnostics_fixit_info))
5066 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005067
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005068 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00005069 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005070 options::OPT_fno_diagnostics_show_option))
5071 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005072
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005073 if (const Arg *A =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005074 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005075 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00005076 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00005077 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005078
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005079 if (const Arg *A = Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
Douglas Gregor643c9222011-05-21 17:07:29 +00005080 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00005081 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00005082 }
5083
Chandler Carruthb6766f02011-03-27 01:50:55 +00005084 if (Arg *A = Args.getLastArg(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005085 options::OPT_fdiagnostics_show_note_include_stack,
5086 options::OPT_fno_diagnostics_show_note_include_stack)) {
Chandler Carruthb6766f02011-03-27 01:50:55 +00005087 if (A->getOption().matches(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005088 options::OPT_fdiagnostics_show_note_include_stack))
Chandler Carruthb6766f02011-03-27 01:50:55 +00005089 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
5090 else
5091 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
5092 }
5093
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005094 // Color diagnostics are the default, unless the terminal doesn't support
5095 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00005096 // Support both clang's -f[no-]color-diagnostics and gcc's
5097 // -f[no-]diagnostics-colors[=never|always|auto].
5098 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005099 for (const auto &Arg : Args) {
5100 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00005101 if (!O.matches(options::OPT_fcolor_diagnostics) &&
5102 !O.matches(options::OPT_fdiagnostics_color) &&
5103 !O.matches(options::OPT_fno_color_diagnostics) &&
5104 !O.matches(options::OPT_fno_diagnostics_color) &&
5105 !O.matches(options::OPT_fdiagnostics_color_EQ))
5106 continue;
5107
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005108 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00005109 if (O.matches(options::OPT_fcolor_diagnostics) ||
5110 O.matches(options::OPT_fdiagnostics_color)) {
5111 ShowColors = Colors_On;
5112 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
5113 O.matches(options::OPT_fno_diagnostics_color)) {
5114 ShowColors = Colors_Off;
5115 } else {
5116 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005117 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00005118 if (value == "always")
5119 ShowColors = Colors_On;
5120 else if (value == "never")
5121 ShowColors = Colors_Off;
5122 else if (value == "auto")
5123 ShowColors = Colors_Auto;
5124 else
5125 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005126 << ("-fdiagnostics-color=" + value).str();
Nico Weber7e2da792013-04-17 21:52:44 +00005127 }
5128 }
5129 if (ShowColors == Colors_On ||
5130 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00005131 CmdArgs.push_back("-fcolor-diagnostics");
5132
Nico Rieck7857d462013-09-11 00:38:02 +00005133 if (Args.hasArg(options::OPT_fansi_escape_codes))
5134 CmdArgs.push_back("-fansi-escape-codes");
5135
Daniel Dunbardb097022009-06-08 21:13:54 +00005136 if (!Args.hasFlag(options::OPT_fshow_source_location,
5137 options::OPT_fno_show_source_location))
5138 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00005139
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005140 if (!Args.hasFlag(options::OPT_fshow_column, options::OPT_fno_show_column,
Douglas Gregor643c9222011-05-21 17:07:29 +00005141 true))
5142 CmdArgs.push_back("-fno-show-column");
5143
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00005144 if (!Args.hasFlag(options::OPT_fspell_checking,
5145 options::OPT_fno_spell_checking))
5146 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005147
Chad Rosierc8e56e82012-12-05 21:08:21 +00005148 // -fno-asm-blocks is default.
5149 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
5150 false))
5151 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00005152
Steven Wucb0d13f2015-01-16 23:05:28 +00005153 // -fgnu-inline-asm is default.
5154 if (!Args.hasFlag(options::OPT_fgnu_inline_asm,
5155 options::OPT_fno_gnu_inline_asm, true))
5156 CmdArgs.push_back("-fno-gnu-inline-asm");
5157
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00005158 // Enable vectorization per default according to the optimization level
5159 // selected. For optimization levels that want vectorization we use the alias
5160 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005161 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005162 OptSpecifier VectorizeAliasOption =
5163 EnableVec ? options::OPT_O_Group : options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00005164 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00005165 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005166 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00005167
Chad Rosier136d67d2014-04-28 19:30:57 +00005168 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005169 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005170 OptSpecifier SLPVectAliasOption =
5171 EnableSLPVec ? options::OPT_O_Group : options::OPT_fslp_vectorize;
Chad Rosier136d67d2014-04-28 19:30:57 +00005172 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00005173 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00005174 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00005175
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005176 // -fno-slp-vectorize-aggressive is default.
5177 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00005178 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005179 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00005180
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00005181 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
5182 A->render(Args, CmdArgs);
5183
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005184 // -fdollars-in-identifiers default varies depending on platform and
5185 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00005186 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005187 options::OPT_fno_dollars_in_identifiers)) {
5188 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005189 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005190 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00005191 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00005192 }
5193
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005194 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
5195 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00005196 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005197 options::OPT_fno_unit_at_a_time)) {
5198 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005199 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00005200 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005201
Eli Friedman055c9702011-11-02 01:53:16 +00005202 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
5203 options::OPT_fno_apple_pragma_pack, false))
5204 CmdArgs.push_back("-fapple-pragma-pack");
5205
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005206 // le32-specific flags:
Eli Benderskyc95cfe82013-07-24 18:20:14 +00005207 // -fno-math-builtin: clang should not convert math builtins to intrinsics
5208 // by default.
5209 if (getToolChain().getArch() == llvm::Triple::le32) {
5210 CmdArgs.push_back("-fno-math-builtin");
5211 }
5212
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005213// Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
5214//
5215// FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005216#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00005217 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005218 (getToolChain().getArch() == llvm::Triple::arm ||
5219 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005220 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
5221 CmdArgs.push_back("-fno-builtin-strcat");
5222 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
5223 CmdArgs.push_back("-fno-builtin-strcpy");
5224 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00005225#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00005226
Justin Bognera88f0122014-06-20 22:59:50 +00005227 // Enable rewrite includes if the user's asked for it or if we're generating
5228 // diagnostics.
5229 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
5230 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00005231 if (Args.hasFlag(options::OPT_frewrite_includes,
5232 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00005233 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00005234 CmdArgs.push_back("-frewrite-includes");
5235
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005236 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00005237 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005238 options::OPT_traditional_cpp)) {
5239 if (isa<PreprocessJobAction>(JA))
5240 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00005241 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005242 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00005243 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00005244
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005245 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00005246 Args.AddLastArg(CmdArgs, options::OPT_dD);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005247
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005248 // Handle serialized diagnostics.
5249 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
5250 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00005251 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00005252 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005253
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00005254 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
5255 CmdArgs.push_back("-fretain-comments-from-system-headers");
5256
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005257 // Forward -fcomment-block-commands to -cc1.
5258 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00005259 // Forward -fparse-all-comments to -cc1.
5260 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00005261
John Brawnad31ace2015-09-23 13:55:40 +00005262 // Turn -fplugin=name.so into -load name.so
5263 for (const Arg *A : Args.filtered(options::OPT_fplugin_EQ)) {
5264 CmdArgs.push_back("-load");
5265 CmdArgs.push_back(A->getValue());
5266 A->claim();
5267 }
5268
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005269 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
5270 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005271 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Sean Silva14facf32015-06-09 01:57:17 +00005272 for (const Arg *A : Args.filtered(options::OPT_mllvm)) {
5273 A->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00005274
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005275 // We translate this by hand to the -cc1 argument, since nightly test uses
5276 // it and developers have been trained to spell it with -mllvm.
Sean Silva14facf32015-06-09 01:57:17 +00005277 if (StringRef(A->getValue(0)) == "-disable-llvm-optzns") {
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005278 CmdArgs.push_back("-disable-llvm-optzns");
Bob Wilson23a55f12014-12-21 07:00:00 +00005279 } else
Sean Silva14facf32015-06-09 01:57:17 +00005280 A->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00005281 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005282
Bob Wilson23a55f12014-12-21 07:00:00 +00005283 // With -save-temps, we want to save the unoptimized bitcode output from the
Steven Wu546a1962015-07-17 20:09:56 +00005284 // CompileJobAction, use -disable-llvm-passes to get pristine IR generated
5285 // by the frontend.
5286 if (C.getDriver().isSaveTempsEnabled() && isa<CompileJobAction>(JA))
5287 CmdArgs.push_back("-disable-llvm-passes");
Bob Wilson23a55f12014-12-21 07:00:00 +00005288
Daniel Dunbard67a3222009-03-30 06:36:42 +00005289 if (Output.getType() == types::TY_Dependencies) {
5290 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005291 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005292 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005293 CmdArgs.push_back(Output.getFilename());
5294 } else {
5295 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005296 }
5297
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005298 addDashXForInput(Args, Input, CmdArgs);
Ben Langmuir2cb4a782014-02-05 22:21:15 +00005299
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005300 if (Input.isFilename())
5301 CmdArgs.push_back(Input.getFilename());
5302 else
5303 Input.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005304
Chris Lattnere9d7d782009-11-03 19:50:27 +00005305 Args.AddAllArgs(CmdArgs, options::OPT_undef);
5306
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005307 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005308
5309 // Optionally embed the -cc1 level arguments into the debug info, for build
5310 // analysis.
5311 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00005312 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005313 for (const auto &Arg : Args)
5314 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00005315
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005316 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005317 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005318 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005319 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005320 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005321 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005322 Flags += EscapedArg;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005323 }
5324 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005325 CmdArgs.push_back(Args.MakeArgString(Flags));
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00005326 }
5327
Eric Christopherd3804002013-02-22 20:12:52 +00005328 // Add the split debug info name to the command lines here so we
5329 // can propagate it to the backend.
David Blaikiece3e7a62015-07-30 21:42:22 +00005330 bool SplitDwarf = SplitDwarfArg && getToolChain().getTriple().isOSLinux() &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005331 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA) ||
5332 isa<BackendJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00005333 const char *SplitDwarfOut;
5334 if (SplitDwarf) {
5335 CmdArgs.push_back("-split-dwarf-file");
Artem Belevichba558952015-05-06 18:20:23 +00005336 SplitDwarfOut = SplitDebugName(Args, Input);
Eric Christopherd3804002013-02-22 20:12:52 +00005337 CmdArgs.push_back(SplitDwarfOut);
5338 }
5339
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005340 // Host-side cuda compilation receives device-side outputs as Inputs[1...].
5341 // Include them with -fcuda-include-gpubinary.
5342 if (IsCuda && Inputs.size() > 1)
Artem Belevich5bde4e02015-07-20 20:02:54 +00005343 for (auto I = std::next(Inputs.begin()), E = Inputs.end(); I != E; ++I) {
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005344 CmdArgs.push_back("-fcuda-include-gpubinary");
Artem Belevich5bde4e02015-07-20 20:02:54 +00005345 CmdArgs.push_back(I->getFilename());
Artem Belevich0ff05cd2015-07-13 23:27:56 +00005346 }
5347
Eric Christopherd3804002013-02-22 20:12:52 +00005348 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00005349 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00005350 Output.getType() == types::TY_Object &&
5351 (InputType == types::TY_C || InputType == types::TY_CXX)) {
David Blaikiec11bf802014-09-04 16:04:28 +00005352 auto CLCommand =
5353 getCLFallback()->GetCommand(C, JA, Output, Inputs, Args, LinkingOutput);
Justin Bognerd3371d82015-07-17 03:35:54 +00005354 C.addCommand(llvm::make_unique<FallbackCommand>(
5355 JA, *this, Exec, CmdArgs, Inputs, std::move(CLCommand)));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005356 } else {
Justin Bognerd3371d82015-07-17 03:35:54 +00005357 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Hans Wennborg87cfa712013-09-19 20:32:16 +00005358 }
5359
Eric Christopherf1545832013-02-22 23:50:16 +00005360 // Handle the debug info splitting at object creation time if we're
5361 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00005362 // TODO: Currently only works on linux with newer objcopy.
Bob Wilson23a55f12014-12-21 07:00:00 +00005363 if (SplitDwarf && !isa<CompileJobAction>(JA) && !isa<BackendJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00005364 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00005365
Roman Divacky178e01602011-02-10 16:52:03 +00005366 if (Arg *A = Args.getLastArg(options::OPT_pg))
5367 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005368 D.Diag(diag::err_drv_argument_not_allowed_with) << "-fomit-frame-pointer"
5369 << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005370
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005371 // Claim some arguments which clang supports automatically.
5372
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00005373 // -fpch-preprocess is used with gcc to add a special marker in the output to
5374 // include the PCH file. Clang's PTH solution is completely transparent, so we
5375 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00005376 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005377
Daniel Dunbar17731772009-03-23 19:03:36 +00005378 // Claim some arguments which clang doesn't support, but we don't
5379 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00005380 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
5381 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00005382
Rafael Espindolab0092d72013-09-04 19:37:35 +00005383 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00005384 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005385}
5386
John McCall5fb5df92012-06-20 06:18:46 +00005387/// Add options related to the Objective-C runtime/ABI.
5388///
5389/// Returns true if the runtime is non-fragile.
5390ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
5391 ArgStringList &cmdArgs,
5392 RewriteKind rewriteKind) const {
5393 // Look for the controlling runtime option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005394 Arg *runtimeArg =
5395 args.getLastArg(options::OPT_fnext_runtime, options::OPT_fgnu_runtime,
5396 options::OPT_fobjc_runtime_EQ);
John McCall5fb5df92012-06-20 06:18:46 +00005397
5398 // Just forward -fobjc-runtime= to the frontend. This supercedes
5399 // options about fragility.
5400 if (runtimeArg &&
5401 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
5402 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00005403 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005404 if (runtime.tryParse(value)) {
5405 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005406 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005407 }
5408
5409 runtimeArg->render(args, cmdArgs);
5410 return runtime;
5411 }
5412
5413 // Otherwise, we'll need the ABI "version". Version numbers are
5414 // slightly confusing for historical reasons:
5415 // 1 - Traditional "fragile" ABI
5416 // 2 - Non-fragile ABI, version 1
5417 // 3 - Non-fragile ABI, version 2
5418 unsigned objcABIVersion = 1;
5419 // If -fobjc-abi-version= is present, use that to set the version.
5420 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005421 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005422 if (value == "1")
5423 objcABIVersion = 1;
5424 else if (value == "2")
5425 objcABIVersion = 2;
5426 else if (value == "3")
5427 objcABIVersion = 3;
5428 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005429 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported) << value;
John McCall5fb5df92012-06-20 06:18:46 +00005430 } else {
5431 // Otherwise, determine if we are using the non-fragile ABI.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005432 bool nonFragileABIIsDefault =
5433 (rewriteKind == RK_NonFragile ||
5434 (rewriteKind == RK_None &&
5435 getToolChain().IsObjCNonFragileABIDefault()));
John McCall5fb5df92012-06-20 06:18:46 +00005436 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
5437 options::OPT_fno_objc_nonfragile_abi,
5438 nonFragileABIIsDefault)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005439// Determine the non-fragile ABI version to use.
John McCall5fb5df92012-06-20 06:18:46 +00005440#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
5441 unsigned nonFragileABIVersion = 1;
5442#else
5443 unsigned nonFragileABIVersion = 2;
5444#endif
5445
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005446 if (Arg *abiArg =
5447 args.getLastArg(options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005448 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00005449 if (value == "1")
5450 nonFragileABIVersion = 1;
5451 else if (value == "2")
5452 nonFragileABIVersion = 2;
5453 else
5454 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005455 << value;
John McCall5fb5df92012-06-20 06:18:46 +00005456 }
5457
5458 objcABIVersion = 1 + nonFragileABIVersion;
5459 } else {
5460 objcABIVersion = 1;
5461 }
5462 }
5463
5464 // We don't actually care about the ABI version other than whether
5465 // it's non-fragile.
5466 bool isNonFragile = objcABIVersion != 1;
5467
5468 // If we have no runtime argument, ask the toolchain for its default runtime.
5469 // However, the rewriter only really supports the Mac runtime, so assume that.
5470 ObjCRuntime runtime;
5471 if (!runtimeArg) {
5472 switch (rewriteKind) {
5473 case RK_None:
5474 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5475 break;
5476 case RK_Fragile:
5477 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
5478 break;
5479 case RK_NonFragile:
5480 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5481 break;
5482 }
5483
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005484 // -fnext-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005485 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
5486 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005487 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00005488 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
5489
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005490 // Otherwise, build for a generic macosx port.
John McCall5fb5df92012-06-20 06:18:46 +00005491 } else {
5492 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
5493 }
5494
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005495 // -fgnu-runtime
John McCall5fb5df92012-06-20 06:18:46 +00005496 } else {
5497 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00005498 // Legacy behaviour is to target the gnustep runtime if we are i
5499 // non-fragile mode or the GCC runtime in fragile mode.
5500 if (isNonFragile)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005501 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1, 6));
David Chisnall314896c2012-07-04 10:37:03 +00005502 else
5503 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00005504 }
5505
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005506 cmdArgs.push_back(
5507 args.MakeArgString("-fobjc-runtime=" + runtime.getAsString()));
John McCall5fb5df92012-06-20 06:18:46 +00005508 return runtime;
5509}
5510
Reid Klecknerc542d372014-06-27 17:02:02 +00005511static bool maybeConsumeDash(const std::string &EH, size_t &I) {
5512 bool HaveDash = (I + 1 < EH.size() && EH[I + 1] == '-');
5513 I += HaveDash;
5514 return !HaveDash;
Chandler Carruth095b6962014-06-29 22:42:51 +00005515}
Reid Klecknerc542d372014-06-27 17:02:02 +00005516
Benjamin Kramere003ca22015-10-28 13:54:16 +00005517namespace {
Reid Klecknerc542d372014-06-27 17:02:02 +00005518struct EHFlags {
5519 EHFlags() : Synch(false), Asynch(false), NoExceptC(false) {}
5520 bool Synch;
5521 bool Asynch;
5522 bool NoExceptC;
5523};
Benjamin Kramere003ca22015-10-28 13:54:16 +00005524} // end anonymous namespace
Reid Klecknerc542d372014-06-27 17:02:02 +00005525
5526/// /EH controls whether to run destructor cleanups when exceptions are
5527/// thrown. There are three modifiers:
5528/// - s: Cleanup after "synchronous" exceptions, aka C++ exceptions.
5529/// - a: Cleanup after "asynchronous" exceptions, aka structured exceptions.
5530/// The 'a' modifier is unimplemented and fundamentally hard in LLVM IR.
5531/// - c: Assume that extern "C" functions are implicitly noexcept. This
5532/// modifier is an optimization, so we ignore it for now.
5533/// The default is /EHs-c-, meaning cleanups are disabled.
5534static EHFlags parseClangCLEHFlags(const Driver &D, const ArgList &Args) {
5535 EHFlags EH;
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005536
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005537 std::vector<std::string> EHArgs =
5538 Args.getAllArgValues(options::OPT__SLASH_EH);
Reid Klecknerc542d372014-06-27 17:02:02 +00005539 for (auto EHVal : EHArgs) {
5540 for (size_t I = 0, E = EHVal.size(); I != E; ++I) {
5541 switch (EHVal[I]) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005542 case 'a':
5543 EH.Asynch = maybeConsumeDash(EHVal, I);
5544 continue;
5545 case 'c':
5546 EH.NoExceptC = maybeConsumeDash(EHVal, I);
5547 continue;
5548 case 's':
5549 EH.Synch = maybeConsumeDash(EHVal, I);
5550 continue;
5551 default:
5552 break;
Reid Klecknerc542d372014-06-27 17:02:02 +00005553 }
5554 D.Diag(clang::diag::err_drv_invalid_value) << "/EH" << EHVal;
5555 break;
5556 }
5557 }
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00005558
Reid Klecknerc542d372014-06-27 17:02:02 +00005559 return EH;
5560}
5561
Douglas Katzman3459ce22015-10-08 04:24:12 +00005562void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs,
5563 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
5564 bool *EmitCodeView) const {
Hans Wennborg75958c42013-08-08 00:17:41 +00005565 unsigned RTOptionID = options::OPT__SLASH_MT;
5566
Hans Wennborgf1a74252013-09-10 20:18:04 +00005567 if (Args.hasArg(options::OPT__SLASH_LDd))
5568 // The /LDd option implies /MTd. The dependent lib part can be overridden,
5569 // but defining _DEBUG is sticky.
5570 RTOptionID = options::OPT__SLASH_MTd;
5571
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00005572 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00005573 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00005574
David Majnemere2afb472015-07-24 06:49:13 +00005575 StringRef FlagForCRT;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005576 switch (RTOptionID) {
5577 case options::OPT__SLASH_MD:
5578 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005579 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005580 CmdArgs.push_back("-D_MT");
5581 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005582 FlagForCRT = "--dependent-lib=msvcrt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005583 break;
5584 case options::OPT__SLASH_MDd:
5585 CmdArgs.push_back("-D_DEBUG");
5586 CmdArgs.push_back("-D_MT");
5587 CmdArgs.push_back("-D_DLL");
David Majnemere2afb472015-07-24 06:49:13 +00005588 FlagForCRT = "--dependent-lib=msvcrtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005589 break;
5590 case options::OPT__SLASH_MT:
5591 if (Args.hasArg(options::OPT__SLASH_LDd))
Hans Wennborg75958c42013-08-08 00:17:41 +00005592 CmdArgs.push_back("-D_DEBUG");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005593 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005594 FlagForCRT = "--dependent-lib=libcmt";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005595 break;
5596 case options::OPT__SLASH_MTd:
5597 CmdArgs.push_back("-D_DEBUG");
5598 CmdArgs.push_back("-D_MT");
David Majnemere2afb472015-07-24 06:49:13 +00005599 FlagForCRT = "--dependent-lib=libcmtd";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005600 break;
5601 default:
5602 llvm_unreachable("Unexpected option ID.");
Hans Wennborg75958c42013-08-08 00:17:41 +00005603 }
5604
David Majnemere2afb472015-07-24 06:49:13 +00005605 if (Args.hasArg(options::OPT__SLASH_Zl)) {
5606 CmdArgs.push_back("-D_VC_NODEFAULTLIB");
5607 } else {
5608 CmdArgs.push_back(FlagForCRT.data());
5609
5610 // This provides POSIX compatibility (maps 'open' to '_open'), which most
5611 // users want. The /Za flag to cl.exe turns this off, but it's not
5612 // implemented in clang.
5613 CmdArgs.push_back("--dependent-lib=oldnames");
5614 }
Hans Wennborg614f7072013-08-08 19:54:30 +00005615
Hans Wennborg8858a032014-07-21 23:42:07 +00005616 // Both /showIncludes and /E (and /EP) write to stdout. Allowing both
5617 // would produce interleaved output, so ignore /showIncludes in such cases.
5618 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_EP))
5619 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
5620 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00005621
David Majnemerf6072342014-07-01 22:24:56 +00005622 // This controls whether or not we emit RTTI data for polymorphic types.
5623 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
5624 /*default=*/false))
5625 CmdArgs.push_back("-fno-rtti-data");
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00005626
Reid Kleckner124955a2015-08-05 18:51:13 +00005627 // Emit CodeView if -Z7 is present.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005628 *EmitCodeView = Args.hasArg(options::OPT__SLASH_Z7);
Reid Kleckner124955a2015-08-05 18:51:13 +00005629 bool EmitDwarf = Args.hasArg(options::OPT_gdwarf);
5630 // If we are emitting CV but not DWARF, don't build information that LLVM
5631 // can't yet process.
Douglas Katzman3459ce22015-10-08 04:24:12 +00005632 if (*EmitCodeView && !EmitDwarf)
5633 *DebugInfoKind = CodeGenOptions::DebugLineTablesOnly;
5634 if (*EmitCodeView)
Reid Kleckner124955a2015-08-05 18:51:13 +00005635 CmdArgs.push_back("-gcodeview");
5636
Reid Klecknerc542d372014-06-27 17:02:02 +00005637 const Driver &D = getToolChain().getDriver();
5638 EHFlags EH = parseClangCLEHFlags(D, Args);
5639 // FIXME: Do something with NoExceptC.
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005640 if (EH.Synch || EH.Asynch) {
Reid Klecknerc542d372014-06-27 17:02:02 +00005641 CmdArgs.push_back("-fcxx-exceptions");
Reid Klecknerdeeddec2015-02-05 18:56:03 +00005642 CmdArgs.push_back("-fexceptions");
5643 }
Reid Klecknerc542d372014-06-27 17:02:02 +00005644
Hans Wennborge50cec32014-06-13 20:59:54 +00005645 // /EP should expand to -E -P.
5646 if (Args.hasArg(options::OPT__SLASH_EP)) {
5647 CmdArgs.push_back("-E");
5648 CmdArgs.push_back("-P");
5649 }
5650
David Majnemera5b195a2015-02-14 01:35:12 +00005651 unsigned VolatileOptionID;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00005652 if (getToolChain().getArch() == llvm::Triple::x86_64 ||
5653 getToolChain().getArch() == llvm::Triple::x86)
David Majnemera5b195a2015-02-14 01:35:12 +00005654 VolatileOptionID = options::OPT__SLASH_volatile_ms;
5655 else
5656 VolatileOptionID = options::OPT__SLASH_volatile_iso;
5657
5658 if (Arg *A = Args.getLastArg(options::OPT__SLASH_volatile_Group))
5659 VolatileOptionID = A->getOption().getID();
5660
5661 if (VolatileOptionID == options::OPT__SLASH_volatile_ms)
5662 CmdArgs.push_back("-fms-volatile");
5663
David Majnemer86c318f2014-02-11 21:05:00 +00005664 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
5665 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
5666 if (MostGeneralArg && BestCaseArg)
5667 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5668 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
5669
5670 if (MostGeneralArg) {
5671 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
5672 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
5673 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
5674
5675 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
5676 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
5677 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
5678 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
5679 << FirstConflict->getAsString(Args)
5680 << SecondConflict->getAsString(Args);
5681
5682 if (SingleArg)
5683 CmdArgs.push_back("-fms-memptr-rep=single");
5684 else if (MultipleArg)
5685 CmdArgs.push_back("-fms-memptr-rep=multiple");
5686 else
5687 CmdArgs.push_back("-fms-memptr-rep=virtual");
5688 }
5689
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00005690 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
5691 A->render(Args, CmdArgs);
5692
Hans Wennborg81f74482013-09-10 01:07:07 +00005693 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
5694 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00005695 if (Args.hasArg(options::OPT__SLASH_fallback))
5696 CmdArgs.push_back("msvc-fallback");
5697 else
5698 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00005699 }
Hans Wennborg75958c42013-08-08 00:17:41 +00005700}
5701
Douglas Katzman95354292015-06-23 20:42:09 +00005702visualstudio::Compiler *Clang::getCLFallback() const {
Hans Wennborg1da044a2014-06-26 19:59:02 +00005703 if (!CLFallback)
Douglas Katzman95354292015-06-23 20:42:09 +00005704 CLFallback.reset(new visualstudio::Compiler(getToolChain()));
Hans Wennborg1da044a2014-06-26 19:59:02 +00005705 return CLFallback.get();
5706}
5707
Daniel Sanders7f933f42015-01-30 17:35:23 +00005708void ClangAs::AddMIPSTargetArgs(const ArgList &Args,
5709 ArgStringList &CmdArgs) const {
5710 StringRef CPUName;
5711 StringRef ABIName;
5712 const llvm::Triple &Triple = getToolChain().getTriple();
5713 mips::getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
5714
5715 CmdArgs.push_back("-target-abi");
5716 CmdArgs.push_back(ABIName.data());
5717}
5718
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005719void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005720 const InputInfo &Output, const InputInfoList &Inputs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005721 const ArgList &Args,
5722 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005723 ArgStringList CmdArgs;
5724
5725 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5726 const InputInfo &Input = Inputs[0];
5727
James Y Knight2db38f32015-08-15 03:45:25 +00005728 std::string TripleStr =
5729 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
5730 const llvm::Triple Triple(TripleStr);
5731
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005732 // Don't warn about "clang -w -c foo.s"
5733 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00005734 // and "clang -emit-llvm -c foo.s"
5735 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00005736
Rafael Espindola577637a2015-01-03 00:06:04 +00005737 claimNoWarnArgs(Args);
Rafael Espindola16042fc2015-01-02 23:23:52 +00005738
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005739 // Invoke ourselves in -cc1as mode.
5740 //
5741 // FIXME: Implement custom jobs for internal actions.
5742 CmdArgs.push_back("-cc1as");
5743
5744 // Add the "effective" target triple.
5745 CmdArgs.push_back("-triple");
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005746 CmdArgs.push_back(Args.MakeArgString(TripleStr));
5747
5748 // Set the output mode, we currently only expect to be used as a real
5749 // assembler.
5750 CmdArgs.push_back("-filetype");
5751 CmdArgs.push_back("obj");
5752
Eric Christopher45f2e712012-12-18 00:31:10 +00005753 // Set the main file name, so that debug info works even with
5754 // -save-temps or preprocessed assembly.
5755 CmdArgs.push_back("-main-file-name");
Artem Belevichba558952015-05-06 18:20:23 +00005756 CmdArgs.push_back(Clang::getBaseInputName(Args, Input));
Eric Christopher45f2e712012-12-18 00:31:10 +00005757
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005758 // Add the target cpu
Renato Golin7c542b42015-07-27 23:44:45 +00005759 std::string CPU = getCPUName(Args, Triple, /*FromAs*/ true);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00005760 if (!CPU.empty()) {
5761 CmdArgs.push_back("-target-cpu");
5762 CmdArgs.push_back(Args.MakeArgString(CPU));
5763 }
5764
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00005765 // Add the target features
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00005766 getTargetFeatures(getToolChain(), Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00005767
Daniel Dunbar1d733e22011-03-17 17:37:29 +00005768 // Ignore explicit -force_cpusubtype_ALL option.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005769 (void)Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005770
Jim Grosbachc78c2bc2015-06-23 18:20:13 +00005771 // Pass along any -I options so we get proper .include search paths.
5772 Args.AddAllArgs(CmdArgs, options::OPT_I_Group);
5773
Eric Christopherfc3ee562012-01-10 00:38:01 +00005774 // Determine the original source input.
5775 const Action *SourceAction = &JA;
5776 while (SourceAction->getKind() != Action::InputClass) {
5777 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5778 SourceAction = SourceAction->getInputs()[0];
5779 }
5780
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005781 // Forward -g and handle debug info related flags, assuming we are dealing
5782 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00005783 if (SourceAction->getType() == types::TY_Asm ||
5784 SourceAction->getType() == types::TY_PP_Asm) {
Douglas Katzman3459ce22015-10-08 04:24:12 +00005785 bool WantDebug = false;
5786 unsigned DwarfVersion = 0;
Eric Christopherfc3ee562012-01-10 00:38:01 +00005787 Args.ClaimAllArgs(options::OPT_g_Group);
Douglas Katzman3459ce22015-10-08 04:24:12 +00005788 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
5789 WantDebug = !A->getOption().matches(options::OPT_g0);
Douglas Katzman64071ad2015-10-15 04:10:40 +00005790 if (WantDebug)
Douglas Katzman722bcb02015-10-13 16:22:51 +00005791 DwarfVersion = DwarfVersionNum(A->getSpelling());
Douglas Katzman3459ce22015-10-08 04:24:12 +00005792 }
Douglas Katzman722bcb02015-10-13 16:22:51 +00005793 if (DwarfVersion == 0)
5794 DwarfVersion = getToolChain().GetDefaultDwarfVersion();
Douglas Katzman3459ce22015-10-08 04:24:12 +00005795 RenderDebugEnablingArgs(Args, CmdArgs,
5796 (WantDebug ? CodeGenOptions::LimitedDebugInfo
5797 : CodeGenOptions::NoDebugInfo),
5798 DwarfVersion);
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00005799
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00005800 // Add the -fdebug-compilation-dir flag if needed.
5801 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00005802
5803 // Set the AT_producer to the clang version when using the integrated
5804 // assembler on assembly source files.
5805 CmdArgs.push_back("-dwarf-debug-producer");
5806 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Renato Golina74bbc72015-07-22 15:32:36 +00005807
5808 // And pass along -I options
5809 Args.AddAllArgs(CmdArgs, options::OPT_I);
Eric Christopherfc3ee562012-01-10 00:38:01 +00005810 }
Kevin Enderby292dc082011-12-22 19:31:58 +00005811
James Y Knight5bdf7ab2015-08-19 15:12:02 +00005812 // Handle -fPIC et al -- the relocation-model affects the assembler
5813 // for some targets.
5814 llvm::Reloc::Model RelocationModel;
5815 unsigned PICLevel;
5816 bool IsPIE;
5817 std::tie(RelocationModel, PICLevel, IsPIE) =
5818 ParsePICArgs(getToolChain(), Triple, Args);
5819
5820 const char *RMName = RelocationModelName(RelocationModel);
5821 if (RMName) {
5822 CmdArgs.push_back("-mrelocation-model");
5823 CmdArgs.push_back(RMName);
5824 }
5825
Kevin Enderby292dc082011-12-22 19:31:58 +00005826 // Optionally embed the -cc1as level arguments into the debug info, for build
5827 // analysis.
5828 if (getToolChain().UseDwarfDebugFlags()) {
5829 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005830 for (const auto &Arg : Args)
5831 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00005832
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00005833 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00005834 const char *Exec = getToolChain().getDriver().getClangProgramPath();
5835 Flags += Exec;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005836 for (const char *OriginalArg : OriginalArgs) {
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005837 SmallString<128> EscapedArg;
Douglas Katzman6bbffc42015-06-25 18:51:37 +00005838 EscapeSpacesAndBackslashes(OriginalArg, EscapedArg);
Kevin Enderby292dc082011-12-22 19:31:58 +00005839 Flags += " ";
Bob Wilsond5aad2a2014-11-04 22:28:48 +00005840 Flags += EscapedArg;
Kevin Enderby292dc082011-12-22 19:31:58 +00005841 }
5842 CmdArgs.push_back("-dwarf-debug-flags");
Yaron Keren92e1b622015-03-18 10:17:07 +00005843 CmdArgs.push_back(Args.MakeArgString(Flags));
Kevin Enderby292dc082011-12-22 19:31:58 +00005844 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005845
5846 // FIXME: Add -static support, once we have it.
5847
Daniel Sanders7f933f42015-01-30 17:35:23 +00005848 // Add target specific flags.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005849 switch (getToolChain().getArch()) {
Daniel Sanders7f933f42015-01-30 17:35:23 +00005850 default:
5851 break;
5852
5853 case llvm::Triple::mips:
5854 case llvm::Triple::mipsel:
5855 case llvm::Triple::mips64:
5856 case llvm::Triple::mips64el:
5857 AddMIPSTargetArgs(Args, CmdArgs);
5858 break;
5859 }
5860
David Blaikie372d9502014-01-17 03:17:40 +00005861 // Consume all the warning flags. Usually this would be handled more
5862 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
5863 // doesn't handle that so rather than warning about unused flags that are
5864 // actually used, we'll lie by omission instead.
5865 // FIXME: Stop lying and consume only the appropriate driver flags
Sean Silva14facf32015-06-09 01:57:17 +00005866 for (const Arg *A : Args.filtered(options::OPT_W_Group))
5867 A->claim();
David Blaikie372d9502014-01-17 03:17:40 +00005868
David Blaikie9260ed62013-07-25 21:19:01 +00005869 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
5870 getToolChain().getDriver());
5871
Daniel Dunbar252e8f92011-04-29 17:53:18 +00005872 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005873
5874 assert(Output.isFilename() && "Unexpected lipo output.");
5875 CmdArgs.push_back("-o");
5876 CmdArgs.push_back(Output.getFilename());
5877
Daniel Dunbarb440f562010-08-02 02:38:21 +00005878 assert(Input.isFilename() && "Invalid input.");
5879 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005880
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00005881 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Justin Bognerd3371d82015-07-17 03:35:54 +00005882 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christophera75018a2013-04-10 21:30:40 +00005883
5884 // Handle the debug info splitting at object creation time if we're
5885 // creating an object.
5886 // TODO: Currently only works on linux with newer objcopy.
5887 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00005888 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00005889 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00005890 SplitDebugName(Args, Input));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00005891}
5892
Reid Kleckner0290c9c2014-09-15 17:45:39 +00005893void GnuTool::anchor() {}
5894
Daniel Dunbara3246a02009-03-18 08:07:30 +00005895void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005896 const InputInfo &Output,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005897 const InputInfoList &Inputs, const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00005898 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005899 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00005900 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00005901
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005902 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00005903 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00005904 // Don't forward any -g arguments to assembly steps.
5905 if (isa<AssembleJobAction>(JA) &&
5906 A->getOption().matches(options::OPT_g_Group))
5907 continue;
5908
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00005909 // Don't forward any -W arguments to assembly and link steps.
5910 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
5911 A->getOption().matches(options::OPT_W_Group))
5912 continue;
5913
Daniel Dunbar2da02722009-03-19 07:55:12 +00005914 // It is unfortunate that we have to claim here, as this means
5915 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00005916 // platforms using a generic gcc, even if we are just using gcc
5917 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00005918 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00005919 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00005920 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005921 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005922
Daniel Dunbar4e295052010-01-25 22:35:08 +00005923 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005924
5925 // If using a driver driver, force the arch.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005926 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005927 CmdArgs.push_back("-arch");
Rafael Espindolaed1233e2014-08-28 21:23:05 +00005928 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005929 Args.MakeArgString(getToolChain().getDefaultUniversalArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00005930 }
5931
Daniel Dunbar5716d872009-05-02 21:41:52 +00005932 // Try to force gcc to match the tool chain we want, if we recognize
5933 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00005934 //
5935 // FIXME: The triple class should directly provide the information we want
5936 // here.
Douglas Katzman38857552015-08-20 18:32:26 +00005937 switch (getToolChain().getArch()) {
5938 default:
5939 break;
5940 case llvm::Triple::x86:
5941 case llvm::Triple::ppc:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005942 CmdArgs.push_back("-m32");
Douglas Katzman38857552015-08-20 18:32:26 +00005943 break;
5944 case llvm::Triple::x86_64:
5945 case llvm::Triple::ppc64:
5946 case llvm::Triple::ppc64le:
Daniel Dunbar5716d872009-05-02 21:41:52 +00005947 CmdArgs.push_back("-m64");
Douglas Katzman38857552015-08-20 18:32:26 +00005948 break;
5949 case llvm::Triple::sparcel:
5950 CmdArgs.push_back("-EL");
5951 break;
5952 }
Daniel Dunbar5716d872009-05-02 21:41:52 +00005953
Daniel Dunbarb440f562010-08-02 02:38:21 +00005954 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00005955 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005956 CmdArgs.push_back(Output.getFilename());
5957 } else {
5958 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00005959 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005960 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00005961
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005962 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00005963
5964 // Only pass -x if gcc will understand it; otherwise hope gcc
5965 // understands the suffix correctly. The main use case this would go
5966 // wrong in is for linker inputs if they happened to have an odd
5967 // suffix; really the only way to get this to happen is a command
5968 // like '-x foobar a.c' which will treat a.c like a linker input.
5969 //
5970 // FIXME: For the linker case specifically, can we safely convert
5971 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005972 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005973 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00005974 if (types::isLLVMIR(II.getType()))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005975 D.Diag(diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005976 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00005977 else if (II.getType() == types::TY_AST)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005978 D.Diag(diag::err_drv_no_ast_support) << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00005979 else if (II.getType() == types::TY_ModuleFile)
5980 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00005981 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00005982
Daniel Dunbara3246a02009-03-18 08:07:30 +00005983 if (types::canTypeBeUserSpecified(II.getType())) {
5984 CmdArgs.push_back("-x");
5985 CmdArgs.push_back(types::getTypeName(II.getType()));
5986 }
5987
Daniel Dunbarb440f562010-08-02 02:38:21 +00005988 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005989 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00005990 else {
5991 const Arg &A = II.getInputArg();
5992
5993 // Reverse translate some rewritten options.
5994 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
5995 CmdArgs.push_back("-lstdc++");
5996 continue;
5997 }
5998
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00005999 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00006000 A.render(Args, CmdArgs);
6001 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00006002 }
6003
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006004 const std::string customGCCName = D.getCCCGenericGCCName();
6005 const char *GCCName;
6006 if (!customGCCName.empty())
6007 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00006008 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006009 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00006010 } else
6011 GCCName = "gcc";
6012
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006013 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006014 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006015}
6016
Douglas Katzman95354292015-06-23 20:42:09 +00006017void gcc::Preprocessor::RenderExtraToolArgs(const JobAction &JA,
6018 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006019 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006020}
6021
Douglas Katzman95354292015-06-23 20:42:09 +00006022void gcc::Compiler::RenderExtraToolArgs(const JobAction &JA,
6023 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006024 const Driver &D = getToolChain().getDriver();
6025
Eric Christophercc7ff502015-01-29 00:56:17 +00006026 switch (JA.getType()) {
Daniel Dunbar4e295052010-01-25 22:35:08 +00006027 // If -flto, etc. are present then make sure not to force assembly output.
Eric Christophercc7ff502015-01-29 00:56:17 +00006028 case types::TY_LLVM_IR:
6029 case types::TY_LTO_IR:
6030 case types::TY_LLVM_BC:
6031 case types::TY_LTO_BC:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006032 CmdArgs.push_back("-c");
Eric Christophercc7ff502015-01-29 00:56:17 +00006033 break;
6034 case types::TY_PP_Asm:
Daniel Dunbar4e295052010-01-25 22:35:08 +00006035 CmdArgs.push_back("-S");
Eric Christopher58c21992015-01-30 18:22:23 +00006036 break;
Eric Christophercc7ff502015-01-29 00:56:17 +00006037 case types::TY_Nothing:
6038 CmdArgs.push_back("-fsyntax-only");
6039 break;
6040 default:
6041 D.Diag(diag::err_drv_invalid_gcc_output_type) << getTypeName(JA.getType());
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00006042 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00006043}
6044
Douglas Katzman95354292015-06-23 20:42:09 +00006045void gcc::Linker::RenderExtraToolArgs(const JobAction &JA,
6046 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00006047 // The types are (hopefully) good enough.
6048}
6049
Tony Linthicum76329bf2011-12-12 21:14:55 +00006050// Hexagon tools start.
Douglas Katzman95354292015-06-23 20:42:09 +00006051void hexagon::Assembler::RenderExtraToolArgs(const JobAction &JA,
6052 ArgStringList &CmdArgs) const {}
6053void hexagon::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6054 const InputInfo &Output,
6055 const InputInfoList &Inputs,
6056 const ArgList &Args,
6057 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00006058 claimNoWarnArgs(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006059
6060 const Driver &D = getToolChain().getDriver();
6061 ArgStringList CmdArgs;
6062
6063 std::string MarchString = "-march=";
Douglas Katzman54366072015-07-27 16:53:08 +00006064 MarchString += toolchains::HexagonToolChain::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00006065 CmdArgs.push_back(Args.MakeArgString(MarchString));
6066
6067 RenderExtraToolArgs(JA, CmdArgs);
6068
6069 if (Output.isFilename()) {
6070 CmdArgs.push_back("-o");
6071 CmdArgs.push_back(Output.getFilename());
6072 } else {
6073 assert(Output.isNothing() && "Unexpected output");
6074 CmdArgs.push_back("-fsyntax-only");
6075 }
6076
Douglas Katzman54366072015-07-27 16:53:08 +00006077 if (const char *v = toolchains::HexagonToolChain::GetSmallDataThreshold(Args))
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006078 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006079
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006080 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Matthew Curtise5df3812012-12-07 17:23:04 +00006081
Tony Linthicum76329bf2011-12-12 21:14:55 +00006082 // Only pass -x if gcc will understand it; otherwise hope gcc
6083 // understands the suffix correctly. The main use case this would go
6084 // wrong in is for linker inputs if they happened to have an odd
6085 // suffix; really the only way to get this to happen is a command
6086 // like '-x foobar a.c' which will treat a.c like a linker input.
6087 //
6088 // FIXME: For the linker case specifically, can we safely convert
6089 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006090 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006091 // Don't try to pass LLVM or AST inputs to a generic gcc.
Eric Christopherc1984072015-12-08 02:10:19 +00006092 if (types::isLLVMIR(II.getType()))
Tony Linthicum76329bf2011-12-12 21:14:55 +00006093 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006094 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006095 else if (II.getType() == types::TY_AST)
6096 D.Diag(clang::diag::err_drv_no_ast_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006097 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00006098 else if (II.getType() == types::TY_ModuleFile)
6099 D.Diag(diag::err_drv_no_module_support)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006100 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00006101
6102 if (II.isFilename())
6103 CmdArgs.push_back(II.getFilename());
6104 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006105 // Don't render as input, we need gcc to do the translations.
Eric Christopherb0a44f72015-12-08 01:59:51 +00006106 // FIXME: What is this?
Tony Linthicum76329bf2011-12-12 21:14:55 +00006107 II.getInputArg().render(Args, CmdArgs);
6108 }
6109
6110 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006111 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Justin Bognerd3371d82015-07-17 03:35:54 +00006112 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006113}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006114
Douglas Katzman95354292015-06-23 20:42:09 +00006115void hexagon::Linker::RenderExtraToolArgs(const JobAction &JA,
6116 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006117 // The types are (hopefully) good enough.
6118}
6119
Douglas Katzman54366072015-07-27 16:53:08 +00006120static void
6121constructHexagonLinkArgs(Compilation &C, const JobAction &JA,
6122 const toolchains::HexagonToolChain &ToolChain,
6123 const InputInfo &Output, const InputInfoList &Inputs,
6124 const ArgList &Args, ArgStringList &CmdArgs,
6125 const char *LinkingOutput) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00006126
Matthew Curtise689b052012-12-06 15:46:07 +00006127 const Driver &D = ToolChain.getDriver();
6128
Matthew Curtise689b052012-12-06 15:46:07 +00006129 //----------------------------------------------------------------------------
6130 //
6131 //----------------------------------------------------------------------------
6132 bool hasStaticArg = Args.hasArg(options::OPT_static);
6133 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006134 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00006135 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
6136 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
6137 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006138 bool useG0 = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006139 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00006140
Matthew Curtise689b052012-12-06 15:46:07 +00006141 //----------------------------------------------------------------------------
6142 // Silence warnings for various options
6143 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00006144
Matthew Curtise689b052012-12-06 15:46:07 +00006145 Args.ClaimAllArgs(options::OPT_g_Group);
6146 Args.ClaimAllArgs(options::OPT_emit_llvm);
6147 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
6148 // handled somewhere else.
6149 Args.ClaimAllArgs(options::OPT_static_libgcc);
6150
6151 //----------------------------------------------------------------------------
6152 //
6153 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006154 for (const auto &Opt : ToolChain.ExtraOpts)
6155 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006156
Douglas Katzman54366072015-07-27 16:53:08 +00006157 std::string MarchString = toolchains::HexagonToolChain::GetTargetCPU(Args);
Matthew Curtisf10a5952012-12-06 14:16:43 +00006158 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00006159
Matthew Curtise689b052012-12-06 15:46:07 +00006160 if (buildingLib) {
6161 CmdArgs.push_back("-shared");
6162 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
6163 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00006164 }
6165
Matthew Curtise689b052012-12-06 15:46:07 +00006166 if (hasStaticArg)
6167 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006168
Matthew Curtise8f80a12012-12-06 17:49:03 +00006169 if (buildPIE && !buildingLib)
6170 CmdArgs.push_back("-pie");
6171
Douglas Katzman54366072015-07-27 16:53:08 +00006172 if (const char *v =
6173 toolchains::HexagonToolChain::GetSmallDataThreshold(Args)) {
Ikhlas Ajbar522e6192015-05-14 13:52:08 +00006174 CmdArgs.push_back(Args.MakeArgString(std::string("-G") + v));
Douglas Katzman54366072015-07-27 16:53:08 +00006175 useG0 = toolchains::HexagonToolChain::UsesG0(v);
Matthew Curtise8f80a12012-12-06 17:49:03 +00006176 }
6177
Matthew Curtise689b052012-12-06 15:46:07 +00006178 //----------------------------------------------------------------------------
6179 //
6180 //----------------------------------------------------------------------------
6181 CmdArgs.push_back("-o");
6182 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00006183
Matthew Curtise689b052012-12-06 15:46:07 +00006184 const std::string MarchSuffix = "/" + MarchString;
6185 const std::string G0Suffix = "/G0";
6186 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
Benjamin Kramerd45b2052015-10-07 15:48:01 +00006187 const std::string RootDir = ToolChain.GetGnuDir(D.InstalledDir, Args) + "/";
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006188 const std::string StartFilesDir =
6189 RootDir + "hexagon/lib" + (useG0 ? MarchG0Suffix : MarchSuffix);
Matthew Curtise689b052012-12-06 15:46:07 +00006190
6191 //----------------------------------------------------------------------------
6192 // moslib
6193 //----------------------------------------------------------------------------
6194 std::vector<std::string> oslibs;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006195 bool hasStandalone = false;
Matthew Curtise689b052012-12-06 15:46:07 +00006196
Sean Silva14facf32015-06-09 01:57:17 +00006197 for (const Arg *A : Args.filtered(options::OPT_moslib_EQ)) {
6198 A->claim();
6199 oslibs.emplace_back(A->getValue());
Matthew Curtise689b052012-12-06 15:46:07 +00006200 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00006201 }
Matthew Curtise689b052012-12-06 15:46:07 +00006202 if (oslibs.empty()) {
6203 oslibs.push_back("standalone");
6204 hasStandalone = true;
6205 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00006206
Matthew Curtise689b052012-12-06 15:46:07 +00006207 //----------------------------------------------------------------------------
6208 // Start Files
6209 //----------------------------------------------------------------------------
6210 if (incStdLib && incStartFiles) {
6211
6212 if (!buildingLib) {
6213 if (hasStandalone) {
6214 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006215 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
Matthew Curtise689b052012-12-06 15:46:07 +00006216 }
6217 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
6218 }
6219 std::string initObj = useShared ? "/initS.o" : "/init.o";
6220 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
6221 }
6222
6223 //----------------------------------------------------------------------------
6224 // Library Search Paths
6225 //----------------------------------------------------------------------------
Douglas Katzman6059ef92015-11-17 17:41:23 +00006226 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Matthew Curtise689b052012-12-06 15:46:07 +00006227
6228 //----------------------------------------------------------------------------
6229 //
6230 //----------------------------------------------------------------------------
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006231 Args.AddAllArgs(CmdArgs,
6232 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6233 options::OPT_t, options::OPT_u_Group});
Matthew Curtise689b052012-12-06 15:46:07 +00006234
6235 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6236
6237 //----------------------------------------------------------------------------
6238 // Libraries
6239 //----------------------------------------------------------------------------
6240 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006241 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00006242 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6243 CmdArgs.push_back("-lm");
6244 }
6245
6246 CmdArgs.push_back("--start-group");
6247
6248 if (!buildingLib) {
Douglas Katzman2675d012015-06-29 19:12:56 +00006249 for (const std::string &Lib : oslibs)
6250 CmdArgs.push_back(Args.MakeArgString("-l" + Lib));
Matthew Curtise689b052012-12-06 15:46:07 +00006251 CmdArgs.push_back("-lc");
6252 }
6253 CmdArgs.push_back("-lgcc");
6254
6255 CmdArgs.push_back("--end-group");
6256 }
6257
6258 //----------------------------------------------------------------------------
6259 // End files
6260 //----------------------------------------------------------------------------
6261 if (incStdLib && incStartFiles) {
6262 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
6263 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
6264 }
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006265}
6266
Douglas Katzman95354292015-06-23 20:42:09 +00006267void hexagon::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6268 const InputInfo &Output,
6269 const InputInfoList &Inputs,
6270 const ArgList &Args,
6271 const char *LinkingOutput) const {
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006272
Douglas Katzman54366072015-07-27 16:53:08 +00006273 const toolchains::HexagonToolChain &ToolChain =
6274 static_cast<const toolchains::HexagonToolChain &>(getToolChain());
Ikhlas Ajbar71d19f32015-05-09 02:13:25 +00006275
6276 ArgStringList CmdArgs;
6277 constructHexagonLinkArgs(C, JA, ToolChain, Output, Inputs, Args, CmdArgs,
6278 LinkingOutput);
Matthew Curtise689b052012-12-06 15:46:07 +00006279
6280 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
David Blaikiec11bf802014-09-04 16:04:28 +00006281 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
Justin Bognerd3371d82015-07-17 03:35:54 +00006282 CmdArgs, Inputs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00006283}
6284// Hexagon tools end.
6285
Tom Stellard8fa33092015-07-18 01:49:05 +00006286void amdgpu::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6287 const InputInfo &Output,
6288 const InputInfoList &Inputs,
6289 const ArgList &Args,
6290 const char *LinkingOutput) const {
6291
6292 std::string Linker = getToolChain().GetProgramPath(getShortName());
6293 ArgStringList CmdArgs;
6294 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00006295 CmdArgs.push_back("old-gnu");
Tom Stellard8fa33092015-07-18 01:49:05 +00006296 CmdArgs.push_back("-target");
Tom Stellard1de69e82015-07-18 02:11:07 +00006297 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
Tom Stellard8fa33092015-07-18 01:49:05 +00006298 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6299 CmdArgs.push_back("-o");
6300 CmdArgs.push_back(Output.getFilename());
6301 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Linker),
6302 CmdArgs, Inputs));
6303}
6304// AMDGPU tools end.
6305
Renato Golin7c542b42015-07-27 23:44:45 +00006306const std::string arm::getARMArch(StringRef Arch, const llvm::Triple &Triple) {
Gabor Ballabascebcb3b2015-06-11 12:29:56 +00006307 std::string MArch;
Renato Goline17c5802015-07-27 23:44:42 +00006308 if (!Arch.empty())
6309 MArch = Arch;
6310 else
Bernard Ogden31561762013-12-12 13:27:11 +00006311 MArch = Triple.getArchName();
Bradley Smithbbf5a002015-11-18 16:33:48 +00006312 MArch = StringRef(MArch).split("+").first.lower();
John Brawn94fd9632015-05-21 12:19:49 +00006313
6314 // Handle -march=native.
6315 if (MArch == "native") {
6316 std::string CPU = llvm::sys::getHostCPUName();
6317 if (CPU != "generic") {
6318 // Translate the native cpu into the architecture suffix for that CPU.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006319 StringRef Suffix = arm::getLLVMArchSuffixForARM(CPU, MArch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006320 // If there is no valid architecture suffix for this CPU we don't know how
6321 // to handle it, so return no architecture.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006322 if (Suffix.empty())
John Brawn94fd9632015-05-21 12:19:49 +00006323 MArch = "";
6324 else
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006325 MArch = std::string("arm") + Suffix.str();
John Brawn94fd9632015-05-21 12:19:49 +00006326 }
6327 }
6328
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006329 return MArch;
6330}
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006331
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006332/// Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006333StringRef arm::getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple) {
Renato Goline17c5802015-07-27 23:44:42 +00006334 std::string MArch = getARMArch(Arch, Triple);
John Brawn94fd9632015-05-21 12:19:49 +00006335 // getARMCPUForArch defaults to the triple if MArch is empty, but empty MArch
6336 // here means an -march=native that we can't handle, so instead return no CPU.
6337 if (MArch.empty())
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006338 return StringRef();
Bernard Ogden31561762013-12-12 13:27:11 +00006339
John Brawna95c1a82015-05-08 12:52:18 +00006340 // We need to return an empty string here on invalid MArch values as the
6341 // various places that call this function can't cope with a null result.
Chandler Carruthd96f37a2015-08-30 07:51:18 +00006342 return Triple.getARMCPUForArch(MArch);
Bernard Ogden31561762013-12-12 13:27:11 +00006343}
6344
6345/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Renato Golin7c542b42015-07-27 23:44:45 +00006346std::string arm::getARMTargetCPU(StringRef CPU, StringRef Arch,
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006347 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00006348 // FIXME: Warn on inconsistent use of -mcpu and -march.
6349 // If we have -mcpu=, use that.
Renato Goline17c5802015-07-27 23:44:42 +00006350 if (!CPU.empty()) {
Bradley Smithbbf5a002015-11-18 16:33:48 +00006351 std::string MCPU = StringRef(CPU).split("+").first.lower();
Bernard Ogden31561762013-12-12 13:27:11 +00006352 // Handle -mcpu=native.
6353 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00006354 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00006355 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00006356 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00006357 }
6358
Renato Goline17c5802015-07-27 23:44:42 +00006359 return getARMCPUForMArch(Arch, Triple);
Bernard Ogden31561762013-12-12 13:27:11 +00006360}
6361
6362/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006363/// CPU (or Arch, if CPU is generic).
Bernard Ogden31561762013-12-12 13:27:11 +00006364// FIXME: This is redundant with -mcpu, why does LLVM use this.
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006365StringRef arm::getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
6366 const llvm::Triple &Triple) {
6367 unsigned ArchKind;
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006368 if (CPU == "generic") {
Vladimir Sukhareva317dfb2015-09-24 10:06:44 +00006369 std::string ARMArch = tools::arm::getARMArch(Arch, Triple);
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006370 ArchKind = llvm::ARM::parseArch(ARMArch);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006371 if (ArchKind == llvm::ARM::AK_INVALID)
6372 // In case of generic Arch, i.e. "arm",
6373 // extract arch from default cpu of the Triple
Vladimir Sukharev2eef4b52015-09-24 09:55:08 +00006374 ArchKind = llvm::ARM::parseCPUArch(Triple.getARMCPUForArch(ARMArch));
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006375 } else {
Tim Northover6f3ff222015-10-30 16:30:27 +00006376 // FIXME: horrible hack to get around the fact that Cortex-A7 is only an
6377 // armv7k triple if it's actually been specified via "-arch armv7k".
6378 ArchKind = (Arch == "armv7k" || Arch == "thumbv7k")
Aaron Ballman43059102015-11-04 14:43:43 +00006379 ? (unsigned)llvm::ARM::AK_ARMV7K
Tim Northover6f3ff222015-10-30 16:30:27 +00006380 : llvm::ARM::parseCPUArch(CPU);
Vladimir Sukharev64f68242015-09-23 09:29:32 +00006381 }
Renato Golin3c007252015-05-28 15:05:53 +00006382 if (ArchKind == llvm::ARM::AK_INVALID)
6383 return "";
Chandler Carruthaa0caeb2015-08-30 02:16:36 +00006384 return llvm::ARM::getSubArch(ArchKind);
Bernard Ogden31561762013-12-12 13:27:11 +00006385}
6386
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006387void arm::appendEBLinkFlags(const ArgList &Args, ArgStringList &CmdArgs,
Vladimir Sukharevc6dab752015-05-14 08:25:18 +00006388 const llvm::Triple &Triple) {
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006389 if (Args.hasArg(options::OPT_r))
6390 return;
6391
John Brawn94fd9632015-05-21 12:19:49 +00006392 // ARMv7 (and later) and ARMv6-M do not support BE-32, so instruct the linker
6393 // to generate BE-8 executables.
6394 if (getARMSubArchVersionNumber(Triple) >= 7 || isARMMProfile(Triple))
6395 CmdArgs.push_back("--be8");
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00006396}
6397
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006398mips::NanEncoding mips::getSupportedNanEncoding(StringRef &CPU) {
Daniel Sanderse0395a72015-09-24 10:22:17 +00006399 // Strictly speaking, mips32r2 and mips64r2 are NanLegacy-only since Nan2008
6400 // was first introduced in Release 3. However, other compilers have
6401 // traditionally allowed it for Release 2 so we should do the same.
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006402 return (NanEncoding)llvm::StringSwitch<int>(CPU)
6403 .Case("mips1", NanLegacy)
6404 .Case("mips2", NanLegacy)
6405 .Case("mips3", NanLegacy)
6406 .Case("mips4", NanLegacy)
6407 .Case("mips5", NanLegacy)
6408 .Case("mips32", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006409 .Case("mips32r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006410 .Case("mips32r3", NanLegacy | Nan2008)
6411 .Case("mips32r5", NanLegacy | Nan2008)
6412 .Case("mips32r6", Nan2008)
6413 .Case("mips64", NanLegacy)
Daniel Sanderse0395a72015-09-24 10:22:17 +00006414 .Case("mips64r2", NanLegacy | Nan2008)
Petar Jovanovic1dbc3172015-04-14 12:49:08 +00006415 .Case("mips64r3", NanLegacy | Nan2008)
6416 .Case("mips64r5", NanLegacy | Nan2008)
6417 .Case("mips64r6", Nan2008)
6418 .Default(NanLegacy);
6419}
6420
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006421bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
6422 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
6423 return A && (A->getValue() == StringRef(Value));
6424}
6425
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006426bool mips::isUCLibc(const ArgList &Args) {
6427 Arg *A = Args.getLastArg(options::OPT_m_libc_Group);
Rafael Espindolad3d657c2014-08-13 17:15:42 +00006428 return A && A->getOption().matches(options::OPT_muclibc);
Simon Atanasyand95c67d2014-08-13 14:34:14 +00006429}
6430
Daniel Sanders2bf13662014-07-10 14:40:57 +00006431bool mips::isNaN2008(const ArgList &Args, const llvm::Triple &Triple) {
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006432 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
6433 return llvm::StringSwitch<bool>(NaNArg->getValue())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006434 .Case("2008", true)
6435 .Case("legacy", false)
6436 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006437
6438 // NaN2008 is the default for MIPS32r6/MIPS64r6.
Daniel Sanders2bf13662014-07-10 14:40:57 +00006439 return llvm::StringSwitch<bool>(getCPUName(Args, Triple))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006440 .Cases("mips32r6", "mips64r6", true)
6441 .Default(false);
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006442
6443 return false;
6444}
6445
Daniel Sanders379d44b2014-07-16 11:52:23 +00006446bool mips::isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006447 StringRef ABIName, mips::FloatABI FloatABI) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00006448 if (Triple.getVendor() != llvm::Triple::ImaginationTechnologies &&
Daniel Sanders492beb12014-07-18 15:05:38 +00006449 Triple.getVendor() != llvm::Triple::MipsTechnologies)
Daniel Sanders379d44b2014-07-16 11:52:23 +00006450 return false;
6451
6452 if (ABIName != "32")
6453 return false;
6454
Toma Tabacu94ea6862015-06-16 13:54:13 +00006455 // FPXX shouldn't be used if either -msoft-float or -mfloat-abi=soft is
6456 // present.
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006457 if (FloatABI == mips::FloatABI::Soft)
Toma Tabacu94ea6862015-06-16 13:54:13 +00006458 return false;
6459
Daniel Sanders379d44b2014-07-16 11:52:23 +00006460 return llvm::StringSwitch<bool>(CPUName)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006461 .Cases("mips2", "mips3", "mips4", "mips5", true)
6462 .Cases("mips32", "mips32r2", "mips32r3", "mips32r5", true)
6463 .Cases("mips64", "mips64r2", "mips64r3", "mips64r5", true)
6464 .Default(false);
Daniel Sanders379d44b2014-07-16 11:52:23 +00006465}
6466
Toma Tabacu94ea6862015-06-16 13:54:13 +00006467bool mips::shouldUseFPXX(const ArgList &Args, const llvm::Triple &Triple,
6468 StringRef CPUName, StringRef ABIName,
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00006469 mips::FloatABI FloatABI) {
Toma Tabacu94ea6862015-06-16 13:54:13 +00006470 bool UseFPXX = isFPXXDefault(Triple, CPUName, ABIName, FloatABI);
6471
6472 // FPXX shouldn't be used if -msingle-float is present.
6473 if (Arg *A = Args.getLastArg(options::OPT_msingle_float,
6474 options::OPT_mdouble_float))
6475 if (A->getOption().matches(options::OPT_msingle_float))
6476 UseFPXX = false;
6477
6478 return UseFPXX;
6479}
6480
Tim Northover157d9112014-01-16 08:48:16 +00006481llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006482 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
6483 // archs which Darwin doesn't use.
6484
6485 // The matching this routine does is fairly pointless, since it is neither the
6486 // complete architecture list, nor a reasonable subset. The problem is that
6487 // historically the driver driver accepts this and also ties its -march=
6488 // handling to the architecture name, so we need to be careful before removing
6489 // support for it.
6490
6491 // This code must be kept in sync with Clang's Darwin specific argument
6492 // translation.
6493
6494 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006495 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
6496 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
6497 .Case("ppc64", llvm::Triple::ppc64)
6498 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
6499 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
6500 llvm::Triple::x86)
6501 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
6502 // This is derived from the driver driver.
6503 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
6504 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
6505 .Cases("armv7s", "xscale", llvm::Triple::arm)
6506 .Case("arm64", llvm::Triple::aarch64)
6507 .Case("r600", llvm::Triple::r600)
6508 .Case("amdgcn", llvm::Triple::amdgcn)
6509 .Case("nvptx", llvm::Triple::nvptx)
6510 .Case("nvptx64", llvm::Triple::nvptx64)
6511 .Case("amdil", llvm::Triple::amdil)
6512 .Case("spir", llvm::Triple::spir)
6513 .Default(llvm::Triple::UnknownArch);
Rafael Espindoladcbf6982012-10-31 18:51:07 +00006514}
Tony Linthicum76329bf2011-12-12 21:14:55 +00006515
Tim Northover157d9112014-01-16 08:48:16 +00006516void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00006517 const llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
Tim Northover157d9112014-01-16 08:48:16 +00006518 T.setArch(Arch);
6519
6520 if (Str == "x86_64h")
6521 T.setArchName(Str);
6522 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
6523 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00006524 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00006525 }
6526}
6527
Bob Wilsondecc03e2012-11-23 06:14:39 +00006528const char *Clang::getBaseInputName(const ArgList &Args,
Artem Belevichba558952015-05-06 18:20:23 +00006529 const InputInfo &Input) {
6530 return Args.MakeArgString(llvm::sys::path::filename(Input.getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006531}
6532
Bob Wilsondecc03e2012-11-23 06:14:39 +00006533const char *Clang::getBaseInputStem(const ArgList &Args,
6534 const InputInfoList &Inputs) {
Artem Belevichba558952015-05-06 18:20:23 +00006535 const char *Str = getBaseInputName(Args, Inputs[0]);
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006536
Chris Lattner906bb902011-01-16 08:14:11 +00006537 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006538 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006539
6540 return Str;
6541}
6542
Bob Wilsondecc03e2012-11-23 06:14:39 +00006543const char *Clang::getDependencyFileName(const ArgList &Args,
6544 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006545 // FIXME: Think about this more.
6546 std::string Res;
6547
6548 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00006549 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006550 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006551 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00006552 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00006553 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00006554 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00006555}
6556
Douglas Katzman95354292015-06-23 20:42:09 +00006557void cloudabi::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6558 const InputInfo &Output,
6559 const InputInfoList &Inputs,
6560 const ArgList &Args,
6561 const char *LinkingOutput) const {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006562 const ToolChain &ToolChain = getToolChain();
6563 const Driver &D = ToolChain.getDriver();
6564 ArgStringList CmdArgs;
6565
6566 // Silence warning for "clang -g foo.o -o foo"
6567 Args.ClaimAllArgs(options::OPT_g_Group);
6568 // and "clang -emit-llvm foo.o -o foo"
6569 Args.ClaimAllArgs(options::OPT_emit_llvm);
6570 // and for "clang -w foo.o -o foo". Other warning options are already
6571 // handled somewhere else.
6572 Args.ClaimAllArgs(options::OPT_w);
6573
6574 if (!D.SysRoot.empty())
6575 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6576
6577 // CloudABI only supports static linkage.
6578 CmdArgs.push_back("-Bstatic");
6579 CmdArgs.push_back("--eh-frame-hdr");
6580 CmdArgs.push_back("--gc-sections");
6581
6582 if (Output.isFilename()) {
6583 CmdArgs.push_back("-o");
6584 CmdArgs.push_back(Output.getFilename());
6585 } else {
6586 assert(Output.isNothing() && "Invalid output.");
6587 }
6588
Douglas Katzman78b37b02015-11-17 20:28:07 +00006589 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006590 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt0.o")));
6591 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtbegin.o")));
6592 }
6593
6594 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00006595 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006596 Args.AddAllArgs(CmdArgs,
6597 {options::OPT_T_Group, options::OPT_e, options::OPT_s,
6598 options::OPT_t, options::OPT_Z_Flag, options::OPT_r});
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006599
Teresa Johnson945bc502015-10-15 20:35:53 +00006600 if (D.isUsingLTO())
6601 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006602
6603 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
6604
Douglas Katzman78b37b02015-11-17 20:28:07 +00006605 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006606 if (D.CCCIsCXX())
6607 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
6608 CmdArgs.push_back("-lc");
6609 CmdArgs.push_back("-lcompiler_rt");
6610 }
6611
Douglas Katzman78b37b02015-11-17 20:28:07 +00006612 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006613 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
6614
6615 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00006616 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Ed Schouten3c3e58c2015-03-26 11:13:44 +00006617}
6618
Douglas Katzman95354292015-06-23 20:42:09 +00006619void darwin::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
6620 const InputInfo &Output,
6621 const InputInfoList &Inputs,
6622 const ArgList &Args,
6623 const char *LinkingOutput) const {
Daniel Dunbarbe220842009-03-20 16:06:39 +00006624 ArgStringList CmdArgs;
6625
6626 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
6627 const InputInfo &Input = Inputs[0];
6628
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006629 // Determine the original source input.
6630 const Action *SourceAction = &JA;
6631 while (SourceAction->getKind() != Action::InputClass) {
6632 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
6633 SourceAction = SourceAction->getInputs()[0];
6634 }
6635
Eric Christopherf5a8f492015-12-08 00:10:10 +00006636 // If -fno-integrated-as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00006637 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00006638 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
6639 // FIXME: at run-time detect assembler capabilities or rely on version
Eric Christopherf5a8f492015-12-08 00:10:10 +00006640 // information forwarded by -target-assembler-version.
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00006641 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00006642 const llvm::Triple &T(getToolChain().getTriple());
6643 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00006644 CmdArgs.push_back("-Q");
6645 }
Kevin Enderby319baa42013-11-18 23:30:29 +00006646
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006647 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00006648 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00006649 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006650 if (Args.hasArg(options::OPT_gstabs))
6651 CmdArgs.push_back("--gstabs");
6652 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00006653 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00006654 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006655
Daniel Dunbarbe220842009-03-20 16:06:39 +00006656 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00006657 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006658
Daniel Dunbar6d484762010-07-22 01:47:22 +00006659 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006660 if (getToolChain().getArch() == llvm::Triple::x86 ||
6661 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00006662 Args.hasArg(options::OPT_force__cpusubtype__ALL))
6663 CmdArgs.push_back("-force_cpusubtype_ALL");
6664
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00006665 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006666 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00006667 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00006668 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00006669 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006670 CmdArgs.push_back("-static");
6671
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006672 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarbe220842009-03-20 16:06:39 +00006673
6674 assert(Output.isFilename() && "Unexpected lipo output.");
6675 CmdArgs.push_back("-o");
6676 CmdArgs.push_back(Output.getFilename());
6677
Daniel Dunbarb440f562010-08-02 02:38:21 +00006678 assert(Input.isFilename() && "Invalid input.");
6679 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00006680
6681 // asm_final spec is empty.
6682
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006683 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00006684 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00006685}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00006686
Tim Northover157d9112014-01-16 08:48:16 +00006687void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00006688
Tim Northover157d9112014-01-16 08:48:16 +00006689void darwin::MachOTool::AddMachOArch(const ArgList &Args,
6690 ArgStringList &CmdArgs) const {
6691 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006692
Daniel Dunbarc1964212009-03-26 16:23:12 +00006693 // Derived from darwin_arch spec.
6694 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006695 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006696
Daniel Dunbardcc3b652010-01-22 02:04:58 +00006697 // FIXME: Is this needed anymore?
6698 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00006699 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00006700}
6701
Douglas Katzman95354292015-06-23 20:42:09 +00006702bool darwin::Linker::NeedsTempPath(const InputInfoList &Inputs) const {
Bill Wendling3b2000f2012-10-02 18:02:50 +00006703 // We only need to generate a temp path for LTO if we aren't compiling object
6704 // files. When compiling source files, we run 'dsymutil' after linking. We
6705 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006706 for (const auto &Input : Inputs)
6707 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00006708 return true;
6709
6710 return false;
6711}
6712
Douglas Katzman95354292015-06-23 20:42:09 +00006713void darwin::Linker::AddLinkArgs(Compilation &C, const ArgList &Args,
6714 ArgStringList &CmdArgs,
6715 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00006716 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00006717 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00006718
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006719 unsigned Version[3] = {0, 0, 0};
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006720 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
6721 bool HadExtra;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006722 if (!Driver::GetReleaseVersion(A->getValue(), Version[0], Version[1],
6723 Version[2], HadExtra) ||
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006724 HadExtra)
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006725 D.Diag(diag::err_drv_invalid_version_number) << A->getAsString(Args);
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006726 }
6727
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006728 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006729 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00006730 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
6731 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00006732
Bob Wilson3d27dad2013-08-02 22:25:34 +00006733 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
6734 CmdArgs.push_back("-export_dynamic");
6735
Bob Wilsonb111ec92015-03-02 19:01:14 +00006736 // If we are using App Extension restrictions, pass a flag to the linker
6737 // telling it that the compiled code has been audited.
6738 if (Args.hasFlag(options::OPT_fapplication_extension,
6739 options::OPT_fno_application_extension, false))
6740 CmdArgs.push_back("-application_extension");
6741
Teresa Johnson945bc502015-10-15 20:35:53 +00006742 if (D.isUsingLTO()) {
Bruno Cardoso Lopesa5efe3a2015-10-02 15:10:33 +00006743 // If we are using LTO, then automatically create a temporary file path for
6744 // the linker to use, so that it's lifetime will extend past a possible
6745 // dsymutil step.
6746 if (Version[0] >= 116 && NeedsTempPath(Inputs)) {
6747 const char *TmpPath = C.getArgs().MakeArgString(
6748 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
6749 C.addTempFile(TmpPath);
6750 CmdArgs.push_back("-object_path_lto");
6751 CmdArgs.push_back(TmpPath);
6752 }
6753
6754 // Use -lto_library option to specify the libLTO.dylib path. Try to find
6755 // it in clang installed libraries. If not found, the option is not used
6756 // and 'ld' will use its default mechanism to search for libLTO.dylib.
6757 if (Version[0] >= 133) {
6758 // Search for libLTO in <InstalledDir>/../lib/libLTO.dylib
6759 StringRef P = llvm::sys::path::parent_path(D.getInstalledDir());
6760 SmallString<128> LibLTOPath(P);
6761 llvm::sys::path::append(LibLTOPath, "lib");
6762 llvm::sys::path::append(LibLTOPath, "libLTO.dylib");
6763 if (llvm::sys::fs::exists(LibLTOPath)) {
6764 CmdArgs.push_back("-lto_library");
6765 CmdArgs.push_back(C.getArgs().MakeArgString(LibLTOPath));
6766 } else {
6767 D.Diag(diag::warn_drv_lto_libpath);
6768 }
6769 }
Daniel Dunbaref889c72011-06-21 20:55:11 +00006770 }
6771
Daniel Dunbarc1964212009-03-26 16:23:12 +00006772 // Derived from the "link" spec.
6773 Args.AddAllArgs(CmdArgs, options::OPT_static);
6774 if (!Args.hasArg(options::OPT_static))
6775 CmdArgs.push_back("-dynamic");
6776 if (Args.hasArg(options::OPT_fgnu_runtime)) {
6777 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
6778 // here. How do we wish to handle such things?
6779 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006780
Daniel Dunbarc1964212009-03-26 16:23:12 +00006781 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00006782 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00006783 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00006784 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006785
6786 Args.AddLastArg(CmdArgs, options::OPT_bundle);
6787 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
6788 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
6789
6790 Arg *A;
6791 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
6792 (A = Args.getLastArg(options::OPT_current__version)) ||
6793 (A = Args.getLastArg(options::OPT_install__name)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006794 D.Diag(diag::err_drv_argument_only_allowed_with) << A->getAsString(Args)
6795 << "-dynamiclib";
Daniel Dunbarc1964212009-03-26 16:23:12 +00006796
6797 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
6798 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
6799 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
6800 } else {
6801 CmdArgs.push_back("-dylib");
6802
6803 Arg *A;
6804 if ((A = Args.getLastArg(options::OPT_bundle)) ||
6805 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
6806 (A = Args.getLastArg(options::OPT_client__name)) ||
6807 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
6808 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
6809 (A = Args.getLastArg(options::OPT_private__bundle)))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006810 D.Diag(diag::err_drv_argument_not_allowed_with) << A->getAsString(Args)
6811 << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006812
Daniel Dunbarc1964212009-03-26 16:23:12 +00006813 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
6814 "-dylib_compatibility_version");
6815 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
6816 "-dylib_current_version");
6817
Tim Northover157d9112014-01-16 08:48:16 +00006818 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006819
6820 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
6821 "-dylib_install_name");
6822 }
6823
6824 Args.AddLastArg(CmdArgs, options::OPT_all__load);
6825 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
6826 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00006827 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006828 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006829 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
6830 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
6831 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
6832 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
6833 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
6834 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00006835 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006836 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
6837 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
6838 Args.AddAllArgs(CmdArgs, options::OPT_init);
6839
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006840 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00006841 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00006842
Daniel Dunbarc1964212009-03-26 16:23:12 +00006843 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
6844 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
6845 Args.AddLastArg(CmdArgs, options::OPT_single__module);
6846 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
6847 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006848
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006849 if (const Arg *A =
6850 Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
6851 options::OPT_fno_pie, options::OPT_fno_PIE)) {
Daniel Dunbaraf68a882010-07-13 23:31:40 +00006852 if (A->getOption().matches(options::OPT_fpie) ||
6853 A->getOption().matches(options::OPT_fPIE))
6854 CmdArgs.push_back("-pie");
6855 else
6856 CmdArgs.push_back("-no_pie");
6857 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00006858
6859 Args.AddLastArg(CmdArgs, options::OPT_prebind);
6860 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
6861 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
6862 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
6863 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
6864 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
6865 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
6866 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
6867 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
6868 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
6869 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
6870 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
6871 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
6872 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
6873 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
6874 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006875
Daniel Dunbar84384642011-05-02 21:03:47 +00006876 // Give --sysroot= preference, over the Apple specific behavior to also use
6877 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00006878 StringRef sysroot = C.getSysRoot();
6879 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00006880 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00006881 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00006882 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
6883 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00006884 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006885 }
6886
Daniel Dunbarc1964212009-03-26 16:23:12 +00006887 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
6888 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
6889 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
6890 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
6891 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00006892 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006893 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
6894 Args.AddAllArgs(CmdArgs, options::OPT_y);
6895 Args.AddLastArg(CmdArgs, options::OPT_w);
6896 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
6897 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
6898 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
6899 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
6900 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
6901 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
6902 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
6903 Args.AddLastArg(CmdArgs, options::OPT_whyload);
6904 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
6905 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
6906 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
6907 Args.AddLastArg(CmdArgs, options::OPT_Mach);
6908}
6909
Douglas Katzman95354292015-06-23 20:42:09 +00006910void darwin::Linker::ConstructJob(Compilation &C, const JobAction &JA,
6911 const InputInfo &Output,
6912 const InputInfoList &Inputs,
6913 const ArgList &Args,
6914 const char *LinkingOutput) const {
Daniel Dunbarc1964212009-03-26 16:23:12 +00006915 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00006916
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006917 // If the number of arguments surpasses the system limits, we will encode the
6918 // input files in a separate file, shortening the command line. To this end,
6919 // build a list of input file names that can be passed via a file with the
6920 // -filelist linker option.
6921 llvm::opt::ArgStringList InputFileList;
6922
Daniel Dunbarc1964212009-03-26 16:23:12 +00006923 // The logic here is derived from gcc's behavior; most of which
6924 // comes from specs (starting with link_command). Consult gcc for
6925 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00006926 ArgStringList CmdArgs;
6927
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006928 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
6929 if (Args.hasArg(options::OPT_ccc_arcmt_check,
6930 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006931 for (const auto &Arg : Args)
6932 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006933 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00006934 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006935 CmdArgs.push_back(Output.getFilename());
Justin Bognerd3371d82015-07-17 03:35:54 +00006936 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, None));
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00006937 return;
6938 }
6939
Daniel Dunbarc1964212009-03-26 16:23:12 +00006940 // I'm not sure why this particular decomposition exists in gcc, but
6941 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00006942 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006943
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00006944 // It seems that the 'e' option is completely ignored for dynamic executables
6945 // (the default), and with static executables, the last one wins, as expected.
6946 Args.AddAllArgs(CmdArgs, {options::OPT_d_Flag, options::OPT_s, options::OPT_t,
6947 options::OPT_Z_Flag, options::OPT_u_Group,
6948 options::OPT_e, options::OPT_r});
Daniel Dunbarc1964212009-03-26 16:23:12 +00006949
Daniel Dunbar767bbab2010-10-18 22:08:36 +00006950 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
6951 // members of static archive libraries which implement Objective-C classes or
6952 // categories.
6953 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
6954 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006955
Daniel Dunbarc1964212009-03-26 16:23:12 +00006956 CmdArgs.push_back("-o");
6957 CmdArgs.push_back(Output.getFilename());
6958
Douglas Katzman78b37b02015-11-17 20:28:07 +00006959 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles))
Tim Northover157d9112014-01-16 08:48:16 +00006960 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00006961
Peter Collingbournec4122c12015-06-15 21:08:13 +00006962 // SafeStack requires its own runtime libraries
6963 // These libraries should be linked first, to make sure the
6964 // __safestack_init constructor executes before everything else
6965 if (getToolChain().getSanitizerArgs().needsSafeStackRt()) {
6966 getMachOToolChain().AddLinkRuntimeLib(Args, CmdArgs,
6967 "libclang_rt.safestack_osx.a",
6968 /*AlwaysLink=*/true);
6969 }
6970
Daniel Dunbarc1964212009-03-26 16:23:12 +00006971 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006972
Douglas Gregor9295df02012-05-15 21:00:27 +00006973 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00006974 // Build the input file for -filelist (list of linker input files) in case we
6975 // need it later
6976 for (const auto &II : Inputs) {
6977 if (!II.isFilename()) {
6978 // This is a linker input argument.
6979 // We cannot mix input arguments and file names in a -filelist input, thus
6980 // we prematurely stop our list (remaining files shall be passed as
6981 // arguments).
6982 if (InputFileList.size() > 0)
6983 break;
6984
6985 continue;
6986 }
6987
6988 InputFileList.push_back(II.getFilename());
6989 }
6990
Douglas Katzman78b37b02015-11-17 20:28:07 +00006991 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs))
Joerg Sonnenberger5c3f9d52015-09-23 20:07:56 +00006992 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
6993
Douglas Katzman78b37b02015-11-17 20:28:07 +00006994 if (isObjCRuntimeLinked(Args) &&
6995 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00006996 // We use arclite library for both ARC and subscripting support.
6997 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
6998
Bob Wilson7dda0cd2012-04-21 00:21:42 +00006999 CmdArgs.push_back("-framework");
7000 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00007001 // Link libobj.
7002 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00007003 }
John McCall31168b02011-06-15 23:02:42 +00007004
Daniel Dunbarc1964212009-03-26 16:23:12 +00007005 if (LinkingOutput) {
7006 CmdArgs.push_back("-arch_multiple");
7007 CmdArgs.push_back("-final_output");
7008 CmdArgs.push_back(LinkingOutput);
7009 }
7010
Daniel Dunbarc1964212009-03-26 16:23:12 +00007011 if (Args.hasArg(options::OPT_fnested_functions))
7012 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007013
Justin Bognerc7701242015-05-12 05:44:36 +00007014 getMachOToolChain().addProfileRTLibs(Args, CmdArgs);
7015
Douglas Katzman78b37b02015-11-17 20:28:07 +00007016 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007017 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007018 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00007019
Daniel Dunbarc1964212009-03-26 16:23:12 +00007020 // link_ssp spec is empty.
7021
Daniel Dunbar26d482a2009-09-18 08:15:03 +00007022 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00007023 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00007024 }
7025
Douglas Katzman78b37b02015-11-17 20:28:07 +00007026 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarc1964212009-03-26 16:23:12 +00007027 // endfile_spec is empty.
7028 }
7029
7030 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7031 Args.AddAllArgs(CmdArgs, options::OPT_F);
7032
Steven Wu3ffb61b2015-02-06 18:08:29 +00007033 // -iframework should be forwarded as -F.
Sean Silva14facf32015-06-09 01:57:17 +00007034 for (const Arg *A : Args.filtered(options::OPT_iframework))
7035 CmdArgs.push_back(Args.MakeArgString(std::string("-F") + A->getValue()));
Steven Wu3ffb61b2015-02-06 18:08:29 +00007036
Douglas Katzman78b37b02015-11-17 20:28:07 +00007037 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Michael Zolotukhind0cf6c82015-03-17 22:13:05 +00007038 if (Arg *A = Args.getLastArg(options::OPT_fveclib)) {
7039 if (A->getValue() == StringRef("Accelerate")) {
7040 CmdArgs.push_back("-framework");
7041 CmdArgs.push_back("Accelerate");
7042 }
7043 }
7044 }
7045
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007046 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007047 std::unique_ptr<Command> Cmd =
Justin Bognerd3371d82015-07-17 03:35:54 +00007048 llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs);
Reid Kleckner0290c9c2014-09-15 17:45:39 +00007049 Cmd->setInputFileList(std::move(InputFileList));
7050 C.addCommand(std::move(Cmd));
Daniel Dunbarc1964212009-03-26 16:23:12 +00007051}
7052
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007053void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007054 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00007055 const InputInfoList &Inputs,
7056 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007057 const char *LinkingOutput) const {
7058 ArgStringList CmdArgs;
7059
7060 CmdArgs.push_back("-create");
7061 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007062
7063 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007064 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00007065
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007066 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007067 assert(II.isFilename() && "Unexpected lipo input.");
7068 CmdArgs.push_back(II.getFilename());
7069 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007070
7071 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007072 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00007073}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007074
Daniel Dunbar88299622010-06-04 18:28:36 +00007075void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007076 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00007077 const InputInfoList &Inputs,
7078 const ArgList &Args,
7079 const char *LinkingOutput) const {
7080 ArgStringList CmdArgs;
7081
Daniel Dunbareb86b042011-05-09 17:23:16 +00007082 CmdArgs.push_back("-o");
7083 CmdArgs.push_back(Output.getFilename());
7084
Daniel Dunbar88299622010-06-04 18:28:36 +00007085 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7086 const InputInfo &Input = Inputs[0];
7087 assert(Input.isFilename() && "Unexpected dsymutil input.");
7088 CmdArgs.push_back(Input.getFilename());
7089
Daniel Dunbar88299622010-06-04 18:28:36 +00007090 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007091 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007092 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar88299622010-06-04 18:28:36 +00007093}
7094
Eric Christopher551ef452011-08-23 17:56:55 +00007095void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00007096 const InputInfo &Output,
7097 const InputInfoList &Inputs,
7098 const ArgList &Args,
7099 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00007100 ArgStringList CmdArgs;
7101 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00007102 CmdArgs.push_back("--debug-info");
7103 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00007104 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00007105
7106 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
7107 const InputInfo &Input = Inputs[0];
7108 assert(Input.isFilename() && "Unexpected verify input");
7109
7110 // Grabbing the output of the earlier dsymutil run.
7111 CmdArgs.push_back(Input.getFilename());
7112
7113 const char *Exec =
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007114 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007115 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher551ef452011-08-23 17:56:55 +00007116}
7117
Douglas Katzman95354292015-06-23 20:42:09 +00007118void solaris::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
David Chisnallf571cde2012-02-15 13:39:01 +00007119 const InputInfo &Output,
7120 const InputInfoList &Inputs,
7121 const ArgList &Args,
7122 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007123 claimNoWarnArgs(Args);
David Chisnallf571cde2012-02-15 13:39:01 +00007124 ArgStringList CmdArgs;
7125
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007126 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
David Chisnallf571cde2012-02-15 13:39:01 +00007127
7128 CmdArgs.push_back("-o");
7129 CmdArgs.push_back(Output.getFilename());
7130
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007131 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00007132 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00007133
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007134 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007135 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007136}
7137
Douglas Katzman95354292015-06-23 20:42:09 +00007138void solaris::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7139 const InputInfo &Output,
7140 const InputInfoList &Inputs,
7141 const ArgList &Args,
7142 const char *LinkingOutput) const {
David Chisnallf571cde2012-02-15 13:39:01 +00007143 ArgStringList CmdArgs;
7144
David Chisnall272a0712012-02-29 15:06:12 +00007145 // Demangle C++ names in errors
7146 CmdArgs.push_back("-C");
7147
Douglas Katzman78b37b02015-11-17 20:28:07 +00007148 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
David Chisnallf571cde2012-02-15 13:39:01 +00007149 CmdArgs.push_back("-e");
7150 CmdArgs.push_back("_start");
7151 }
7152
7153 if (Args.hasArg(options::OPT_static)) {
7154 CmdArgs.push_back("-Bstatic");
7155 CmdArgs.push_back("-dn");
7156 } else {
7157 CmdArgs.push_back("-Bdynamic");
7158 if (Args.hasArg(options::OPT_shared)) {
7159 CmdArgs.push_back("-shared");
7160 } else {
7161 CmdArgs.push_back("--dynamic-linker");
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007162 CmdArgs.push_back(
7163 Args.MakeArgString(getToolChain().GetFilePath("ld.so.1")));
David Chisnallf571cde2012-02-15 13:39:01 +00007164 }
7165 }
7166
7167 if (Output.isFilename()) {
7168 CmdArgs.push_back("-o");
7169 CmdArgs.push_back(Output.getFilename());
7170 } else {
7171 assert(Output.isNothing() && "Invalid output.");
7172 }
7173
Douglas Katzman78b37b02015-11-17 20:28:07 +00007174 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007175 if (!Args.hasArg(options::OPT_shared))
7176 CmdArgs.push_back(
7177 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7178
7179 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7180 CmdArgs.push_back(
7181 Args.MakeArgString(getToolChain().GetFilePath("values-Xa.o")));
7182 CmdArgs.push_back(
7183 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007184 }
7185
Douglas Katzman6059ef92015-11-17 17:41:23 +00007186 getToolChain().AddFilePathLibArgs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007187
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007188 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7189 options::OPT_e, options::OPT_r});
David Chisnallf571cde2012-02-15 13:39:01 +00007190
7191 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7192
Douglas Katzman78b37b02015-11-17 20:28:07 +00007193 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007194 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00007195 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00007196 CmdArgs.push_back("-lgcc_s");
Rafael Espindola8d4d9d2f2015-09-14 19:30:53 +00007197 CmdArgs.push_back("-lc");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007198 if (!Args.hasArg(options::OPT_shared)) {
7199 CmdArgs.push_back("-lgcc");
David Chisnallc73fb892012-02-28 20:06:45 +00007200 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00007201 }
David Chisnallf571cde2012-02-15 13:39:01 +00007202 }
7203
Douglas Katzman78b37b02015-11-17 20:28:07 +00007204 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007205 CmdArgs.push_back(
7206 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007207 }
Rafael Espindolac53c5b12015-08-31 19:17:51 +00007208 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
David Chisnallf571cde2012-02-15 13:39:01 +00007209
Xinliang David Li69306c02015-10-22 06:15:31 +00007210 getToolChain().addProfileRTLibs(Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00007211
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007212 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007213 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
David Chisnallf571cde2012-02-15 13:39:01 +00007214}
7215
Douglas Katzman95354292015-06-23 20:42:09 +00007216void openbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7217 const InputInfo &Output,
7218 const InputInfoList &Inputs,
7219 const ArgList &Args,
7220 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007221 claimNoWarnArgs(Args);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007222 ArgStringList CmdArgs;
7223
Rafael Espindolacc126272014-02-28 01:55:21 +00007224 switch (getToolChain().getArch()) {
7225 case llvm::Triple::x86:
7226 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
7227 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007228 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00007229 break;
7230
7231 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007232 CmdArgs.push_back("-mppc");
7233 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00007234 break;
7235
7236 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007237 case llvm::Triple::sparcel: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007238 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007239 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7240 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7241 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007242 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007243 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007244
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007245 case llvm::Triple::sparcv9: {
Rafael Espindolacc126272014-02-28 01:55:21 +00007246 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007247 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7248 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
7249 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007250 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007251 }
Rafael Espindolacc126272014-02-28 01:55:21 +00007252
7253 case llvm::Triple::mips64:
7254 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007255 StringRef CPUName;
7256 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007257 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007258
7259 CmdArgs.push_back("-mabi");
7260 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7261
7262 if (getToolChain().getArch() == llvm::Triple::mips64)
7263 CmdArgs.push_back("-EB");
7264 else
7265 CmdArgs.push_back("-EL");
7266
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007267 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Rafael Espindolacc126272014-02-28 01:55:21 +00007268 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007269 }
7270
Rafael Espindolacc126272014-02-28 01:55:21 +00007271 default:
7272 break;
7273 }
7274
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007275 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007276
7277 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007278 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007279
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007280 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007281 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007282
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007283 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007284 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007285}
7286
Douglas Katzman95354292015-06-23 20:42:09 +00007287void openbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7288 const InputInfo &Output,
7289 const InputInfoList &Inputs,
7290 const ArgList &Args,
7291 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00007292 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007293 ArgStringList CmdArgs;
7294
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00007295 // Silence warning for "clang -g foo.o -o foo"
7296 Args.ClaimAllArgs(options::OPT_g_Group);
7297 // and "clang -emit-llvm foo.o -o foo"
7298 Args.ClaimAllArgs(options::OPT_emit_llvm);
7299 // and for "clang -w foo.o -o foo". Other warning options are already
7300 // handled somewhere else.
7301 Args.ClaimAllArgs(options::OPT_w);
7302
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00007303 if (getToolChain().getArch() == llvm::Triple::mips64)
7304 CmdArgs.push_back("-EB");
7305 else if (getToolChain().getArch() == llvm::Triple::mips64el)
7306 CmdArgs.push_back("-EL");
7307
Douglas Katzman78b37b02015-11-17 20:28:07 +00007308 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007309 CmdArgs.push_back("-e");
7310 CmdArgs.push_back("__start");
7311 }
7312
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007313 if (Args.hasArg(options::OPT_static)) {
7314 CmdArgs.push_back("-Bstatic");
7315 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007316 if (Args.hasArg(options::OPT_rdynamic))
7317 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007318 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007319 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007320 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007321 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007322 } else {
7323 CmdArgs.push_back("-dynamic-linker");
7324 CmdArgs.push_back("/usr/libexec/ld.so");
7325 }
7326 }
7327
Rafael Espindola044f7832013-06-05 04:28:55 +00007328 if (Args.hasArg(options::OPT_nopie))
7329 CmdArgs.push_back("-nopie");
7330
Daniel Dunbarb440f562010-08-02 02:38:21 +00007331 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007332 CmdArgs.push_back("-o");
7333 CmdArgs.push_back(Output.getFilename());
7334 } else {
7335 assert(Output.isNothing() && "Invalid output.");
7336 }
7337
Douglas Katzman78b37b02015-11-17 20:28:07 +00007338 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007339 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007340 if (Args.hasArg(options::OPT_pg))
7341 CmdArgs.push_back(
7342 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman3715d1f2011-12-15 02:15:56 +00007343 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007344 CmdArgs.push_back(
7345 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7346 CmdArgs.push_back(
7347 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007348 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007349 CmdArgs.push_back(
7350 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007351 }
7352 }
7353
Edward O'Callaghan5c521462009-10-28 15:13:08 +00007354 std::string Triple = getToolChain().getTripleString();
7355 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007356 Triple.replace(0, 6, "amd64");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007357 CmdArgs.push_back(
7358 Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple + "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007359
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007360 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
7361 options::OPT_e, options::OPT_s, options::OPT_t,
7362 options::OPT_Z_Flag, options::OPT_r});
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007363
Daniel Dunbar54423b22010-09-17 00:24:54 +00007364 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007365
Douglas Katzman78b37b02015-11-17 20:28:07 +00007366 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007367 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007368 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007369 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00007370 CmdArgs.push_back("-lm_p");
7371 else
7372 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00007373 }
7374
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007375 // FIXME: For some reason GCC passes -lgcc before adding
7376 // the default system libraries. Just mimic this for now.
7377 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007378
Eric Christopher17674ec2012-09-13 06:32:34 +00007379 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007380 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
7381 CmdArgs.push_back("-lpthread_p");
Eric Christopher17674ec2012-09-13 06:32:34 +00007382 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007383 CmdArgs.push_back("-lpthread");
Eric Christopher17674ec2012-09-13 06:32:34 +00007384 }
7385
Chandler Carruth45661652011-12-17 22:32:42 +00007386 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00007387 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007388 CmdArgs.push_back("-lc_p");
Eli Friedman3715d1f2011-12-15 02:15:56 +00007389 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007390 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00007391 }
Eric Christopher17674ec2012-09-13 06:32:34 +00007392
Daniel Dunbara8888ac2009-08-03 01:28:59 +00007393 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007394 }
7395
Douglas Katzman78b37b02015-11-17 20:28:07 +00007396 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007397 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007398 CmdArgs.push_back(
7399 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007400 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007401 CmdArgs.push_back(
7402 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007403 }
7404
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007405 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007406 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00007407}
Ed Schoutene33194b2009-04-02 19:13:12 +00007408
Douglas Katzman95354292015-06-23 20:42:09 +00007409void bitrig::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7410 const InputInfo &Output,
7411 const InputInfoList &Inputs,
7412 const ArgList &Args,
7413 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007414 claimNoWarnArgs(Args);
Eli Friedman9fa28852012-08-08 23:57:20 +00007415 ArgStringList CmdArgs;
7416
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007417 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Eli Friedman9fa28852012-08-08 23:57:20 +00007418
7419 CmdArgs.push_back("-o");
7420 CmdArgs.push_back(Output.getFilename());
7421
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007422 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00007423 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00007424
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007425 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007426 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007427}
7428
Douglas Katzman95354292015-06-23 20:42:09 +00007429void bitrig::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7430 const InputInfo &Output,
7431 const InputInfoList &Inputs,
7432 const ArgList &Args,
7433 const char *LinkingOutput) const {
Eli Friedman9fa28852012-08-08 23:57:20 +00007434 const Driver &D = getToolChain().getDriver();
7435 ArgStringList CmdArgs;
7436
Douglas Katzman78b37b02015-11-17 20:28:07 +00007437 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_shared)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007438 CmdArgs.push_back("-e");
7439 CmdArgs.push_back("__start");
7440 }
7441
7442 if (Args.hasArg(options::OPT_static)) {
7443 CmdArgs.push_back("-Bstatic");
7444 } else {
7445 if (Args.hasArg(options::OPT_rdynamic))
7446 CmdArgs.push_back("-export-dynamic");
7447 CmdArgs.push_back("--eh-frame-hdr");
7448 CmdArgs.push_back("-Bdynamic");
7449 if (Args.hasArg(options::OPT_shared)) {
7450 CmdArgs.push_back("-shared");
7451 } else {
7452 CmdArgs.push_back("-dynamic-linker");
7453 CmdArgs.push_back("/usr/libexec/ld.so");
7454 }
7455 }
7456
7457 if (Output.isFilename()) {
7458 CmdArgs.push_back("-o");
7459 CmdArgs.push_back(Output.getFilename());
7460 } else {
7461 assert(Output.isNothing() && "Invalid output.");
7462 }
7463
Douglas Katzman78b37b02015-11-17 20:28:07 +00007464 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007465 if (!Args.hasArg(options::OPT_shared)) {
7466 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007467 CmdArgs.push_back(
7468 Args.MakeArgString(getToolChain().GetFilePath("gcrt0.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007469 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007470 CmdArgs.push_back(
7471 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
7472 CmdArgs.push_back(
7473 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007474 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007475 CmdArgs.push_back(
7476 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007477 }
7478 }
7479
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00007480 Args.AddAllArgs(CmdArgs,
7481 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Eli Friedman9fa28852012-08-08 23:57:20 +00007482
7483 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7484
Douglas Katzman78b37b02015-11-17 20:28:07 +00007485 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007486 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007487 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
7488 if (Args.hasArg(options::OPT_pg))
7489 CmdArgs.push_back("-lm_p");
7490 else
7491 CmdArgs.push_back("-lm");
7492 }
7493
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007494 if (Args.hasArg(options::OPT_pthread)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007495 if (!Args.hasArg(options::OPT_shared) && Args.hasArg(options::OPT_pg))
Rafael Espindola1ad26f02012-10-23 17:07:31 +00007496 CmdArgs.push_back("-lpthread_p");
7497 else
7498 CmdArgs.push_back("-lpthread");
7499 }
7500
Eli Friedman9fa28852012-08-08 23:57:20 +00007501 if (!Args.hasArg(options::OPT_shared)) {
7502 if (Args.hasArg(options::OPT_pg))
7503 CmdArgs.push_back("-lc_p");
7504 else
7505 CmdArgs.push_back("-lc");
7506 }
7507
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007508 StringRef MyArch;
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007509 switch (getToolChain().getArch()) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00007510 case llvm::Triple::arm:
7511 MyArch = "arm";
7512 break;
7513 case llvm::Triple::x86:
7514 MyArch = "i386";
7515 break;
7516 case llvm::Triple::x86_64:
7517 MyArch = "amd64";
7518 break;
7519 default:
7520 llvm_unreachable("Unsupported architecture");
7521 }
7522 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00007523 }
7524
Douglas Katzman78b37b02015-11-17 20:28:07 +00007525 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman9fa28852012-08-08 23:57:20 +00007526 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007527 CmdArgs.push_back(
7528 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007529 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007530 CmdArgs.push_back(
7531 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
Eli Friedman9fa28852012-08-08 23:57:20 +00007532 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00007533
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007534 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007535 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eli Friedman9fa28852012-08-08 23:57:20 +00007536}
7537
Douglas Katzman95354292015-06-23 20:42:09 +00007538void freebsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
7539 const InputInfo &Output,
7540 const InputInfoList &Inputs,
7541 const ArgList &Args,
7542 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007543 claimNoWarnArgs(Args);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007544 ArgStringList CmdArgs;
7545
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007546 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7547 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007548 switch (getToolChain().getArch()) {
7549 default:
7550 break;
7551 case llvm::Triple::x86:
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007552 CmdArgs.push_back("--32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007553 break;
7554 case llvm::Triple::ppc:
Roman Divacky00859c22011-06-04 07:37:31 +00007555 CmdArgs.push_back("-a32");
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007556 break;
7557 case llvm::Triple::mips:
7558 case llvm::Triple::mipsel:
7559 case llvm::Triple::mips64:
7560 case llvm::Triple::mips64el: {
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007561 StringRef CPUName;
7562 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007563 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00007564
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007565 CmdArgs.push_back("-march");
7566 CmdArgs.push_back(CPUName.data());
7567
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007568 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00007569 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007570
7571 if (getToolChain().getArch() == llvm::Triple::mips ||
7572 getToolChain().getArch() == llvm::Triple::mips64)
7573 CmdArgs.push_back("-EB");
7574 else
7575 CmdArgs.push_back("-EL");
7576
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007577 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007578 break;
7579 }
7580 case llvm::Triple::arm:
7581 case llvm::Triple::armeb:
7582 case llvm::Triple::thumb:
7583 case llvm::Triple::thumbeb: {
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00007584 arm::FloatABI ABI = arm::getARMFloatABI(getToolChain(), Args);
Renato Golinf4421f72014-02-19 10:44:07 +00007585
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007586 if (ABI == arm::FloatABI::Hard)
Renato Golinf4421f72014-02-19 10:44:07 +00007587 CmdArgs.push_back("-mfpu=vfp");
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00007588 else
Renato Golinf4421f72014-02-19 10:44:07 +00007589 CmdArgs.push_back("-mfpu=softvfp");
Renato Golinf4421f72014-02-19 10:44:07 +00007590
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007591 switch (getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00007592 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007593 case llvm::Triple::GNUEABI:
7594 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00007595 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00007596 break;
7597
7598 default:
7599 CmdArgs.push_back("-matpcs");
7600 }
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007601 break;
7602 }
7603 case llvm::Triple::sparc:
7604 case llvm::Triple::sparcel:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007605 case llvm::Triple::sparcv9: {
7606 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7607 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007608 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger9d3e4f62015-11-10 00:23:12 +00007609 break;
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00007610 }
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00007611 }
Eric Christopher0b26a612010-03-02 02:41:08 +00007612
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007613 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007614
7615 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007616 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007617
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007618 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007619 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007620
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007621 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00007622 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00007623}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007624
Douglas Katzman95354292015-06-23 20:42:09 +00007625void freebsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7626 const InputInfo &Output,
7627 const InputInfoList &Inputs,
7628 const ArgList &Args,
7629 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007630 const toolchains::FreeBSD &ToolChain =
7631 static_cast<const toolchains::FreeBSD &>(getToolChain());
Roman Divackyafe2f232012-08-28 15:09:03 +00007632 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007633 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007634 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007635 !Args.hasArg(options::OPT_shared) &&
7636 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007637 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00007638
7639 // Silence warning for "clang -g foo.o -o foo"
7640 Args.ClaimAllArgs(options::OPT_g_Group);
7641 // and "clang -emit-llvm foo.o -o foo"
7642 Args.ClaimAllArgs(options::OPT_emit_llvm);
7643 // and for "clang -w foo.o -o foo". Other warning options are already
7644 // handled somewhere else.
7645 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007646
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007647 if (!D.SysRoot.empty())
7648 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7649
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007650 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007651 CmdArgs.push_back("-pie");
7652
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007653 if (Args.hasArg(options::OPT_static)) {
7654 CmdArgs.push_back("-Bstatic");
7655 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00007656 if (Args.hasArg(options::OPT_rdynamic))
7657 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007658 CmdArgs.push_back("--eh-frame-hdr");
7659 if (Args.hasArg(options::OPT_shared)) {
7660 CmdArgs.push_back("-Bshareable");
7661 } else {
7662 CmdArgs.push_back("-dynamic-linker");
7663 CmdArgs.push_back("/libexec/ld-elf.so.1");
7664 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007665 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
David Chisnall5f99f482012-07-29 15:24:44 +00007666 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
7667 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
7668 CmdArgs.push_back("--hash-style=both");
7669 }
7670 }
7671 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007672 }
7673
7674 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
7675 // instruct ld in the base system to link 32-bit code.
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007676 if (Arch == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007677 CmdArgs.push_back("-m");
7678 CmdArgs.push_back("elf_i386_fbsd");
7679 }
7680
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00007681 if (Arch == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00007682 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00007683 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00007684 }
7685
Daniel Dunbarb440f562010-08-02 02:38:21 +00007686 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007687 CmdArgs.push_back("-o");
7688 CmdArgs.push_back(Output.getFilename());
7689 } else {
7690 assert(Output.isNothing() && "Invalid output.");
7691 }
7692
Douglas Katzman78b37b02015-11-17 20:28:07 +00007693 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007694 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007695 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007696 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00007697 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007698 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007699 crt1 = "Scrt1.o";
7700 else
7701 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007702 }
Roman Divackyafe2f232012-08-28 15:09:03 +00007703 if (crt1)
7704 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
7705
7706 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7707
Craig Topper92fc2df2014-05-17 16:56:41 +00007708 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00007709 if (Args.hasArg(options::OPT_static))
7710 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007711 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007712 crtbegin = "crtbeginS.o";
7713 else
7714 crtbegin = "crtbegin.o";
7715
7716 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007717 }
7718
7719 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00007720 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007721 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7722 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00007723 Args.AddAllArgs(CmdArgs, options::OPT_s);
7724 Args.AddAllArgs(CmdArgs, options::OPT_t);
7725 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
7726 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007727
Teresa Johnson945bc502015-10-15 20:35:53 +00007728 if (D.isUsingLTO())
7729 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Roman Divackyf0d7f942013-11-10 09:31:43 +00007730
Alexey Samsonov52550342014-09-15 19:58:40 +00007731 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Roman Divackyafe2f232012-08-28 15:09:03 +00007732 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007733
Douglas Katzman78b37b02015-11-17 20:28:07 +00007734 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Dimitry Andric0cc6f472015-10-18 13:32:20 +00007735 addOpenMPRuntime(CmdArgs, ToolChain, Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00007736 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00007737 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00007738 if (Args.hasArg(options::OPT_pg))
7739 CmdArgs.push_back("-lm_p");
7740 else
7741 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00007742 }
Alexey Samsonov52550342014-09-15 19:58:40 +00007743 if (NeedsSanitizerDeps)
7744 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007745 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
7746 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00007747 if (Args.hasArg(options::OPT_pg))
7748 CmdArgs.push_back("-lgcc_p");
7749 else
7750 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007751 if (Args.hasArg(options::OPT_static)) {
7752 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007753 } else if (Args.hasArg(options::OPT_pg)) {
7754 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007755 } else {
7756 CmdArgs.push_back("--as-needed");
7757 CmdArgs.push_back("-lgcc_s");
7758 CmdArgs.push_back("--no-as-needed");
7759 }
7760
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007761 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00007762 if (Args.hasArg(options::OPT_pg))
7763 CmdArgs.push_back("-lpthread_p");
7764 else
7765 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00007766 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007767
Roman Divacky66f22762011-02-10 16:59:40 +00007768 if (Args.hasArg(options::OPT_pg)) {
7769 if (Args.hasArg(options::OPT_shared))
7770 CmdArgs.push_back("-lc");
7771 else
7772 CmdArgs.push_back("-lc_p");
7773 CmdArgs.push_back("-lgcc_p");
7774 } else {
7775 CmdArgs.push_back("-lc");
7776 CmdArgs.push_back("-lgcc");
7777 }
7778
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007779 if (Args.hasArg(options::OPT_static)) {
7780 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00007781 } else if (Args.hasArg(options::OPT_pg)) {
7782 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007783 } else {
7784 CmdArgs.push_back("--as-needed");
7785 CmdArgs.push_back("-lgcc_s");
7786 CmdArgs.push_back("--no-as-needed");
7787 }
7788 }
7789
Douglas Katzman78b37b02015-11-17 20:28:07 +00007790 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00007791 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00007792 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00007793 else
7794 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00007795 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007796 }
7797
Xinliang David Li69306c02015-10-22 06:15:31 +00007798 ToolChain.addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007799
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007800 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00007801 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00007802}
Daniel Dunbarcc912342009-05-02 18:28:39 +00007803
Douglas Katzman95354292015-06-23 20:42:09 +00007804void netbsd::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007805 const InputInfo &Output,
7806 const InputInfoList &Inputs,
7807 const ArgList &Args,
7808 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00007809 claimNoWarnArgs(Args);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007810 ArgStringList CmdArgs;
7811
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007812 // GNU as needs different flags for creating the correct output format
7813 // on architectures with different ABIs or optional feature sets.
7814 switch (getToolChain().getArch()) {
7815 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007816 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007817 break;
7818 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007819 case llvm::Triple::armeb:
7820 case llvm::Triple::thumb:
7821 case llvm::Triple::thumbeb: {
Renato Goline17c5802015-07-27 23:44:42 +00007822 StringRef MArch, MCPU;
Renato Golin7c542b42015-07-27 23:44:45 +00007823 getARMArchCPUFromArgs(Args, MArch, MCPU, /*FromAs*/ true);
7824 std::string Arch =
7825 arm::getARMTargetCPU(MCPU, MArch, getToolChain().getTriple());
Renato Goline17c5802015-07-27 23:44:42 +00007826 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + Arch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007827 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00007828 }
7829
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007830 case llvm::Triple::mips:
7831 case llvm::Triple::mipsel:
7832 case llvm::Triple::mips64:
7833 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007834 StringRef CPUName;
7835 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00007836 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007837
7838 CmdArgs.push_back("-march");
7839 CmdArgs.push_back(CPUName.data());
7840
7841 CmdArgs.push_back("-mabi");
7842 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
7843
7844 if (getToolChain().getArch() == llvm::Triple::mips ||
7845 getToolChain().getArch() == llvm::Triple::mips64)
7846 CmdArgs.push_back("-EB");
7847 else
7848 CmdArgs.push_back("-EL");
7849
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007850 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007851 break;
7852 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007853
7854 case llvm::Triple::sparc:
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007855 case llvm::Triple::sparcel: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007856 CmdArgs.push_back("-32");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007857 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7858 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007859 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007860 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007861 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007862
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007863 case llvm::Triple::sparcv9: {
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007864 CmdArgs.push_back("-64");
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007865 std::string CPU = getCPUName(Args, getToolChain().getTriple());
7866 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
James Y Knight5bdf7ab2015-08-19 15:12:02 +00007867 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007868 break;
Joerg Sonnenbergerec353d32015-11-09 23:39:45 +00007869 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007870
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00007871 default:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007872 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00007873 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007874
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007875 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007876
7877 CmdArgs.push_back("-o");
7878 CmdArgs.push_back(Output.getFilename());
7879
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007880 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007881 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007882
David Chisnallddbd68f2011-09-27 22:03:18 +00007883 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Justin Bognerd3371d82015-07-17 03:35:54 +00007884 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007885}
7886
Douglas Katzman95354292015-06-23 20:42:09 +00007887void netbsd::Linker::ConstructJob(Compilation &C, const JobAction &JA,
7888 const InputInfo &Output,
7889 const InputInfoList &Inputs,
7890 const ArgList &Args,
7891 const char *LinkingOutput) const {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007892 const Driver &D = getToolChain().getDriver();
7893 ArgStringList CmdArgs;
7894
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007895 if (!D.SysRoot.empty())
7896 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7897
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00007898 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007899 if (Args.hasArg(options::OPT_static)) {
7900 CmdArgs.push_back("-Bstatic");
7901 } else {
7902 if (Args.hasArg(options::OPT_rdynamic))
7903 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007904 if (Args.hasArg(options::OPT_shared)) {
7905 CmdArgs.push_back("-Bshareable");
7906 } else {
7907 CmdArgs.push_back("-dynamic-linker");
7908 CmdArgs.push_back("/libexec/ld.elf_so");
7909 }
7910 }
7911
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007912 // Many NetBSD architectures support more than one ABI.
7913 // Determine the correct emulation for ld.
7914 switch (getToolChain().getArch()) {
7915 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007916 CmdArgs.push_back("-m");
7917 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007918 break;
7919 case llvm::Triple::arm:
7920 case llvm::Triple::thumb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007921 CmdArgs.push_back("-m");
7922 switch (getToolChain().getTriple().getEnvironment()) {
7923 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007924 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007925 CmdArgs.push_back("armelf_nbsd_eabi");
7926 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00007927 case llvm::Triple::EABIHF:
7928 case llvm::Triple::GNUEABIHF:
7929 CmdArgs.push_back("armelf_nbsd_eabihf");
7930 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007931 default:
7932 CmdArgs.push_back("armelf_nbsd");
7933 break;
7934 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007935 break;
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007936 case llvm::Triple::armeb:
7937 case llvm::Triple::thumbeb:
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007938 arm::appendEBLinkFlags(
7939 Args, CmdArgs,
John Brawn94fd9632015-05-21 12:19:49 +00007940 llvm::Triple(getToolChain().ComputeEffectiveClangTriple(Args)));
Joerg Sonnenbergerb7045342014-08-14 19:12:41 +00007941 CmdArgs.push_back("-m");
7942 switch (getToolChain().getTriple().getEnvironment()) {
7943 case llvm::Triple::EABI:
7944 case llvm::Triple::GNUEABI:
7945 CmdArgs.push_back("armelfb_nbsd_eabi");
7946 break;
7947 case llvm::Triple::EABIHF:
7948 case llvm::Triple::GNUEABIHF:
7949 CmdArgs.push_back("armelfb_nbsd_eabihf");
7950 break;
7951 default:
7952 CmdArgs.push_back("armelfb_nbsd");
7953 break;
7954 }
7955 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007956 case llvm::Triple::mips64:
7957 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007958 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00007959 CmdArgs.push_back("-m");
7960 if (getToolChain().getArch() == llvm::Triple::mips64)
7961 CmdArgs.push_back("elf32btsmip");
7962 else
7963 CmdArgs.push_back("elf32ltsmip");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00007964 } else if (mips::hasMipsAbiArg(Args, "64")) {
7965 CmdArgs.push_back("-m");
7966 if (getToolChain().getArch() == llvm::Triple::mips64)
7967 CmdArgs.push_back("elf64btsmip");
7968 else
7969 CmdArgs.push_back("elf64ltsmip");
7970 }
7971 break;
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00007972 case llvm::Triple::ppc:
7973 CmdArgs.push_back("-m");
7974 CmdArgs.push_back("elf32ppc_nbsd");
7975 break;
7976
7977 case llvm::Triple::ppc64:
7978 case llvm::Triple::ppc64le:
7979 CmdArgs.push_back("-m");
7980 CmdArgs.push_back("elf64ppc");
7981 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00007982
7983 case llvm::Triple::sparc:
7984 CmdArgs.push_back("-m");
7985 CmdArgs.push_back("elf32_sparc");
7986 break;
7987
7988 case llvm::Triple::sparcv9:
7989 CmdArgs.push_back("-m");
7990 CmdArgs.push_back("elf64_sparc");
7991 break;
7992
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00007993 default:
7994 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00007995 }
7996
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00007997 if (Output.isFilename()) {
7998 CmdArgs.push_back("-o");
7999 CmdArgs.push_back(Output.getFilename());
8000 } else {
8001 assert(Output.isNothing() && "Invalid output.");
8002 }
8003
Douglas Katzman78b37b02015-11-17 20:28:07 +00008004 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008005 if (!Args.hasArg(options::OPT_shared)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008006 CmdArgs.push_back(
8007 Args.MakeArgString(getToolChain().GetFilePath("crt0.o")));
8008 CmdArgs.push_back(
8009 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8010 CmdArgs.push_back(
8011 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008012 } else {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008013 CmdArgs.push_back(
8014 Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8015 CmdArgs.push_back(
8016 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008017 }
8018 }
8019
8020 Args.AddAllArgs(CmdArgs, options::OPT_L);
8021 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
8022 Args.AddAllArgs(CmdArgs, options::OPT_e);
8023 Args.AddAllArgs(CmdArgs, options::OPT_s);
8024 Args.AddAllArgs(CmdArgs, options::OPT_t);
8025 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
8026 Args.AddAllArgs(CmdArgs, options::OPT_r);
8027
8028 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
8029
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008030 unsigned Major, Minor, Micro;
8031 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
8032 bool useLibgcc = true;
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008033 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 49) || Major == 0) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008034 switch (getToolChain().getArch()) {
Joerg Sonnenberger323cea92014-08-09 18:28:36 +00008035 case llvm::Triple::aarch64:
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00008036 case llvm::Triple::arm:
8037 case llvm::Triple::armeb:
8038 case llvm::Triple::thumb:
8039 case llvm::Triple::thumbeb:
Joerg Sonnenbergerc8887572014-07-25 20:57:24 +00008040 case llvm::Triple::ppc:
Joerg Sonnenbergerdd13b302014-08-13 14:17:32 +00008041 case llvm::Triple::ppc64:
8042 case llvm::Triple::ppc64le:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008043 case llvm::Triple::x86:
8044 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008045 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00008046 break;
8047 default:
8048 break;
8049 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008050 }
8051
Douglas Katzman78b37b02015-11-17 20:28:07 +00008052 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Joerg Sonnenberger27a69a22015-09-23 20:11:00 +00008053 addOpenMPRuntime(CmdArgs, getToolChain(), Args);
Hans Wennborg70850d82013-07-18 20:29:38 +00008054 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008055 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
8056 CmdArgs.push_back("-lm");
8057 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008058 if (Args.hasArg(options::OPT_pthread))
8059 CmdArgs.push_back("-lpthread");
8060 CmdArgs.push_back("-lc");
8061
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00008062 if (useLibgcc) {
8063 if (Args.hasArg(options::OPT_static)) {
8064 // libgcc_eh depends on libc, so resolve as much as possible,
8065 // pull in any new requirements from libc and then get the rest
8066 // of libgcc.
8067 CmdArgs.push_back("-lgcc_eh");
8068 CmdArgs.push_back("-lc");
8069 CmdArgs.push_back("-lgcc");
8070 } else {
8071 CmdArgs.push_back("-lgcc");
8072 CmdArgs.push_back("--as-needed");
8073 CmdArgs.push_back("-lgcc_s");
8074 CmdArgs.push_back("--no-as-needed");
8075 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008076 }
8077 }
8078
Douglas Katzman78b37b02015-11-17 20:28:07 +00008079 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008080 if (!Args.hasArg(options::OPT_shared))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008081 CmdArgs.push_back(
8082 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008083 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008084 CmdArgs.push_back(
8085 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
8086 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008087 }
8088
Xinliang David Li69306c02015-10-22 06:15:31 +00008089 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00008090
Logan Chieneb9162f2014-06-26 14:23:45 +00008091 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008092 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00008093}
8094
Douglas Katzman95354292015-06-23 20:42:09 +00008095void gnutools::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8096 const InputInfo &Output,
8097 const InputInfoList &Inputs,
8098 const ArgList &Args,
8099 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008100 claimNoWarnArgs(Args);
8101
James Y Knight2db38f32015-08-15 03:45:25 +00008102 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8103 llvm::Triple Triple = llvm::Triple(TripleStr);
8104
Rafael Espindola92b00932010-08-10 00:25:48 +00008105 ArgStringList CmdArgs;
8106
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008107 llvm::Reloc::Model RelocationModel;
8108 unsigned PICLevel;
8109 bool IsPIE;
8110 std::tie(RelocationModel, PICLevel, IsPIE) =
8111 ParsePICArgs(getToolChain(), Triple, Args);
8112
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008113 switch (getToolChain().getArch()) {
8114 default:
8115 break;
Rafael Espindola92b00932010-08-10 00:25:48 +00008116 // Add --32/--64 to make sure we get the format we want.
8117 // This is incomplete
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008118 case llvm::Triple::x86:
Rafael Espindola92b00932010-08-10 00:25:48 +00008119 CmdArgs.push_back("--32");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008120 break;
8121 case llvm::Triple::x86_64:
Zinovy Nis1db95732014-07-10 15:27:19 +00008122 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::GNUX32)
8123 CmdArgs.push_back("--x32");
8124 else
8125 CmdArgs.push_back("--64");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008126 break;
8127 case llvm::Triple::ppc:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008128 CmdArgs.push_back("-a32");
8129 CmdArgs.push_back("-mppc");
8130 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008131 break;
8132 case llvm::Triple::ppc64:
Eli Friedman4a4932c2011-11-28 23:46:52 +00008133 CmdArgs.push_back("-a64");
8134 CmdArgs.push_back("-mppc64");
8135 CmdArgs.push_back("-many");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008136 break;
8137 case llvm::Triple::ppc64le:
Bill Schmidt778d3872013-07-26 01:36:11 +00008138 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008139 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00008140 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00008141 CmdArgs.push_back("-mlittle-endian");
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008142 break;
8143 case llvm::Triple::sparc:
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008144 case llvm::Triple::sparcel: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008145 CmdArgs.push_back("-32");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008146 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8147 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8148 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008149 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008150 }
8151 case llvm::Triple::sparcv9: {
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00008152 CmdArgs.push_back("-64");
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008153 std::string CPU = getCPUName(Args, getToolChain().getTriple());
8154 CmdArgs.push_back(getSparcAsmModeForCPU(CPU, getToolChain().getTriple()));
8155 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008156 break;
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008157 }
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008158 case llvm::Triple::arm:
8159 case llvm::Triple::armeb:
8160 case llvm::Triple::thumb:
8161 case llvm::Triple::thumbeb: {
James Y Knight2db38f32015-08-15 03:45:25 +00008162 const llvm::Triple &Triple2 = getToolChain().getTriple();
8163 switch (Triple2.getSubArch()) {
Scott Douglass3205f522015-03-23 10:54:24 +00008164 case llvm::Triple::ARMSubArch_v7:
Rafael Espindola92b00932010-08-10 00:25:48 +00008165 CmdArgs.push_back("-mfpu=neon");
Scott Douglass3205f522015-03-23 10:54:24 +00008166 break;
8167 case llvm::Triple::ARMSubArch_v8:
Bernard Ogdena58ef052013-10-24 18:32:41 +00008168 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Scott Douglass3205f522015-03-23 10:54:24 +00008169 break;
8170 default:
8171 break;
8172 }
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00008173
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008174 switch (arm::getARMFloatABI(getToolChain(), Args)) {
Saleem Abdulrasooleee54b42015-09-18 05:32:23 +00008175 case arm::FloatABI::Invalid: llvm_unreachable("must have an ABI!");
8176 case arm::FloatABI::Soft:
8177 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=soft"));
8178 break;
8179 case arm::FloatABI::SoftFP:
8180 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=softfp"));
8181 break;
8182 case arm::FloatABI::Hard:
8183 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=hard"));
8184 break;
8185 }
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008186
8187 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00008188
8189 // FIXME: remove krait check when GNU tools support krait cpu
8190 // for now replace it with -march=armv7-a to avoid a lower
8191 // march from being picked in the absence of a cpu flag.
8192 Arg *A;
8193 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008194 StringRef(A->getValue()).lower() == "krait")
8195 CmdArgs.push_back("-march=armv7-a");
Ana Pazosdd6068d2013-12-06 22:43:17 +00008196 else
8197 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00008198 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008199 break;
8200 }
8201 case llvm::Triple::mips:
8202 case llvm::Triple::mipsel:
8203 case llvm::Triple::mips64:
8204 case llvm::Triple::mips64el: {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008205 StringRef CPUName;
8206 StringRef ABIName;
Simon Atanasyan7018e1d2014-07-16 12:29:22 +00008207 mips::getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Daniel Sanders379d44b2014-07-16 11:52:23 +00008208 ABIName = getGnuCompatibleMipsABIName(ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00008209
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008210 CmdArgs.push_back("-march");
8211 CmdArgs.push_back(CPUName.data());
8212
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00008213 CmdArgs.push_back("-mabi");
Daniel Sanders379d44b2014-07-16 11:52:23 +00008214 CmdArgs.push_back(ABIName.data());
8215
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008216 // -mno-shared should be emitted unless -fpic, -fpie, -fPIC, -fPIE,
8217 // or -mshared (not implemented) is in effect.
James Y Knight5bdf7ab2015-08-19 15:12:02 +00008218 if (RelocationModel == llvm::Reloc::Static)
Daniel Sanders54d8ee62014-07-23 12:06:13 +00008219 CmdArgs.push_back("-mno-shared");
8220
Daniel Sanders379d44b2014-07-16 11:52:23 +00008221 // LLVM doesn't support -mplt yet and acts as if it is always given.
8222 // However, -mplt has no effect with the N64 ABI.
8223 CmdArgs.push_back(ABIName == "64" ? "-KPIC" : "-call_nonpic");
Simon Atanasyan2390aa12012-04-06 19:15:24 +00008224
8225 if (getToolChain().getArch() == llvm::Triple::mips ||
8226 getToolChain().getArch() == llvm::Triple::mips64)
8227 CmdArgs.push_back("-EB");
8228 else
8229 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00008230
Simon Atanasyan22127ce2013-09-24 09:09:16 +00008231 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
8232 if (StringRef(A->getValue()) == "2008")
8233 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
8234 }
8235
Daniel Sanders379d44b2014-07-16 11:52:23 +00008236 // Add the last -mfp32/-mfpxx/-mfp64 or -mfpxx if it is enabled by default.
8237 if (Arg *A = Args.getLastArg(options::OPT_mfp32, options::OPT_mfpxx,
8238 options::OPT_mfp64)) {
8239 A->claim();
8240 A->render(Args, CmdArgs);
Saleem Abdulrasoold5556e32015-09-19 04:33:38 +00008241 } else if (mips::shouldUseFPXX(
8242 Args, getToolChain().getTriple(), CPUName, ABIName,
8243 getMipsFloatABI(getToolChain().getDriver(), Args)))
Daniel Sanders379d44b2014-07-16 11:52:23 +00008244 CmdArgs.push_back("-mfpxx");
8245
8246 // Pass on -mmips16 or -mno-mips16. However, the assembler equivalent of
8247 // -mno-mips16 is actually -no-mips16.
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008248 if (Arg *A =
8249 Args.getLastArg(options::OPT_mips16, options::OPT_mno_mips16)) {
Daniel Sanders379d44b2014-07-16 11:52:23 +00008250 if (A->getOption().matches(options::OPT_mips16)) {
8251 A->claim();
8252 A->render(Args, CmdArgs);
8253 } else {
8254 A->claim();
8255 CmdArgs.push_back("-no-mips16");
8256 }
8257 }
8258
Simon Atanasyan036d16d2013-04-30 07:47:13 +00008259 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
8260 options::OPT_mno_micromips);
8261 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
8262 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
8263
Simon Atanasyanbd986632013-11-26 11:58:04 +00008264 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
8265 // Do not use AddLastArg because not all versions of MIPS assembler
8266 // support -mmsa / -mno-msa options.
8267 if (A->getOption().matches(options::OPT_mmsa))
8268 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
8269 }
8270
Daniel Sanders379d44b2014-07-16 11:52:23 +00008271 Args.AddLastArg(CmdArgs, options::OPT_mhard_float,
8272 options::OPT_msoft_float);
8273
Toma Tabacub36d6102015-06-11 12:13:18 +00008274 Args.AddLastArg(CmdArgs, options::OPT_mdouble_float,
8275 options::OPT_msingle_float);
8276
Daniel Sanders379d44b2014-07-16 11:52:23 +00008277 Args.AddLastArg(CmdArgs, options::OPT_modd_spreg,
8278 options::OPT_mno_odd_spreg);
8279
Joerg Sonnenberger5c1ac902015-11-10 00:40:29 +00008280 AddAssemblerKPIC(getToolChain(), Args, CmdArgs);
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008281 break;
8282 }
8283 case llvm::Triple::systemz: {
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008284 // Always pass an -march option, since our default of z10 is later
8285 // than the GNU assembler's default.
8286 StringRef CPUName = getSystemZTargetCPU(Args);
8287 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
Scott Douglassd4cfffc2015-03-23 10:46:28 +00008288 break;
8289 }
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00008290 }
8291
Renato Golina74bbc72015-07-22 15:32:36 +00008292 Args.AddAllArgs(CmdArgs, options::OPT_I);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008293 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Rafael Espindola92b00932010-08-10 00:25:48 +00008294
8295 CmdArgs.push_back("-o");
8296 CmdArgs.push_back(Output.getFilename());
8297
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008298 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00008299 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00008300
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008301 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008302 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00008303
8304 // Handle the debug info splitting at object creation time if we're
8305 // creating an object.
8306 // TODO: Currently only works on linux with newer objcopy.
8307 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00008308 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00008309 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
Artem Belevichba558952015-05-06 18:20:23 +00008310 SplitDebugName(Args, Inputs[0]));
Rafael Espindola92b00932010-08-10 00:25:48 +00008311}
8312
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00008313static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008314 ArgStringList &CmdArgs, const ArgList &Args) {
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008315 bool isAndroid = Triple.isAndroid();
Reid Kleckner0213a472015-07-22 16:01:38 +00008316 bool isCygMing = Triple.isOSCygMing();
Chandler Carruth58d6eb62013-03-04 02:07:55 +00008317 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
8318 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00008319 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008320 CmdArgs.push_back("-lgcc");
8321
Logan Chien3d3373c2012-11-19 12:04:11 +00008322 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008323 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008324 CmdArgs.push_back("-lgcc");
8325 } else {
Reid Kleckner0213a472015-07-22 16:01:38 +00008326 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008327 CmdArgs.push_back("--as-needed");
8328 CmdArgs.push_back("-lgcc_s");
Reid Kleckner0213a472015-07-22 16:01:38 +00008329 if (!D.CCCIsCXX() && !isCygMing)
Rafael Espindolacc354322011-10-17 21:39:04 +00008330 CmdArgs.push_back("--no-as-needed");
8331 }
8332
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008333 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00008334 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00008335 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00008336 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00008337
8338 // According to Android ABI, we have to link with libdl if we are
8339 // linking with non-static libgcc.
8340 //
8341 // NOTE: This fixes a link error on Android MIPS as well. The non-static
8342 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
8343 if (isAndroid && !StaticLibgcc)
8344 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00008345}
8346
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008347static std::string getLinuxDynamicLinker(const ArgList &Args,
8348 const toolchains::Linux &ToolChain) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008349 const llvm::Triple::ArchType Arch = ToolChain.getArch();
8350
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008351 if (ToolChain.getTriple().isAndroid()) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00008352 if (ToolChain.getTriple().isArch64Bit())
8353 return "/system/bin/linker64";
8354 else
8355 return "/system/bin/linker";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008356 } else if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::sparc ||
8357 Arch == llvm::Triple::sparcel)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008358 return "/lib/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008359 else if (Arch == llvm::Triple::aarch64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008360 return "/lib/ld-linux-aarch64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008361 else if (Arch == llvm::Triple::aarch64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00008362 return "/lib/ld-linux-aarch64_be.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008363 else if (Arch == llvm::Triple::arm || Arch == llvm::Triple::thumb) {
Renato Golin24ba3e92015-07-27 09:56:37 +00008364 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008365 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008366 return "/lib/ld-linux-armhf.so.3";
8367 else
8368 return "/lib/ld-linux.so.3";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008369 } else if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb) {
8370 // TODO: check which dynamic linker name.
Renato Golin24ba3e92015-07-27 09:56:37 +00008371 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF ||
Saleem Abdulrasool06f6f992015-09-19 20:40:16 +00008372 arm::getARMFloatABI(ToolChain, Args) == arm::FloatABI::Hard)
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008373 return "/lib/ld-linux-armhf.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00008374 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008375 return "/lib/ld-linux.so.3";
8376 } else if (Arch == llvm::Triple::mips || Arch == llvm::Triple::mipsel ||
8377 Arch == llvm::Triple::mips64 || Arch == llvm::Triple::mips64el) {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008378 std::string LibDir =
8379 "/lib" + mips::getMipsABILibSuffix(Args, ToolChain.getTriple());
Vasileios Kalintiris71b0dfe2015-10-30 11:28:39 +00008380 StringRef LibName;
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008381 bool IsNaN2008 = mips::isNaN2008(Args, ToolChain.getTriple());
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008382 if (mips::isUCLibc(Args))
8383 LibName = IsNaN2008 ? "ld-uClibc-mipsn8.so.0" : "ld-uClibc.so.0";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008384 else if (!ToolChain.getTriple().hasEnvironment()) {
8385 bool LE = (ToolChain.getTriple().getArch() == llvm::Triple::mipsel) ||
8386 (ToolChain.getTriple().getArch() == llvm::Triple::mips64el);
8387 LibName = LE ? "ld-musl-mipsel.so.1" : "ld-musl-mips.so.1";
8388 } else
Simon Atanasyand95c67d2014-08-13 14:34:14 +00008389 LibName = IsNaN2008 ? "ld-linux-mipsn8.so.1" : "ld.so.1";
Simon Atanasyan2c590ff2014-08-04 12:57:52 +00008390
8391 return (LibDir + "/" + LibName).str();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008392 } else if (Arch == llvm::Triple::ppc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008393 return "/lib/ld.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008394 else if (Arch == llvm::Triple::ppc64) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008395 if (ppc::hasPPCAbiArg(Args, "elfv2"))
8396 return "/lib64/ld64.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008397 return "/lib64/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008398 } else if (Arch == llvm::Triple::ppc64le) {
Ulrich Weigand8afad612014-07-28 13:17:52 +00008399 if (ppc::hasPPCAbiArg(Args, "elfv1"))
8400 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00008401 return "/lib64/ld64.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008402 } else if (Arch == llvm::Triple::systemz)
Sylvestre Ledruc0babf22015-08-28 12:26:09 +00008403 return "/lib/ld64.so.1";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008404 else if (Arch == llvm::Triple::sparcv9)
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00008405 return "/lib64/ld-linux.so.2";
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008406 else if (Arch == llvm::Triple::x86_64 &&
Zinovy Nis1db95732014-07-10 15:27:19 +00008407 ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUX32)
8408 return "/libx32/ld-linux-x32.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00008409 else
8410 return "/lib64/ld-linux-x86-64.so.2";
8411}
8412
Renato Golinc4b49242014-02-13 10:01:16 +00008413static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
Saleem Abdulrasool2e46ebe2014-12-30 22:52:06 +00008414 ArgStringList &CmdArgs, const ArgList &Args) {
Renato Golinc4b49242014-02-13 10:01:16 +00008415 // Make use of compiler-rt if --rtlib option is used
8416 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
8417
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008418 switch (RLT) {
Renato Golinc4b49242014-02-13 10:01:16 +00008419 case ToolChain::RLT_CompilerRT:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008420 switch (TC.getTriple().getOS()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008421 default:
8422 llvm_unreachable("unsupported OS");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008423 case llvm::Triple::Win32:
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008424 case llvm::Triple::Linux:
Saleem Abdulrasool8d7ade72014-12-30 02:10:36 +00008425 addClangRT(TC, Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00008426 break;
8427 }
Renato Golinc4b49242014-02-13 10:01:16 +00008428 break;
8429 case ToolChain::RLT_Libgcc:
8430 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
8431 break;
Renato Golinc4b49242014-02-13 10:01:16 +00008432 }
8433}
8434
Rafael Espindola1e085772014-08-15 17:14:35 +00008435static const char *getLDMOption(const llvm::Triple &T, const ArgList &Args) {
8436 switch (T.getArch()) {
8437 case llvm::Triple::x86:
8438 return "elf_i386";
8439 case llvm::Triple::aarch64:
8440 return "aarch64linux";
8441 case llvm::Triple::aarch64_be:
8442 return "aarch64_be_linux";
8443 case llvm::Triple::arm:
8444 case llvm::Triple::thumb:
8445 return "armelf_linux_eabi";
8446 case llvm::Triple::armeb:
8447 case llvm::Triple::thumbeb:
8448 return "armebelf_linux_eabi"; /* TODO: check which NAME. */
8449 case llvm::Triple::ppc:
8450 return "elf32ppclinux";
8451 case llvm::Triple::ppc64:
8452 return "elf64ppc";
8453 case llvm::Triple::ppc64le:
8454 return "elf64lppc";
8455 case llvm::Triple::sparc:
Douglas Katzmanf36dddf2015-05-11 15:21:44 +00008456 case llvm::Triple::sparcel:
Rafael Espindola1e085772014-08-15 17:14:35 +00008457 return "elf32_sparc";
8458 case llvm::Triple::sparcv9:
8459 return "elf64_sparc";
8460 case llvm::Triple::mips:
8461 return "elf32btsmip";
8462 case llvm::Triple::mipsel:
8463 return "elf32ltsmip";
8464 case llvm::Triple::mips64:
8465 if (mips::hasMipsAbiArg(Args, "n32"))
8466 return "elf32btsmipn32";
8467 return "elf64btsmip";
8468 case llvm::Triple::mips64el:
8469 if (mips::hasMipsAbiArg(Args, "n32"))
8470 return "elf32ltsmipn32";
8471 return "elf64ltsmip";
8472 case llvm::Triple::systemz:
8473 return "elf64_s390";
8474 case llvm::Triple::x86_64:
8475 if (T.getEnvironment() == llvm::Triple::GNUX32)
8476 return "elf32_x86_64";
8477 return "elf_x86_64";
8478 default:
8479 llvm_unreachable("Unexpected arch");
8480 }
8481}
8482
Douglas Katzman95354292015-06-23 20:42:09 +00008483void gnutools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8484 const InputInfo &Output,
8485 const InputInfoList &Inputs,
8486 const ArgList &Args,
8487 const char *LinkingOutput) const {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008488 const toolchains::Linux &ToolChain =
8489 static_cast<const toolchains::Linux &>(getToolChain());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008490 const Driver &D = ToolChain.getDriver();
James Y Knight2db38f32015-08-15 03:45:25 +00008491
8492 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
8493 llvm::Triple Triple = llvm::Triple(TripleStr);
8494
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008495 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Evgeniy Stepanov14deb7b2015-10-08 21:21:44 +00008496 const bool isAndroid = ToolChain.getTriple().isAndroid();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008497 const bool IsPIE =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008498 !Args.hasArg(options::OPT_shared) && !Args.hasArg(options::OPT_static) &&
8499 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008500 const bool HasCRTBeginEndFiles =
8501 ToolChain.getTriple().hasEnvironment() ||
8502 (ToolChain.getTriple().getVendor() != llvm::Triple::MipsTechnologies);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008503
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008504 ArgStringList CmdArgs;
8505
Rafael Espindolad1002f62010-11-15 18:28:16 +00008506 // Silence warning for "clang -g foo.o -o foo"
8507 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00008508 // and "clang -emit-llvm foo.o -o foo"
8509 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00008510 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00008511 // handled somewhere else.
8512 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00008513
Peter Collingbourne39719a72015-11-20 20:49:39 +00008514 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8515 if (llvm::sys::path::filename(Exec) == "lld") {
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008516 CmdArgs.push_back("-flavor");
Rafael Espindola156aac02015-11-16 09:12:12 +00008517 CmdArgs.push_back("old-gnu");
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008518 CmdArgs.push_back("-target");
8519 CmdArgs.push_back(Args.MakeArgString(getToolChain().getTripleString()));
8520 }
8521
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008522 if (!D.SysRoot.empty())
8523 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008524
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008525 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00008526 CmdArgs.push_back("-pie");
8527
Rafael Espindola1c76c592010-11-07 22:57:16 +00008528 if (Args.hasArg(options::OPT_rdynamic))
8529 CmdArgs.push_back("-export-dynamic");
8530
Rafael Espindola34d77dc2010-11-11 19:34:42 +00008531 if (Args.hasArg(options::OPT_s))
8532 CmdArgs.push_back("-s");
8533
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008534 if (Arch == llvm::Triple::armeb || Arch == llvm::Triple::thumbeb)
James Y Knight2db38f32015-08-15 03:45:25 +00008535 arm::appendEBLinkFlags(Args, CmdArgs, Triple);
Joerg Sonnenberger1689d3f2015-01-28 23:30:39 +00008536
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008537 for (const auto &Opt : ToolChain.ExtraOpts)
8538 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008539
8540 if (!Args.hasArg(options::OPT_static)) {
8541 CmdArgs.push_back("--eh-frame-hdr");
8542 }
8543
8544 CmdArgs.push_back("-m");
Rafael Espindola1e085772014-08-15 17:14:35 +00008545 CmdArgs.push_back(getLDMOption(ToolChain.getTriple(), Args));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008546
8547 if (Args.hasArg(options::OPT_static)) {
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008548 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8549 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008550 CmdArgs.push_back("-Bstatic");
8551 else
8552 CmdArgs.push_back("-static");
8553 } else if (Args.hasArg(options::OPT_shared)) {
8554 CmdArgs.push_back("-shared");
8555 }
8556
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008557 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::armeb ||
8558 Arch == llvm::Triple::thumb || Arch == llvm::Triple::thumbeb ||
NAKAMURA Takumi557fb622014-06-29 16:00:11 +00008559 (!Args.hasArg(options::OPT_static) &&
8560 !Args.hasArg(options::OPT_shared))) {
8561 CmdArgs.push_back("-dynamic-linker");
8562 CmdArgs.push_back(Args.MakeArgString(
8563 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
8564 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008565
8566 CmdArgs.push_back("-o");
8567 CmdArgs.push_back(Output.getFilename());
8568
Douglas Katzman78b37b02015-11-17 20:28:07 +00008569 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008570 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00008571 const char *crt1 = nullptr;
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008572 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopherac021742013-06-07 23:25:01 +00008573 if (Args.hasArg(options::OPT_pg))
8574 crt1 = "gcrt1.o";
8575 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008576 crt1 = "Scrt1.o";
8577 else
8578 crt1 = "crt1.o";
8579 }
8580 if (crt1)
8581 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008582
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008583 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8584 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008585
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008586 const char *crtbegin;
8587 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008588 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008589 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008590 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008591 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008592 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008593 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008594 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008595
8596 if (HasCRTBeginEndFiles)
8597 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00008598
8599 // Add crtfastmath.o if available and fast math is enabled.
8600 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008601 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008602
8603 Args.AddAllArgs(CmdArgs, options::OPT_L);
Reid Kleckner69071442014-06-26 01:08:54 +00008604 Args.AddAllArgs(CmdArgs, options::OPT_u);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008605
Douglas Katzman6059ef92015-11-17 17:41:23 +00008606 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008607
Teresa Johnson945bc502015-10-15 20:35:53 +00008608 if (D.isUsingLTO())
8609 AddGoldPlugin(ToolChain, Args, CmdArgs, D.getLTOMode() == LTOK_Thin);
Chandler Carruth953fb082013-01-13 11:46:33 +00008610
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00008611 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8612 CmdArgs.push_back("--no-demangle");
8613
Alexey Samsonov52550342014-09-15 19:58:40 +00008614 bool NeedsSanitizerDeps = addSanitizerRuntimes(ToolChain, Args, CmdArgs);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008615 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008616 // The profile runtime also needs access to system libraries.
Xinliang David Li69306c02015-10-22 06:15:31 +00008617 getToolChain().addProfileRTLibs(Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00008618
Douglas Katzman78b37b02015-11-17 20:28:07 +00008619 if (D.CCCIsCXX() &&
8620 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00008621 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008622 !Args.hasArg(options::OPT_static);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008623 if (OnlyLibstdcxxStatic)
8624 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008625 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00008626 if (OnlyLibstdcxxStatic)
8627 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008628 CmdArgs.push_back("-lm");
8629 }
Chandler Carruth7e7dd472015-03-07 10:01:29 +00008630 // Silence warnings when linking C code with a C++ '-stdlib' argument.
8631 Args.ClaimAllArgs(options::OPT_stdlib_EQ);
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008632
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008633 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00008634 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8635 if (Args.hasArg(options::OPT_static))
8636 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00008637
Alexey Samsonov52550342014-09-15 19:58:40 +00008638 if (NeedsSanitizerDeps)
8639 linkSanitizerRuntimeDeps(ToolChain, CmdArgs);
8640
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008641 bool WantPthread = Args.hasArg(options::OPT_pthread) ||
8642 Args.hasArg(options::OPT_pthreads);
8643
8644 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
8645 options::OPT_fno_openmp, false)) {
8646 // OpenMP runtimes implies pthreads when using the GNU toolchain.
8647 // FIXME: Does this really make sense for all GNU toolchains?
8648 WantPthread = true;
8649
8650 // Also link the particular OpenMP runtimes.
8651 switch (getOpenMPRuntime(ToolChain, Args)) {
8652 case OMPRT_OMP:
8653 CmdArgs.push_back("-lomp");
8654 break;
8655 case OMPRT_GOMP:
Richard Smith31d1de22015-05-20 22:48:44 +00008656 CmdArgs.push_back("-lgomp");
8657
8658 // FIXME: Exclude this for platforms with libgomp that don't require
8659 // librt. Most modern Linux platforms require it, but some may not.
8660 CmdArgs.push_back("-lrt");
8661 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008662 case OMPRT_IOMP5:
Richard Smith31d1de22015-05-20 22:48:44 +00008663 CmdArgs.push_back("-liomp5");
8664 break;
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008665 case OMPRT_Unknown:
8666 // Already diagnosed.
Richard Smith31d1de22015-05-20 22:48:44 +00008667 break;
8668 }
Chandler Carruth01538002013-01-17 13:19:29 +00008669 }
Chandler Carruth9c6b4f82015-05-28 01:52:38 +00008670
Renato Golinc4b49242014-02-13 10:01:16 +00008671 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008672
Richard Smith31d1de22015-05-20 22:48:44 +00008673 if (WantPthread && !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00008674 CmdArgs.push_back("-lpthread");
8675
8676 CmdArgs.push_back("-lc");
8677
8678 if (Args.hasArg(options::OPT_static))
8679 CmdArgs.push_back("--end-group");
8680 else
Renato Golinc4b49242014-02-13 10:01:16 +00008681 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00008682 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00008683
Rafael Espindola81937ec2010-12-01 01:52:43 +00008684 if (!Args.hasArg(options::OPT_nostartfiles)) {
8685 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008686 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008687 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00008688 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00008689 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00008690 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008691 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00008692
Vasileios Kalintirisc744e122015-11-12 15:26:54 +00008693 if (HasCRTBeginEndFiles)
8694 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00008695 if (!isAndroid)
8696 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00008697 }
Sumanth Gundapanenib79fdff2015-12-02 19:12:41 +00008698 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00008699
Peter Collingbourne39719a72015-11-20 20:49:39 +00008700 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasoola4a474b2014-06-29 06:11:14 +00008701}
8702
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008703// NaCl ARM assembly (inline or standalone) can be written with a set of macros
8704// for the various SFI requirements like register masking. The assembly tool
8705// inserts the file containing the macros as an input into all the assembly
8706// jobs.
Douglas Katzman95354292015-06-23 20:42:09 +00008707void nacltools::AssemblerARM::ConstructJob(Compilation &C, const JobAction &JA,
8708 const InputInfo &Output,
8709 const InputInfoList &Inputs,
8710 const ArgList &Args,
8711 const char *LinkingOutput) const {
Douglas Katzman54366072015-07-27 16:53:08 +00008712 const toolchains::NaClToolChain &ToolChain =
8713 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008714 InputInfo NaClMacros(ToolChain.GetNaClArmMacrosPath(), types::TY_PP_Asm,
8715 "nacl-arm-macros.s");
8716 InputInfoList NewInputs;
8717 NewInputs.push_back(NaClMacros);
8718 NewInputs.append(Inputs.begin(), Inputs.end());
Douglas Katzman95354292015-06-23 20:42:09 +00008719 gnutools::Assembler::ConstructJob(C, JA, Output, NewInputs, Args,
8720 LinkingOutput);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008721}
8722
Douglas Katzman750cfc52015-06-29 18:42:16 +00008723// This is quite similar to gnutools::Linker::ConstructJob with changes that
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008724// we use static by default, do not yet support sanitizers or LTO, and a few
8725// others. Eventually we can support more of that and hopefully migrate back
Douglas Katzman750cfc52015-06-29 18:42:16 +00008726// to gnutools::Linker.
Douglas Katzman95354292015-06-23 20:42:09 +00008727void nacltools::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8728 const InputInfo &Output,
8729 const InputInfoList &Inputs,
8730 const ArgList &Args,
8731 const char *LinkingOutput) const {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008732
Douglas Katzman54366072015-07-27 16:53:08 +00008733 const toolchains::NaClToolChain &ToolChain =
8734 static_cast<const toolchains::NaClToolChain &>(getToolChain());
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008735 const Driver &D = ToolChain.getDriver();
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008736 const llvm::Triple::ArchType Arch = ToolChain.getArch();
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008737 const bool IsStatic =
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008738 !Args.hasArg(options::OPT_dynamic) && !Args.hasArg(options::OPT_shared);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008739
8740 ArgStringList CmdArgs;
8741
8742 // Silence warning for "clang -g foo.o -o foo"
8743 Args.ClaimAllArgs(options::OPT_g_Group);
8744 // and "clang -emit-llvm foo.o -o foo"
8745 Args.ClaimAllArgs(options::OPT_emit_llvm);
8746 // and for "clang -w foo.o -o foo". Other warning options are already
8747 // handled somewhere else.
8748 Args.ClaimAllArgs(options::OPT_w);
8749
8750 if (!D.SysRoot.empty())
8751 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8752
8753 if (Args.hasArg(options::OPT_rdynamic))
8754 CmdArgs.push_back("-export-dynamic");
8755
8756 if (Args.hasArg(options::OPT_s))
8757 CmdArgs.push_back("-s");
8758
Douglas Katzman54366072015-07-27 16:53:08 +00008759 // NaClToolChain doesn't have ExtraOpts like Linux; the only relevant flag
8760 // from there is --build-id, which we do want.
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008761 CmdArgs.push_back("--build-id");
8762
8763 if (!IsStatic)
8764 CmdArgs.push_back("--eh-frame-hdr");
8765
8766 CmdArgs.push_back("-m");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008767 if (Arch == llvm::Triple::x86)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008768 CmdArgs.push_back("elf_i386_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008769 else if (Arch == llvm::Triple::arm)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008770 CmdArgs.push_back("armelf_nacl");
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008771 else if (Arch == llvm::Triple::x86_64)
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008772 CmdArgs.push_back("elf_x86_64_nacl");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008773 else if (Arch == llvm::Triple::mipsel)
8774 CmdArgs.push_back("mipselelf_nacl");
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008775 else
Douglas Katzmanfe77e0d2015-06-04 00:15:00 +00008776 D.Diag(diag::err_target_unsupported_arch) << ToolChain.getArchName()
8777 << "Native Client";
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008778
8779 if (IsStatic)
8780 CmdArgs.push_back("-static");
8781 else if (Args.hasArg(options::OPT_shared))
8782 CmdArgs.push_back("-shared");
8783
8784 CmdArgs.push_back("-o");
8785 CmdArgs.push_back(Output.getFilename());
Douglas Katzman78b37b02015-11-17 20:28:07 +00008786 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008787 if (!Args.hasArg(options::OPT_shared))
8788 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crt1.o")));
8789 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
8790
8791 const char *crtbegin;
8792 if (IsStatic)
8793 crtbegin = "crtbeginT.o";
8794 else if (Args.hasArg(options::OPT_shared))
8795 crtbegin = "crtbeginS.o";
8796 else
8797 crtbegin = "crtbegin.o";
8798 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
8799 }
8800
8801 Args.AddAllArgs(CmdArgs, options::OPT_L);
8802 Args.AddAllArgs(CmdArgs, options::OPT_u);
8803
Douglas Katzman6059ef92015-11-17 17:41:23 +00008804 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008805
8806 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
8807 CmdArgs.push_back("--no-demangle");
8808
8809 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
8810
Douglas Katzman78b37b02015-11-17 20:28:07 +00008811 if (D.CCCIsCXX() &&
8812 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008813 bool OnlyLibstdcxxStatic =
8814 Args.hasArg(options::OPT_static_libstdcxx) && !IsStatic;
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008815 if (OnlyLibstdcxxStatic)
8816 CmdArgs.push_back("-Bstatic");
8817 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
8818 if (OnlyLibstdcxxStatic)
8819 CmdArgs.push_back("-Bdynamic");
8820 CmdArgs.push_back("-lm");
8821 }
8822
8823 if (!Args.hasArg(options::OPT_nostdlib)) {
8824 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
8825 // Always use groups, since it has no effect on dynamic libraries.
8826 CmdArgs.push_back("--start-group");
8827 CmdArgs.push_back("-lc");
8828 // NaCl's libc++ currently requires libpthread, so just always include it
8829 // in the group for C++.
8830 if (Args.hasArg(options::OPT_pthread) ||
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008831 Args.hasArg(options::OPT_pthreads) || D.CCCIsCXX()) {
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008832 // Gold, used by Mips, handles nested groups differently than ld, and
8833 // without '-lnacl' it prefers symbols from libpthread.a over libnacl.a,
8834 // which is not a desired behaviour here.
8835 // See https://sourceware.org/ml/binutils/2015-03/msg00034.html
8836 if (getToolChain().getArch() == llvm::Triple::mipsel)
8837 CmdArgs.push_back("-lnacl");
8838
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008839 CmdArgs.push_back("-lpthread");
8840 }
8841
8842 CmdArgs.push_back("-lgcc");
8843 CmdArgs.push_back("--as-needed");
8844 if (IsStatic)
8845 CmdArgs.push_back("-lgcc_eh");
8846 else
8847 CmdArgs.push_back("-lgcc_s");
8848 CmdArgs.push_back("--no-as-needed");
Petar Jovanovic26a4a402015-07-08 13:07:31 +00008849
8850 // Mips needs to create and use pnacl_legacy library that contains
8851 // definitions from bitcode/pnaclmm.c and definitions for
8852 // __nacl_tp_tls_offset() and __nacl_tp_tdb_offset().
8853 if (getToolChain().getArch() == llvm::Triple::mipsel)
8854 CmdArgs.push_back("-lpnacl_legacy");
8855
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008856 CmdArgs.push_back("--end-group");
8857 }
8858
8859 if (!Args.hasArg(options::OPT_nostartfiles)) {
8860 const char *crtend;
8861 if (Args.hasArg(options::OPT_shared))
8862 crtend = "crtendS.o";
8863 else
8864 crtend = "crtend.o";
8865
8866 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
8867 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
8868 }
8869 }
8870
Peter Collingbourne39719a72015-11-20 20:49:39 +00008871 const char *Exec = Args.MakeArgString(ToolChain.GetLinkerPath());
8872 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Derek Schuff6ab52fa2015-03-30 20:31:33 +00008873}
8874
Douglas Katzman95354292015-06-23 20:42:09 +00008875void minix::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8876 const InputInfo &Output,
8877 const InputInfoList &Inputs,
8878 const ArgList &Args,
8879 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008880 claimNoWarnArgs(Args);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008881 ArgStringList CmdArgs;
8882
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008883 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008884
8885 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008886 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008887
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008888 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008889 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00008890
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008891 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008892 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008893}
8894
Douglas Katzman95354292015-06-23 20:42:09 +00008895void minix::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8896 const InputInfo &Output,
8897 const InputInfoList &Inputs,
8898 const ArgList &Args,
8899 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008900 const Driver &D = getToolChain().getDriver();
8901 ArgStringList CmdArgs;
8902
Daniel Dunbarb440f562010-08-02 02:38:21 +00008903 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00008904 CmdArgs.push_back("-o");
8905 CmdArgs.push_back(Output.getFilename());
8906 } else {
8907 assert(Output.isNothing() && "Invalid output.");
8908 }
8909
Douglas Katzman78b37b02015-11-17 20:28:07 +00008910 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008911 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
8912 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
8913 CmdArgs.push_back(
8914 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
8915 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Eli Friedman83de5132011-12-08 23:54:21 +00008916 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008917
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00008918 Args.AddAllArgs(CmdArgs,
8919 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Chris Lattner3e2ee142010-07-07 16:01:42 +00008920
Daniel Dunbar54423b22010-09-17 00:24:54 +00008921 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008922
Xinliang David Li69306c02015-10-22 06:15:31 +00008923 getToolChain().addProfileRTLibs(Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00008924
Douglas Katzman78b37b02015-11-17 20:28:07 +00008925 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00008926 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00008927 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00008928 CmdArgs.push_back("-lm");
8929 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00008930 }
8931
Douglas Katzman78b37b02015-11-17 20:28:07 +00008932 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00008933 if (Args.hasArg(options::OPT_pthread))
8934 CmdArgs.push_back("-lpthread");
8935 CmdArgs.push_back("-lc");
8936 CmdArgs.push_back("-lCompilerRT-Generic");
8937 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
8938 CmdArgs.push_back(
Douglas Katzmana67e50c2015-06-26 15:47:46 +00008939 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008940 }
8941
Logan Chieneb9162f2014-06-26 14:23:45 +00008942 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00008943 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00008944}
8945
Daniel Dunbarcc912342009-05-02 18:28:39 +00008946/// DragonFly Tools
8947
8948// For now, DragonFly Assemble does just about the same as for
8949// FreeBSD, but this may change soon.
Douglas Katzman95354292015-06-23 20:42:09 +00008950void dragonfly::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
8951 const InputInfo &Output,
8952 const InputInfoList &Inputs,
8953 const ArgList &Args,
8954 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00008955 claimNoWarnArgs(Args);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008956 ArgStringList CmdArgs;
8957
8958 // When building 32-bit code on DragonFly/pc64, we have to explicitly
8959 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00008960 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00008961 CmdArgs.push_back("--32");
8962
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008963 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00008964
8965 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00008966 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008967
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008968 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00008969 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00008970
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00008971 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00008972 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00008973}
8974
Douglas Katzman95354292015-06-23 20:42:09 +00008975void dragonfly::Linker::ConstructJob(Compilation &C, const JobAction &JA,
8976 const InputInfo &Output,
8977 const InputInfoList &Inputs,
8978 const ArgList &Args,
8979 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00008980 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00008981 ArgStringList CmdArgs;
Rafael Espindola611505f2014-09-11 18:10:13 +00008982 bool UseGCC47 = llvm::sys::fs::exists("/usr/lib/gcc47");
John McCall65b8da02013-04-11 22:55:55 +00008983
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00008984 if (!D.SysRoot.empty())
8985 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
8986
John McCall65b8da02013-04-11 22:55:55 +00008987 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008988 if (Args.hasArg(options::OPT_static)) {
8989 CmdArgs.push_back("-Bstatic");
8990 } else {
John McCall65b8da02013-04-11 22:55:55 +00008991 if (Args.hasArg(options::OPT_rdynamic))
8992 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00008993 if (Args.hasArg(options::OPT_shared))
8994 CmdArgs.push_back("-Bshareable");
8995 else {
8996 CmdArgs.push_back("-dynamic-linker");
8997 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
8998 }
John McCall65b8da02013-04-11 22:55:55 +00008999 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009000 }
9001
9002 // When building 32-bit code on DragonFly/pc64, we have to explicitly
9003 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00009004 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009005 CmdArgs.push_back("-m");
9006 CmdArgs.push_back("elf_i386");
9007 }
9008
Daniel Dunbarb440f562010-08-02 02:38:21 +00009009 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009010 CmdArgs.push_back("-o");
9011 CmdArgs.push_back(Output.getFilename());
9012 } else {
9013 assert(Output.isNothing() && "Invalid output.");
9014 }
9015
Douglas Katzman78b37b02015-11-17 20:28:07 +00009016 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009017 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00009018 if (Args.hasArg(options::OPT_pg))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009019 CmdArgs.push_back(
9020 Args.MakeArgString(getToolChain().GetFilePath("gcrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009021 else {
9022 if (Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009023 CmdArgs.push_back(
9024 Args.MakeArgString(getToolChain().GetFilePath("Scrt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009025 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009026 CmdArgs.push_back(
9027 Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
John McCall65b8da02013-04-11 22:55:55 +00009028 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009029 }
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009030 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
John McCall65b8da02013-04-11 22:55:55 +00009031 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009032 CmdArgs.push_back(
9033 Args.MakeArgString(getToolChain().GetFilePath("crtbeginS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009034 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009035 CmdArgs.push_back(
9036 Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009037 }
9038
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009039 Args.AddAllArgs(CmdArgs,
9040 {options::OPT_L, options::OPT_T_Group, options::OPT_e});
Daniel Dunbarcc912342009-05-02 18:28:39 +00009041
Daniel Dunbar54423b22010-09-17 00:24:54 +00009042 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00009043
Douglas Katzman78b37b02015-11-17 20:28:07 +00009044 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00009045 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
9046 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00009047 if (UseGCC47)
9048 CmdArgs.push_back("-L/usr/lib/gcc47");
9049 else
9050 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009051
9052 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00009053 if (UseGCC47) {
9054 CmdArgs.push_back("-rpath");
9055 CmdArgs.push_back("/usr/lib/gcc47");
9056 } else {
9057 CmdArgs.push_back("-rpath");
9058 CmdArgs.push_back("/usr/lib/gcc44");
9059 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009060 }
9061
Hans Wennborg70850d82013-07-18 20:29:38 +00009062 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00009063 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00009064 CmdArgs.push_back("-lm");
9065 }
9066
Daniel Dunbarcc912342009-05-02 18:28:39 +00009067 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00009068 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00009069
9070 if (!Args.hasArg(options::OPT_nolibc)) {
9071 CmdArgs.push_back("-lc");
9072 }
9073
John McCall65b8da02013-04-11 22:55:55 +00009074 if (UseGCC47) {
9075 if (Args.hasArg(options::OPT_static) ||
9076 Args.hasArg(options::OPT_static_libgcc)) {
9077 CmdArgs.push_back("-lgcc");
9078 CmdArgs.push_back("-lgcc_eh");
9079 } else {
9080 if (Args.hasArg(options::OPT_shared_libgcc)) {
9081 CmdArgs.push_back("-lgcc_pic");
9082 if (!Args.hasArg(options::OPT_shared))
9083 CmdArgs.push_back("-lgcc");
9084 } else {
9085 CmdArgs.push_back("-lgcc");
9086 CmdArgs.push_back("--as-needed");
9087 CmdArgs.push_back("-lgcc_pic");
9088 CmdArgs.push_back("--no-as-needed");
9089 }
9090 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009091 } else {
John McCall65b8da02013-04-11 22:55:55 +00009092 if (Args.hasArg(options::OPT_shared)) {
9093 CmdArgs.push_back("-lgcc_pic");
9094 } else {
9095 CmdArgs.push_back("-lgcc");
9096 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00009097 }
9098 }
9099
Douglas Katzman78b37b02015-11-17 20:28:07 +00009100 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00009101 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009102 CmdArgs.push_back(
9103 Args.MakeArgString(getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00009104 else
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009105 CmdArgs.push_back(
9106 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
9107 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009108 }
9109
Xinliang David Li69306c02015-10-22 06:15:31 +00009110 getToolChain().addProfileRTLibs(Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00009111
Logan Chieneb9162f2014-06-26 14:23:45 +00009112 const char *Exec = Args.MakeArgString(getToolChain().GetLinkerPath());
Justin Bognerd3371d82015-07-17 03:35:54 +00009113 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00009114}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009115
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009116// Try to find Exe from a Visual Studio distribution. This first tries to find
9117// an installed copy of Visual Studio and, failing that, looks in the PATH,
9118// making sure that whatever executable that's found is not a same-named exe
9119// from clang itself to prevent clang from falling back to itself.
9120static std::string FindVisualStudioExecutable(const ToolChain &TC,
9121 const char *Exe,
9122 const char *ClangProgramPath) {
9123 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
9124 std::string visualStudioBinDir;
9125 if (MSVC.getVisualStudioBinariesFolder(ClangProgramPath,
9126 visualStudioBinDir)) {
9127 SmallString<128> FilePath(visualStudioBinDir);
9128 llvm::sys::path::append(FilePath, Exe);
9129 if (llvm::sys::fs::can_execute(FilePath.c_str()))
9130 return FilePath.str();
9131 }
9132
9133 return Exe;
9134}
9135
Douglas Katzman95354292015-06-23 20:42:09 +00009136void visualstudio::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9137 const InputInfo &Output,
9138 const InputInfoList &Inputs,
9139 const ArgList &Args,
9140 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009141 ArgStringList CmdArgs;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009142 const ToolChain &TC = getToolChain();
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009143
Saleem Abdulrasool9a215462014-12-19 23:56:31 +00009144 assert((Output.isFilename() || Output.isNothing()) && "invalid output");
9145 if (Output.isFilename())
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009146 CmdArgs.push_back(
9147 Args.MakeArgString(std::string("-out:") + Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009148
Douglas Katzman78b37b02015-11-17 20:28:07 +00009149 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles) &&
9150 !C.getDriver().IsCLMode())
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009151 CmdArgs.push_back("-defaultlib:libcmt");
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009152
Zachary Turner10d75b22014-10-22 20:40:43 +00009153 if (!llvm::sys::Process::GetEnv("LIB")) {
9154 // If the VC environment hasn't been configured (perhaps because the user
9155 // did not run vcvarsall), try to build a consistent link environment. If
Nico Webere93bcd12015-03-11 00:05:26 +00009156 // the environment variable is set however, assume the user knows what
9157 // they're doing.
Zachary Turner10d75b22014-10-22 20:40:43 +00009158 std::string VisualStudioDir;
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009159 const auto &MSVC = static_cast<const toolchains::MSVCToolChain &>(TC);
Zachary Turner10d75b22014-10-22 20:40:43 +00009160 if (MSVC.getVisualStudioInstallDir(VisualStudioDir)) {
9161 SmallString<128> LibDir(VisualStudioDir);
9162 llvm::sys::path::append(LibDir, "VC", "lib");
9163 switch (MSVC.getArch()) {
9164 case llvm::Triple::x86:
9165 // x86 just puts the libraries directly in lib
9166 break;
9167 case llvm::Triple::x86_64:
9168 llvm::sys::path::append(LibDir, "amd64");
9169 break;
9170 case llvm::Triple::arm:
9171 llvm::sys::path::append(LibDir, "arm");
9172 break;
9173 default:
9174 break;
9175 }
9176 CmdArgs.push_back(
9177 Args.MakeArgString(std::string("-libpath:") + LibDir.c_str()));
Reid Kleckner7531f7d2015-09-11 00:09:39 +00009178
9179 if (MSVC.useUniversalCRT(VisualStudioDir)) {
9180 std::string UniversalCRTLibPath;
9181 if (MSVC.getUniversalCRTLibraryPath(UniversalCRTLibPath))
9182 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9183 UniversalCRTLibPath.c_str()));
9184 }
Zachary Turner10d75b22014-10-22 20:40:43 +00009185 }
9186
9187 std::string WindowsSdkLibPath;
9188 if (MSVC.getWindowsSDKLibraryPath(WindowsSdkLibPath))
9189 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9190 WindowsSdkLibPath.c_str()));
9191 }
9192
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009193 CmdArgs.push_back("-nologo");
9194
Reid Kleckner124955a2015-08-05 18:51:13 +00009195 if (Args.hasArg(options::OPT_g_Group, options::OPT__SLASH_Z7))
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009196 CmdArgs.push_back("-debug");
Hans Wennborgbbb5f072014-04-25 16:24:19 +00009197
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009198 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd,
Hans Wennborge4c47f22015-03-04 23:16:21 +00009199 options::OPT_shared);
Hans Wennborgf1a74252013-09-10 20:18:04 +00009200 if (DLL) {
9201 CmdArgs.push_back(Args.MakeArgString("-dll"));
9202
9203 SmallString<128> ImplibName(Output.getFilename());
9204 llvm::sys::path::replace_extension(ImplibName, "lib");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009205 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") + ImplibName));
Hans Wennborgf1a74252013-09-10 20:18:04 +00009206 }
9207
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009208 if (TC.getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00009209 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00009210 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009211 if (Args.hasArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd)) {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009212 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9213 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Timur Iskhodzhanov651725e2014-09-12 14:01:30 +00009214 // Make sure the dynamic runtime thunk is not optimized out at link time
9215 // to ensure proper SEH handling.
9216 CmdArgs.push_back(Args.MakeArgString("-include:___asan_seh_interceptor"));
Timur Iskhodzhanov6903e102014-08-26 10:08:24 +00009217 } else if (DLL) {
Xinliang David Li69306c02015-10-22 06:15:31 +00009218 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009219 } else {
Saleem Abdulrasoolb48f1fe2015-10-29 03:36:42 +00009220 for (const auto &Lib : {"asan", "asan_cxx"})
9221 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
Alexey Samsonov6424e022014-05-12 20:20:20 +00009222 }
Hans Wennborg65f17522013-08-27 18:10:21 +00009223 }
9224
Hans Wennborg2e274592013-08-13 23:38:57 +00009225 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00009226
Alexey Bataevc7e84352015-08-19 04:49:01 +00009227 if (Args.hasFlag(options::OPT_fopenmp, options::OPT_fopenmp_EQ,
9228 options::OPT_fno_openmp, false)) {
9229 CmdArgs.push_back("-nodefaultlib:vcomp.lib");
9230 CmdArgs.push_back("-nodefaultlib:vcompd.lib");
9231 CmdArgs.push_back(Args.MakeArgString(std::string("-libpath:") +
9232 TC.getDriver().Dir + "/../lib"));
9233 switch (getOpenMPRuntime(getToolChain(), Args)) {
9234 case OMPRT_OMP:
9235 CmdArgs.push_back("-defaultlib:libomp.lib");
9236 break;
9237 case OMPRT_IOMP5:
9238 CmdArgs.push_back("-defaultlib:libiomp5md.lib");
9239 break;
9240 case OMPRT_GOMP:
9241 break;
9242 case OMPRT_Unknown:
9243 // Already diagnosed.
9244 break;
9245 }
9246 }
9247
Reid Kleckner337188f2014-09-16 19:22:00 +00009248 // Add filenames, libraries, and other linker inputs.
9249 for (const auto &Input : Inputs) {
9250 if (Input.isFilename()) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009251 CmdArgs.push_back(Input.getFilename());
Reid Kleckner337188f2014-09-16 19:22:00 +00009252 continue;
9253 }
9254
9255 const Arg &A = Input.getInputArg();
9256
9257 // Render -l options differently for the MSVC linker.
9258 if (A.getOption().matches(options::OPT_l)) {
9259 StringRef Lib = A.getValue();
9260 const char *LinkLibArg;
9261 if (Lib.endswith(".lib"))
9262 LinkLibArg = Args.MakeArgString(Lib);
9263 else
9264 LinkLibArg = Args.MakeArgString(Lib + ".lib");
9265 CmdArgs.push_back(LinkLibArg);
9266 continue;
9267 }
9268
9269 // Otherwise, this is some other kind of linker input option like -Wl, -z,
9270 // or -L. Render it, even if MSVC doesn't understand it.
9271 A.renderAsInput(Args, CmdArgs);
9272 }
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009273
Zachary Turner719f58c2014-12-01 23:06:47 +00009274 // We need to special case some linker paths. In the case of lld, we need to
9275 // translate 'lld' into 'lld-link', and in the case of the regular msvc
9276 // linker, we need to use a special search algorithm.
9277 llvm::SmallString<128> linkPath;
9278 StringRef Linker = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "link");
9279 if (Linker.equals_lower("lld"))
9280 Linker = "lld-link";
9281
9282 if (Linker.equals_lower("link")) {
9283 // If we're using the MSVC linker, it's not sufficient to just use link
9284 // from the program PATH, because other environments like GnuWin32 install
9285 // their own link.exe which may come first.
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009286 linkPath = FindVisualStudioExecutable(TC, "link.exe",
Zachary Turner719f58c2014-12-01 23:06:47 +00009287 C.getDriver().getClangProgramPath());
9288 } else {
9289 linkPath = Linker;
9290 llvm::sys::path::replace_extension(linkPath, "exe");
Saleem Abdulrasool21b18762014-12-19 23:56:28 +00009291 linkPath = TC.GetProgramPath(linkPath.c_str());
Zachary Turner719f58c2014-12-01 23:06:47 +00009292 }
9293
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009294 const char *Exec = Args.MakeArgString(linkPath);
Justin Bognerd3371d82015-07-17 03:35:54 +00009295 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00009296}
Hans Wennborg87cfa712013-09-19 20:32:16 +00009297
Douglas Katzman95354292015-06-23 20:42:09 +00009298void visualstudio::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9299 const InputInfo &Output,
9300 const InputInfoList &Inputs,
9301 const ArgList &Args,
9302 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009303 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
9304}
9305
Douglas Katzman95354292015-06-23 20:42:09 +00009306std::unique_ptr<Command> visualstudio::Compiler::GetCommand(
David Blaikiec11bf802014-09-04 16:04:28 +00009307 Compilation &C, const JobAction &JA, const InputInfo &Output,
9308 const InputInfoList &Inputs, const ArgList &Args,
9309 const char *LinkingOutput) const {
Hans Wennborg87cfa712013-09-19 20:32:16 +00009310 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00009311 CmdArgs.push_back("/nologo");
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009312 CmdArgs.push_back("/c"); // Compile only.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009313 CmdArgs.push_back("/W0"); // No warnings.
9314
9315 // The goal is to be able to invoke this tool correctly based on
9316 // any flag accepted by clang-cl.
9317
9318 // These are spelled the same way in clang and cl.exe,.
Douglas Katzman57a9c7e2015-07-29 18:39:14 +00009319 Args.AddAllArgs(CmdArgs, {options::OPT_D, options::OPT_U, options::OPT_I});
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009320
9321 // Optimization level.
David Majnemer015ce0f2015-07-27 07:32:11 +00009322 if (Arg *A = Args.getLastArg(options::OPT_fbuiltin, options::OPT_fno_builtin))
9323 CmdArgs.push_back(A->getOption().getID() == options::OPT_fbuiltin ? "/Oi"
9324 : "/Oi-");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009325 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
9326 if (A->getOption().getID() == options::OPT_O0) {
9327 CmdArgs.push_back("/Od");
9328 } else {
David Majnemer015ce0f2015-07-27 07:32:11 +00009329 CmdArgs.push_back("/Og");
9330
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009331 StringRef OptLevel = A->getValue();
David Majnemer015ce0f2015-07-27 07:32:11 +00009332 if (OptLevel == "s" || OptLevel == "z")
9333 CmdArgs.push_back("/Os");
9334 else
9335 CmdArgs.push_back("/Ot");
9336
9337 CmdArgs.push_back("/Ob2");
Hans Wennborgb6331dc2013-09-24 18:17:21 +00009338 }
9339 }
David Majnemer015ce0f2015-07-27 07:32:11 +00009340 if (Arg *A = Args.getLastArg(options::OPT_fomit_frame_pointer,
9341 options::OPT_fno_omit_frame_pointer))
9342 CmdArgs.push_back(A->getOption().getID() == options::OPT_fomit_frame_pointer
9343 ? "/Oy"
9344 : "/Oy-");
9345 if (!Args.hasArg(options::OPT_fwritable_strings))
9346 CmdArgs.push_back("/GF");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009347
Nico Weber3f8dafb2015-03-12 19:37:10 +00009348 // Flags for which clang-cl has an alias.
Hans Wennborg87cfa712013-09-19 20:32:16 +00009349 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
9350
David Majnemerf6072342014-07-01 22:24:56 +00009351 if (Args.hasFlag(options::OPT__SLASH_GR_, options::OPT__SLASH_GR,
9352 /*default=*/false))
9353 CmdArgs.push_back("/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00009354 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
9355 options::OPT_fno_function_sections))
9356 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
9357 ? "/Gy"
9358 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00009359 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
9360 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00009361 CmdArgs.push_back(
9362 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009363 if (Args.hasArg(options::OPT_fsyntax_only))
9364 CmdArgs.push_back("/Zs");
Reid Kleckner124955a2015-08-05 18:51:13 +00009365 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only,
9366 options::OPT__SLASH_Z7))
Reid Klecknerc688daf2014-02-19 22:05:59 +00009367 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00009368
Nico Weber3f8dafb2015-03-12 19:37:10 +00009369 std::vector<std::string> Includes =
9370 Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009371 for (const auto &Include : Includes)
9372 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00009373
Hans Wennborg87cfa712013-09-19 20:32:16 +00009374 // Flags that can simply be passed through.
9375 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
9376 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
Reid Klecknerc542d372014-06-27 17:02:02 +00009377 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_EH);
David Majnemerbac941c2015-07-25 06:07:59 +00009378 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_Zl);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009379
9380 // The order of these flags is relevant, so pick the last one.
9381 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
9382 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
9383 A->render(Args, CmdArgs);
9384
Hans Wennborg87cfa712013-09-19 20:32:16 +00009385 // Input filename.
9386 assert(Inputs.size() == 1);
9387 const InputInfo &II = Inputs[0];
9388 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
9389 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
9390 if (II.isFilename())
9391 CmdArgs.push_back(II.getFilename());
9392 else
9393 II.getInputArg().renderAsInput(Args, CmdArgs);
9394
9395 // Output filename.
9396 assert(Output.getType() == types::TY_Object);
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009397 const char *Fo =
9398 Args.MakeArgString(std::string("/Fo") + Output.getFilename());
Hans Wennborg87cfa712013-09-19 20:32:16 +00009399 CmdArgs.push_back(Fo);
9400
Hans Wennborg188382e2013-09-20 18:16:35 +00009401 const Driver &D = getToolChain().getDriver();
Zachary Turner0eaf8fc2014-10-22 20:40:28 +00009402 std::string Exec = FindVisualStudioExecutable(getToolChain(), "cl.exe",
9403 D.getClangProgramPath());
David Blaikiec11bf802014-09-04 16:04:28 +00009404 return llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
Justin Bognerd3371d82015-07-17 03:35:54 +00009405 CmdArgs, Inputs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00009406}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009407
Yaron Keren1c0070c2015-07-02 04:45:27 +00009408/// MinGW Tools
9409void MinGW::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9410 const InputInfo &Output,
9411 const InputInfoList &Inputs,
9412 const ArgList &Args,
9413 const char *LinkingOutput) const {
9414 claimNoWarnArgs(Args);
9415 ArgStringList CmdArgs;
9416
9417 if (getToolChain().getArch() == llvm::Triple::x86) {
9418 CmdArgs.push_back("--32");
9419 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
9420 CmdArgs.push_back("--64");
9421 }
9422
9423 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9424
9425 CmdArgs.push_back("-o");
9426 CmdArgs.push_back(Output.getFilename());
9427
9428 for (const auto &II : Inputs)
9429 CmdArgs.push_back(II.getFilename());
9430
9431 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009432 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009433
9434 if (Args.hasArg(options::OPT_gsplit_dwarf))
9435 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
9436 SplitDebugName(Args, Inputs[0]));
9437}
9438
9439void MinGW::Linker::AddLibGCC(const ArgList &Args,
9440 ArgStringList &CmdArgs) const {
9441 if (Args.hasArg(options::OPT_mthreads))
9442 CmdArgs.push_back("-lmingwthrd");
9443 CmdArgs.push_back("-lmingw32");
Reid Kleckner0213a472015-07-22 16:01:38 +00009444
Yaron Kerenaa281332015-08-09 00:24:07 +00009445 // Make use of compiler-rt if --rtlib option is used
9446 ToolChain::RuntimeLibType RLT = getToolChain().GetRuntimeLibType(Args);
9447 if (RLT == ToolChain::RLT_Libgcc) {
9448 bool Static = Args.hasArg(options::OPT_static_libgcc) ||
9449 Args.hasArg(options::OPT_static);
9450 bool Shared = Args.hasArg(options::OPT_shared);
9451 bool CXX = getToolChain().getDriver().CCCIsCXX();
9452
9453 if (Static || (!CXX && !Shared)) {
9454 CmdArgs.push_back("-lgcc");
9455 CmdArgs.push_back("-lgcc_eh");
9456 } else {
9457 CmdArgs.push_back("-lgcc_s");
9458 CmdArgs.push_back("-lgcc");
9459 }
9460 } else {
9461 AddRunTimeLibs(getToolChain(), getToolChain().getDriver(), CmdArgs, Args);
9462 }
Reid Kleckner0213a472015-07-22 16:01:38 +00009463
Yaron Keren1c0070c2015-07-02 04:45:27 +00009464 CmdArgs.push_back("-lmoldname");
9465 CmdArgs.push_back("-lmingwex");
9466 CmdArgs.push_back("-lmsvcrt");
9467}
9468
9469void MinGW::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9470 const InputInfo &Output,
9471 const InputInfoList &Inputs,
9472 const ArgList &Args,
9473 const char *LinkingOutput) const {
9474 const ToolChain &TC = getToolChain();
9475 const Driver &D = TC.getDriver();
9476 // const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
9477
9478 ArgStringList CmdArgs;
9479
9480 // Silence warning for "clang -g foo.o -o foo"
9481 Args.ClaimAllArgs(options::OPT_g_Group);
9482 // and "clang -emit-llvm foo.o -o foo"
9483 Args.ClaimAllArgs(options::OPT_emit_llvm);
9484 // and for "clang -w foo.o -o foo". Other warning options are already
9485 // handled somewhere else.
9486 Args.ClaimAllArgs(options::OPT_w);
9487
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009488 StringRef LinkerName = Args.getLastArgValue(options::OPT_fuse_ld_EQ, "ld");
9489 if (LinkerName.equals_lower("lld")) {
9490 CmdArgs.push_back("-flavor");
Martell Maloneaac044e2015-11-22 05:40:06 +00009491 CmdArgs.push_back("gnu");
Yaron Kerena7fa79f2015-11-15 08:06:27 +00009492 } else if (!LinkerName.equals_lower("ld")) {
9493 D.Diag(diag::err_drv_unsupported_linker) << LinkerName;
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009494 }
9495
Yaron Keren1c0070c2015-07-02 04:45:27 +00009496 if (!D.SysRoot.empty())
9497 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9498
9499 if (Args.hasArg(options::OPT_s))
9500 CmdArgs.push_back("-s");
9501
9502 CmdArgs.push_back("-m");
9503 if (TC.getArch() == llvm::Triple::x86)
9504 CmdArgs.push_back("i386pe");
9505 if (TC.getArch() == llvm::Triple::x86_64)
9506 CmdArgs.push_back("i386pep");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009507 if (TC.getArch() == llvm::Triple::arm)
9508 CmdArgs.push_back("thumb2pe");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009509
9510 if (Args.hasArg(options::OPT_mwindows)) {
9511 CmdArgs.push_back("--subsystem");
9512 CmdArgs.push_back("windows");
9513 } else if (Args.hasArg(options::OPT_mconsole)) {
9514 CmdArgs.push_back("--subsystem");
9515 CmdArgs.push_back("console");
9516 }
9517
9518 if (Args.hasArg(options::OPT_static))
9519 CmdArgs.push_back("-Bstatic");
9520 else {
9521 if (Args.hasArg(options::OPT_mdll))
9522 CmdArgs.push_back("--dll");
9523 else if (Args.hasArg(options::OPT_shared))
9524 CmdArgs.push_back("--shared");
9525 CmdArgs.push_back("-Bdynamic");
9526 if (Args.hasArg(options::OPT_mdll) || Args.hasArg(options::OPT_shared)) {
9527 CmdArgs.push_back("-e");
9528 if (TC.getArch() == llvm::Triple::x86)
9529 CmdArgs.push_back("_DllMainCRTStartup@12");
9530 else
9531 CmdArgs.push_back("DllMainCRTStartup");
9532 CmdArgs.push_back("--enable-auto-image-base");
9533 }
9534 }
9535
9536 CmdArgs.push_back("-o");
9537 CmdArgs.push_back(Output.getFilename());
9538
9539 Args.AddAllArgs(CmdArgs, options::OPT_e);
9540 // FIXME: add -N, -n flags
9541 Args.AddLastArg(CmdArgs, options::OPT_r);
9542 Args.AddLastArg(CmdArgs, options::OPT_s);
9543 Args.AddLastArg(CmdArgs, options::OPT_t);
9544 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
9545 Args.AddLastArg(CmdArgs, options::OPT_Z_Flag);
9546
Douglas Katzman78b37b02015-11-17 20:28:07 +00009547 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009548 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_mdll)) {
9549 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("dllcrt2.o")));
9550 } else {
9551 if (Args.hasArg(options::OPT_municode))
9552 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2u.o")));
9553 else
9554 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crt2.o")));
9555 }
9556 if (Args.hasArg(options::OPT_pg))
9557 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("gcrt2.o")));
9558 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
9559 }
9560
9561 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009562 TC.AddFilePathLibArgs(Args, CmdArgs);
Yaron Keren1c0070c2015-07-02 04:45:27 +00009563 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9564
9565 // TODO: Add ASan stuff here
9566
9567 // TODO: Add profile stuff here
9568
Douglas Katzman78b37b02015-11-17 20:28:07 +00009569 if (D.CCCIsCXX() &&
9570 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Yaron Keren1c0070c2015-07-02 04:45:27 +00009571 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
9572 !Args.hasArg(options::OPT_static);
9573 if (OnlyLibstdcxxStatic)
9574 CmdArgs.push_back("-Bstatic");
9575 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9576 if (OnlyLibstdcxxStatic)
9577 CmdArgs.push_back("-Bdynamic");
9578 }
9579
9580 if (!Args.hasArg(options::OPT_nostdlib)) {
9581 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9582 if (Args.hasArg(options::OPT_static))
9583 CmdArgs.push_back("--start-group");
9584
9585 if (Args.hasArg(options::OPT_fstack_protector) ||
9586 Args.hasArg(options::OPT_fstack_protector_strong) ||
9587 Args.hasArg(options::OPT_fstack_protector_all)) {
9588 CmdArgs.push_back("-lssp_nonshared");
9589 CmdArgs.push_back("-lssp");
9590 }
9591 if (Args.hasArg(options::OPT_fopenmp))
9592 CmdArgs.push_back("-lgomp");
9593
9594 AddLibGCC(Args, CmdArgs);
9595
9596 if (Args.hasArg(options::OPT_pg))
9597 CmdArgs.push_back("-lgmon");
9598
Yaron Kerenadce68e2015-07-06 18:52:19 +00009599 if (Args.hasArg(options::OPT_pthread))
9600 CmdArgs.push_back("-lpthread");
Yaron Keren1c0070c2015-07-02 04:45:27 +00009601
9602 // add system libraries
9603 if (Args.hasArg(options::OPT_mwindows)) {
9604 CmdArgs.push_back("-lgdi32");
9605 CmdArgs.push_back("-lcomdlg32");
9606 }
9607 CmdArgs.push_back("-ladvapi32");
9608 CmdArgs.push_back("-lshell32");
9609 CmdArgs.push_back("-luser32");
9610 CmdArgs.push_back("-lkernel32");
9611
9612 if (Args.hasArg(options::OPT_static))
9613 CmdArgs.push_back("--end-group");
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009614 else if (!LinkerName.equals_lower("lld"))
Yaron Keren1c0070c2015-07-02 04:45:27 +00009615 AddLibGCC(Args, CmdArgs);
9616 }
9617
9618 if (!Args.hasArg(options::OPT_nostartfiles)) {
9619 // Add crtfastmath.o if available and fast math is enabled.
9620 TC.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
9621
9622 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
9623 }
9624 }
Yaron Keren2ffb36e2015-07-14 05:23:34 +00009625 const char *Exec = Args.MakeArgString(TC.GetProgramPath(LinkerName.data()));
Justin Bognerd3371d82015-07-17 03:35:54 +00009626 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Yaron Keren1c0070c2015-07-02 04:45:27 +00009627}
9628
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009629/// XCore Tools
9630// We pass assemble and link construction to the xcc tool.
9631
Douglas Katzman95354292015-06-23 20:42:09 +00009632void XCore::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9633 const InputInfo &Output,
9634 const InputInfoList &Inputs,
9635 const ArgList &Args,
9636 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009637 claimNoWarnArgs(Args);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009638 ArgStringList CmdArgs;
9639
9640 CmdArgs.push_back("-o");
9641 CmdArgs.push_back(Output.getFilename());
9642
9643 CmdArgs.push_back("-c");
9644
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009645 if (Args.hasArg(options::OPT_v))
9646 CmdArgs.push_back("-v");
9647
Robert Lytton894d25c2014-05-02 09:33:25 +00009648 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
9649 if (!A->getOption().matches(options::OPT_g0))
9650 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009651
Robert Lytton8e95d4e2014-02-11 10:34:45 +00009652 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
9653 false))
9654 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009655
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009656 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009657
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009658 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009659 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009660
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009661 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009662 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009663}
9664
Douglas Katzman95354292015-06-23 20:42:09 +00009665void XCore::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9666 const InputInfo &Output,
9667 const InputInfoList &Inputs,
9668 const ArgList &Args,
9669 const char *LinkingOutput) const {
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009670 ArgStringList CmdArgs;
9671
9672 if (Output.isFilename()) {
9673 CmdArgs.push_back("-o");
9674 CmdArgs.push_back(Output.getFilename());
9675 } else {
9676 assert(Output.isNothing() && "Invalid output.");
9677 }
9678
Robert Lytton9e8c1a42014-02-13 10:40:12 +00009679 if (Args.hasArg(options::OPT_v))
9680 CmdArgs.push_back("-v");
9681
Reid Kleckner0bb1fc42015-07-10 22:25:44 +00009682 // Pass -fexceptions through to the linker if it was present.
9683 if (Args.hasFlag(options::OPT_fexceptions, options::OPT_fno_exceptions,
9684 false))
Robert Lyttonf7e03c12014-02-13 10:34:44 +00009685 CmdArgs.push_back("-fexceptions");
9686
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009687 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
9688
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00009689 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009690 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00009691}
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009692
Douglas Katzman95354292015-06-23 20:42:09 +00009693void CrossWindows::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9694 const InputInfo &Output,
9695 const InputInfoList &Inputs,
9696 const ArgList &Args,
9697 const char *LinkingOutput) const {
Rafael Espindola577637a2015-01-03 00:06:04 +00009698 claimNoWarnArgs(Args);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009699 const auto &TC =
9700 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9701 ArgStringList CmdArgs;
9702 const char *Exec;
9703
9704 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009705 default:
9706 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009707 case llvm::Triple::arm:
9708 case llvm::Triple::thumb:
9709 break;
9710 case llvm::Triple::x86:
9711 CmdArgs.push_back("--32");
9712 break;
9713 case llvm::Triple::x86_64:
9714 CmdArgs.push_back("--64");
9715 break;
9716 }
9717
9718 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9719
9720 CmdArgs.push_back("-o");
9721 CmdArgs.push_back(Output.getFilename());
9722
9723 for (const auto &Input : Inputs)
9724 CmdArgs.push_back(Input.getFilename());
9725
9726 const std::string Assembler = TC.GetProgramPath("as");
9727 Exec = Args.MakeArgString(Assembler);
9728
Justin Bognerd3371d82015-07-17 03:35:54 +00009729 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009730}
9731
Douglas Katzman95354292015-06-23 20:42:09 +00009732void CrossWindows::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9733 const InputInfo &Output,
9734 const InputInfoList &Inputs,
9735 const ArgList &Args,
9736 const char *LinkingOutput) const {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009737 const auto &TC =
9738 static_cast<const toolchains::CrossWindowsToolChain &>(getToolChain());
9739 const llvm::Triple &T = TC.getTriple();
9740 const Driver &D = TC.getDriver();
9741 SmallString<128> EntryPoint;
9742 ArgStringList CmdArgs;
9743 const char *Exec;
9744
9745 // Silence warning for "clang -g foo.o -o foo"
9746 Args.ClaimAllArgs(options::OPT_g_Group);
9747 // and "clang -emit-llvm foo.o -o foo"
9748 Args.ClaimAllArgs(options::OPT_emit_llvm);
9749 // and for "clang -w foo.o -o foo"
9750 Args.ClaimAllArgs(options::OPT_w);
9751 // Other warning options are already handled somewhere else.
9752
9753 if (!D.SysRoot.empty())
9754 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
9755
9756 if (Args.hasArg(options::OPT_pie))
9757 CmdArgs.push_back("-pie");
9758 if (Args.hasArg(options::OPT_rdynamic))
9759 CmdArgs.push_back("-export-dynamic");
9760 if (Args.hasArg(options::OPT_s))
9761 CmdArgs.push_back("--strip-all");
9762
9763 CmdArgs.push_back("-m");
9764 switch (TC.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009765 default:
9766 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009767 case llvm::Triple::arm:
9768 case llvm::Triple::thumb:
9769 // FIXME: this is incorrect for WinCE
9770 CmdArgs.push_back("thumb2pe");
9771 break;
9772 case llvm::Triple::x86:
9773 CmdArgs.push_back("i386pe");
9774 EntryPoint.append("_");
9775 break;
9776 case llvm::Triple::x86_64:
9777 CmdArgs.push_back("i386pep");
9778 break;
9779 }
9780
9781 if (Args.hasArg(options::OPT_shared)) {
9782 switch (T.getArch()) {
Douglas Katzmana67e50c2015-06-26 15:47:46 +00009783 default:
9784 llvm_unreachable("unsupported architecture");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009785 case llvm::Triple::arm:
9786 case llvm::Triple::thumb:
9787 case llvm::Triple::x86_64:
9788 EntryPoint.append("_DllMainCRTStartup");
9789 break;
9790 case llvm::Triple::x86:
9791 EntryPoint.append("_DllMainCRTStartup@12");
9792 break;
9793 }
9794
9795 CmdArgs.push_back("-shared");
9796 CmdArgs.push_back("-Bdynamic");
9797
9798 CmdArgs.push_back("--enable-auto-image-base");
9799
9800 CmdArgs.push_back("--entry");
9801 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9802 } else {
9803 EntryPoint.append("mainCRTStartup");
9804
9805 CmdArgs.push_back(Args.hasArg(options::OPT_static) ? "-Bstatic"
9806 : "-Bdynamic");
9807
Douglas Katzman78b37b02015-11-17 20:28:07 +00009808 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009809 CmdArgs.push_back("--entry");
9810 CmdArgs.push_back(Args.MakeArgString(EntryPoint));
9811 }
9812
9813 // FIXME: handle subsystem
9814 }
9815
9816 // NOTE: deal with multiple definitions on Windows (e.g. COMDAT)
Saleem Abdulrasool56dd1ac2014-10-28 03:15:02 +00009817 CmdArgs.push_back("--allow-multiple-definition");
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009818
9819 CmdArgs.push_back("-o");
9820 CmdArgs.push_back(Output.getFilename());
9821
9822 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_rdynamic)) {
9823 SmallString<261> ImpLib(Output.getFilename());
9824 llvm::sys::path::replace_extension(ImpLib, ".lib");
9825
9826 CmdArgs.push_back("--out-implib");
9827 CmdArgs.push_back(Args.MakeArgString(ImpLib));
9828 }
9829
Douglas Katzman78b37b02015-11-17 20:28:07 +00009830 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009831 const std::string CRTPath(D.SysRoot + "/usr/lib/");
9832 const char *CRTBegin;
9833
9834 CRTBegin =
9835 Args.hasArg(options::OPT_shared) ? "crtbeginS.obj" : "crtbegin.obj";
9836 CmdArgs.push_back(Args.MakeArgString(CRTPath + CRTBegin));
9837 }
9838
9839 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +00009840 TC.AddFilePathLibArgs(Args, CmdArgs);
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009841 AddLinkerInputs(TC, Inputs, Args, CmdArgs);
9842
9843 if (D.CCCIsCXX() && !Args.hasArg(options::OPT_nostdlib) &&
9844 !Args.hasArg(options::OPT_nodefaultlibs)) {
9845 bool StaticCXX = Args.hasArg(options::OPT_static_libstdcxx) &&
9846 !Args.hasArg(options::OPT_static);
9847 if (StaticCXX)
9848 CmdArgs.push_back("-Bstatic");
9849 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
9850 if (StaticCXX)
9851 CmdArgs.push_back("-Bdynamic");
9852 }
9853
9854 if (!Args.hasArg(options::OPT_nostdlib)) {
9855 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
9856 // TODO handle /MT[d] /MD[d]
9857 CmdArgs.push_back("-lmsvcrt");
9858 AddRunTimeLibs(TC, D, CmdArgs, Args);
9859 }
9860 }
9861
Saleem Abdulrasoolbb2e5e42015-10-29 03:36:45 +00009862 if (TC.getSanitizerArgs().needsAsanRt()) {
9863 // TODO handle /MT[d] /MD[d]
9864 if (Args.hasArg(options::OPT_shared)) {
9865 CmdArgs.push_back(TC.getCompilerRTArgString(Args, "asan_dll_thunk"));
9866 } else {
9867 for (const auto &Lib : {"asan_dynamic", "asan_dynamic_runtime_thunk"})
9868 CmdArgs.push_back(TC.getCompilerRTArgString(Args, Lib));
9869 // Make sure the dynamic runtime thunk is not optimized out at link time
9870 // to ensure proper SEH handling.
9871 CmdArgs.push_back(Args.MakeArgString("--undefined"));
9872 CmdArgs.push_back(Args.MakeArgString(TC.getArch() == llvm::Triple::x86
9873 ? "___asan_seh_interceptor"
9874 : "__asan_seh_interceptor"));
9875 }
9876 }
9877
Saleem Abdulrasoolfd80f832015-10-28 04:45:58 +00009878 Exec = Args.MakeArgString(TC.GetLinkerPath());
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009879
Justin Bognerd3371d82015-07-17 03:35:54 +00009880 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
Saleem Abdulrasool543a78b2014-10-24 03:13:37 +00009881}
Douglas Katzman84a75642015-06-19 14:55:19 +00009882
Douglas Katzman95354292015-06-23 20:42:09 +00009883void tools::SHAVE::Compiler::ConstructJob(Compilation &C, const JobAction &JA,
9884 const InputInfo &Output,
9885 const InputInfoList &Inputs,
9886 const ArgList &Args,
9887 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009888 ArgStringList CmdArgs;
Douglas Katzman84a75642015-06-19 14:55:19 +00009889 assert(Inputs.size() == 1);
9890 const InputInfo &II = Inputs[0];
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009891 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX ||
9892 II.getType() == types::TY_PP_CXX);
Douglas Katzman84a75642015-06-19 14:55:19 +00009893
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009894 if (JA.getKind() == Action::PreprocessJobClass) {
9895 Args.ClaimAllArgs();
9896 CmdArgs.push_back("-E");
9897 } else {
9898 assert(Output.getType() == types::TY_PP_Asm); // Require preprocessed asm.
9899 CmdArgs.push_back("-S");
9900 CmdArgs.push_back("-fno-exceptions"); // Always do this even if unspecified.
9901 }
Douglas Katzman84a75642015-06-19 14:55:19 +00009902 CmdArgs.push_back("-mcpu=myriad2");
Douglas Katzman9dc4c622015-11-20 04:58:12 +00009903 CmdArgs.push_back("-DMYRIAD2");
Douglas Katzman84a75642015-06-19 14:55:19 +00009904
Douglas Katzmanf6071112015-08-03 14:34:22 +00009905 // Append all -I, -iquote, -isystem paths, defines/undefines,
9906 // 'f' flags, optimize flags, and warning options.
9907 // These are spelled the same way in clang and moviCompile.
Douglas Katzman38dca882015-09-08 19:29:55 +00009908 Args.AddAllArgs(CmdArgs, {options::OPT_I_Group, options::OPT_clang_i_Group,
Douglas Katzman642e5f92015-11-16 15:38:40 +00009909 options::OPT_std_EQ, options::OPT_D, options::OPT_U,
Douglas Katzman38dca882015-09-08 19:29:55 +00009910 options::OPT_f_Group, options::OPT_f_clang_Group,
9911 options::OPT_g_Group, options::OPT_M_Group,
9912 options::OPT_O_Group, options::OPT_W_Group});
9913
9914 // If we're producing a dependency file, and assembly is the final action,
9915 // then the name of the target in the dependency file should be the '.o'
9916 // file, not the '.s' file produced by this step. For example, instead of
9917 // /tmp/mumble.s: mumble.c .../someheader.h
9918 // the filename on the lefthand side should be "mumble.o"
9919 if (Args.getLastArg(options::OPT_MF) && !Args.getLastArg(options::OPT_MT) &&
9920 C.getActions().size() == 1 &&
9921 C.getActions()[0]->getKind() == Action::AssembleJobClass) {
9922 Arg *A = Args.getLastArg(options::OPT_o);
9923 if (A) {
9924 CmdArgs.push_back("-MT");
9925 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
9926 }
9927 }
9928
Douglas Katzman84a75642015-06-19 14:55:19 +00009929 CmdArgs.push_back(II.getFilename());
9930 CmdArgs.push_back("-o");
9931 CmdArgs.push_back(Output.getFilename());
9932
9933 std::string Exec =
9934 Args.MakeArgString(getToolChain().GetProgramPath("moviCompile"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009935 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9936 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009937}
9938
Douglas Katzman95354292015-06-23 20:42:09 +00009939void tools::SHAVE::Assembler::ConstructJob(Compilation &C, const JobAction &JA,
9940 const InputInfo &Output,
9941 const InputInfoList &Inputs,
9942 const ArgList &Args,
9943 const char *LinkingOutput) const {
Douglas Katzman84a75642015-06-19 14:55:19 +00009944 ArgStringList CmdArgs;
9945
9946 assert(Inputs.size() == 1);
9947 const InputInfo &II = Inputs[0];
9948 assert(II.getType() == types::TY_PP_Asm); // Require preprocessed asm input.
9949 assert(Output.getType() == types::TY_Object);
9950
9951 CmdArgs.push_back("-no6thSlotCompression");
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009952 CmdArgs.push_back("-cv:myriad2"); // Chip Version
Douglas Katzman84a75642015-06-19 14:55:19 +00009953 CmdArgs.push_back("-noSPrefixing");
9954 CmdArgs.push_back("-a"); // Mystery option.
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009955 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
9956 for (const Arg *A : Args.filtered(options::OPT_I, options::OPT_isystem)) {
9957 A->claim();
Douglas Katzman84a75642015-06-19 14:55:19 +00009958 CmdArgs.push_back(
Douglas Katzmanae2f3582015-09-11 21:13:46 +00009959 Args.MakeArgString(std::string("-i:") + A->getValue(0)));
Douglas Katzman84a75642015-06-19 14:55:19 +00009960 }
9961 CmdArgs.push_back("-elf"); // Output format.
9962 CmdArgs.push_back(II.getFilename());
9963 CmdArgs.push_back(
9964 Args.MakeArgString(std::string("-o:") + Output.getFilename()));
9965
9966 std::string Exec =
9967 Args.MakeArgString(getToolChain().GetProgramPath("moviAsm"));
Justin Bognerd3371d82015-07-17 03:35:54 +00009968 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
9969 CmdArgs, Inputs));
Douglas Katzman84a75642015-06-19 14:55:19 +00009970}
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009971
9972void tools::Myriad::Linker::ConstructJob(Compilation &C, const JobAction &JA,
9973 const InputInfo &Output,
9974 const InputInfoList &Inputs,
9975 const ArgList &Args,
9976 const char *LinkingOutput) const {
9977 const auto &TC =
9978 static_cast<const toolchains::MyriadToolChain &>(getToolChain());
9979 const llvm::Triple &T = TC.getTriple();
9980 ArgStringList CmdArgs;
Eric Christopher3f5d2bc2015-12-08 00:10:13 +00009981 bool UseStartfiles =
9982 !Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles);
Douglas Katzman78b37b02015-11-17 20:28:07 +00009983 bool UseDefaultLibs =
9984 !Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009985
Douglas Katzmand6e597c2015-09-17 19:56:40 +00009986 if (T.getArch() == llvm::Triple::sparc)
9987 CmdArgs.push_back("-EB");
9988 else // SHAVE assumes little-endian, and sparcel is expressly so.
9989 CmdArgs.push_back("-EL");
9990
9991 // The remaining logic is mostly like gnutools::Linker::ConstructJob,
9992 // but we never pass through a --sysroot option and various other bits.
9993 // For example, there are no sanitizers (yet) nor gold linker.
9994
9995 // Eat some arguments that may be present but have no effect.
9996 Args.ClaimAllArgs(options::OPT_g_Group);
9997 Args.ClaimAllArgs(options::OPT_w);
9998 Args.ClaimAllArgs(options::OPT_static_libgcc);
9999
10000 if (Args.hasArg(options::OPT_s)) // Pass the 'strip' option.
10001 CmdArgs.push_back("-s");
10002
10003 CmdArgs.push_back("-o");
10004 CmdArgs.push_back(Output.getFilename());
10005
10006 if (UseStartfiles) {
10007 // If you want startfiles, it means you want the builtin crti and crtbegin,
10008 // but not crt0. Myriad link commands provide their own crt0.o as needed.
Douglas Katzman674a3122015-11-18 16:24:46 +000010009 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crti.o")));
10010 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtbegin.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010011 }
10012
10013 Args.AddAllArgs(CmdArgs, {options::OPT_L, options::OPT_T_Group,
10014 options::OPT_e, options::OPT_s, options::OPT_t,
10015 options::OPT_Z_Flag, options::OPT_r});
10016
Douglas Katzman674a3122015-11-18 16:24:46 +000010017 TC.AddFilePathLibArgs(Args, CmdArgs);
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010018
10019 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
10020
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010021 if (UseDefaultLibs) {
Douglas Katzman795f57f2015-10-09 20:26:20 +000010022 if (C.getDriver().CCCIsCXX())
10023 CmdArgs.push_back("-lstdc++");
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010024 if (T.getOS() == llvm::Triple::RTEMS) {
10025 CmdArgs.push_back("--start-group");
10026 CmdArgs.push_back("-lc");
10027 // You must provide your own "-L" option to enable finding these.
10028 CmdArgs.push_back("-lrtemscpu");
10029 CmdArgs.push_back("-lrtemsbsp");
10030 CmdArgs.push_back("--end-group");
10031 } else {
10032 CmdArgs.push_back("-lc");
10033 }
Douglas Katzman9e31cb92015-10-02 18:39:08 +000010034 CmdArgs.push_back("-lgcc");
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010035 }
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010036 if (UseStartfiles) {
Douglas Katzman674a3122015-11-18 16:24:46 +000010037 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtend.o")));
10038 CmdArgs.push_back(Args.MakeArgString(TC.GetFilePath("crtn.o")));
Douglas Katzmand6e597c2015-09-17 19:56:40 +000010039 }
10040
10041 std::string Exec =
10042 Args.MakeArgString(TC.GetProgramPath("sparc-myriad-elf-ld"));
10043 C.addCommand(llvm::make_unique<Command>(JA, *this, Args.MakeArgString(Exec),
10044 CmdArgs, Inputs));
10045}
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010046
10047void PS4cpu::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
10048 const InputInfo &Output,
10049 const InputInfoList &Inputs,
10050 const ArgList &Args,
10051 const char *LinkingOutput) const {
10052 claimNoWarnArgs(Args);
10053 ArgStringList CmdArgs;
10054
10055 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
10056
10057 CmdArgs.push_back("-o");
10058 CmdArgs.push_back(Output.getFilename());
10059
10060 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
10061 const InputInfo &Input = Inputs[0];
10062 assert(Input.isFilename() && "Invalid input.");
10063 CmdArgs.push_back(Input.getFilename());
10064
10065 const char *Exec =
10066 Args.MakeArgString(getToolChain().GetProgramPath("ps4-as"));
10067 C.addCommand(llvm::make_unique<Command>(JA, *this, Exec, CmdArgs, Inputs));
10068}
10069
10070static void AddPS4ProfileRT(const ToolChain &TC, const ArgList &Args,
10071 ArgStringList &CmdArgs) {
10072 if (!(Args.hasFlag(options::OPT_fprofile_arcs, options::OPT_fno_profile_arcs,
10073 false) ||
10074 Args.hasArg(options::OPT_fprofile_generate) ||
10075 Args.hasArg(options::OPT_fprofile_instr_generate) ||
10076 Args.hasArg(options::OPT_fcreate_profile) ||
10077 Args.hasArg(options::OPT_coverage)))
10078 return;
10079
10080 assert(TC.getTriple().isPS4CPU() &&
10081 "Profiling libraries are only implemented for the PS4 CPU");
10082 CmdArgs.push_back("-lclang_rt.profile-x86_64");
10083}
10084
10085static void AddPS4SanitizerArgs(const ToolChain &TC, ArgStringList &CmdArgs) {
10086 const SanitizerArgs &SanArgs = TC.getSanitizerArgs();
10087 if (SanArgs.needsUbsanRt()) {
10088 CmdArgs.push_back("-lSceDbgUBSanitizer_stub_weak");
10089 }
10090 if (SanArgs.needsAsanRt()) {
10091 CmdArgs.push_back("-lSceDbgAddressSanitizer_stub_weak");
10092 }
10093}
10094
10095static void ConstructPS4LinkJob(const Tool &T, Compilation &C,
10096 const JobAction &JA, const InputInfo &Output,
10097 const InputInfoList &Inputs,
10098 const ArgList &Args,
10099 const char *LinkingOutput) {
10100 const toolchains::FreeBSD &ToolChain =
10101 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10102 const Driver &D = ToolChain.getDriver();
10103 ArgStringList CmdArgs;
10104
10105 // Silence warning for "clang -g foo.o -o foo"
10106 Args.ClaimAllArgs(options::OPT_g_Group);
10107 // and "clang -emit-llvm foo.o -o foo"
10108 Args.ClaimAllArgs(options::OPT_emit_llvm);
10109 // and for "clang -w foo.o -o foo". Other warning options are already
10110 // handled somewhere else.
10111 Args.ClaimAllArgs(options::OPT_w);
10112
10113 if (!D.SysRoot.empty())
10114 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10115
10116 if (Args.hasArg(options::OPT_pie))
10117 CmdArgs.push_back("-pie");
10118
10119 if (Args.hasArg(options::OPT_rdynamic))
10120 CmdArgs.push_back("-export-dynamic");
10121 if (Args.hasArg(options::OPT_shared))
10122 CmdArgs.push_back("--oformat=so");
10123
10124 if (Output.isFilename()) {
10125 CmdArgs.push_back("-o");
10126 CmdArgs.push_back(Output.getFilename());
10127 } else {
10128 assert(Output.isNothing() && "Invalid output.");
10129 }
10130
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010131 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10132
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010133 Args.AddAllArgs(CmdArgs, options::OPT_L);
10134 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10135 Args.AddAllArgs(CmdArgs, options::OPT_e);
10136 Args.AddAllArgs(CmdArgs, options::OPT_s);
10137 Args.AddAllArgs(CmdArgs, options::OPT_t);
10138 Args.AddAllArgs(CmdArgs, options::OPT_r);
10139
10140 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10141 CmdArgs.push_back("--no-demangle");
10142
10143 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10144
10145 if (Args.hasArg(options::OPT_pthread)) {
10146 CmdArgs.push_back("-lpthread");
10147 }
10148
10149 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010150
10151 const char *Exec = Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10152
10153 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10154}
10155
10156static void ConstructGoldLinkJob(const Tool &T, Compilation &C,
10157 const JobAction &JA, const InputInfo &Output,
10158 const InputInfoList &Inputs,
10159 const ArgList &Args,
10160 const char *LinkingOutput) {
10161 const toolchains::FreeBSD &ToolChain =
10162 static_cast<const toolchains::FreeBSD &>(T.getToolChain());
10163 const Driver &D = ToolChain.getDriver();
10164 ArgStringList CmdArgs;
10165
10166 // Silence warning for "clang -g foo.o -o foo"
10167 Args.ClaimAllArgs(options::OPT_g_Group);
10168 // and "clang -emit-llvm foo.o -o foo"
10169 Args.ClaimAllArgs(options::OPT_emit_llvm);
10170 // and for "clang -w foo.o -o foo". Other warning options are already
10171 // handled somewhere else.
10172 Args.ClaimAllArgs(options::OPT_w);
10173
10174 if (!D.SysRoot.empty())
10175 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
10176
10177 if (Args.hasArg(options::OPT_pie))
10178 CmdArgs.push_back("-pie");
10179
10180 if (Args.hasArg(options::OPT_static)) {
10181 CmdArgs.push_back("-Bstatic");
10182 } else {
10183 if (Args.hasArg(options::OPT_rdynamic))
10184 CmdArgs.push_back("-export-dynamic");
10185 CmdArgs.push_back("--eh-frame-hdr");
10186 if (Args.hasArg(options::OPT_shared)) {
10187 CmdArgs.push_back("-Bshareable");
10188 } else {
10189 CmdArgs.push_back("-dynamic-linker");
10190 CmdArgs.push_back("/libexec/ld-elf.so.1");
10191 }
10192 CmdArgs.push_back("--enable-new-dtags");
10193 }
10194
10195 if (Output.isFilename()) {
10196 CmdArgs.push_back("-o");
10197 CmdArgs.push_back(Output.getFilename());
10198 } else {
10199 assert(Output.isNothing() && "Invalid output.");
10200 }
10201
Filipe Cabecinhas82cd6af2015-10-16 15:07:48 +000010202 AddPS4SanitizerArgs(ToolChain, CmdArgs);
10203
Douglas Katzman78b37b02015-11-17 20:28:07 +000010204 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010205 const char *crt1 = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010206 if (!Args.hasArg(options::OPT_shared)) {
10207 if (Args.hasArg(options::OPT_pg))
10208 crt1 = "gcrt1.o";
10209 else if (Args.hasArg(options::OPT_pie))
10210 crt1 = "Scrt1.o";
10211 else
10212 crt1 = "crt1.o";
10213 }
10214 if (crt1)
10215 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
10216
10217 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
10218
Eugene Zelenkod4304d22015-11-04 21:37:17 +000010219 const char *crtbegin = nullptr;
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010220 if (Args.hasArg(options::OPT_static))
10221 crtbegin = "crtbeginT.o";
10222 else if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10223 crtbegin = "crtbeginS.o";
10224 else
10225 crtbegin = "crtbegin.o";
10226
10227 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
10228 }
10229
10230 Args.AddAllArgs(CmdArgs, options::OPT_L);
Douglas Katzman6059ef92015-11-17 17:41:23 +000010231 ToolChain.AddFilePathLibArgs(Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010232 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
10233 Args.AddAllArgs(CmdArgs, options::OPT_e);
10234 Args.AddAllArgs(CmdArgs, options::OPT_s);
10235 Args.AddAllArgs(CmdArgs, options::OPT_t);
10236 Args.AddAllArgs(CmdArgs, options::OPT_r);
10237
10238 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
10239 CmdArgs.push_back("--no-demangle");
10240
10241 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
10242
Douglas Katzman78b37b02015-11-17 20:28:07 +000010243 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nodefaultlibs)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010244 // For PS4, we always want to pass libm, libstdc++ and libkernel
10245 // libraries for both C and C++ compilations.
10246 CmdArgs.push_back("-lkernel");
10247 if (D.CCCIsCXX()) {
10248 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
10249 if (Args.hasArg(options::OPT_pg))
10250 CmdArgs.push_back("-lm_p");
10251 else
10252 CmdArgs.push_back("-lm");
10253 }
10254 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
10255 // the default system libraries. Just mimic this for now.
10256 if (Args.hasArg(options::OPT_pg))
10257 CmdArgs.push_back("-lgcc_p");
10258 else
10259 CmdArgs.push_back("-lcompiler_rt");
10260 if (Args.hasArg(options::OPT_static)) {
10261 CmdArgs.push_back("-lstdc++");
10262 } else if (Args.hasArg(options::OPT_pg)) {
10263 CmdArgs.push_back("-lgcc_eh_p");
10264 } else {
10265 CmdArgs.push_back("--as-needed");
10266 CmdArgs.push_back("-lstdc++");
10267 CmdArgs.push_back("--no-as-needed");
10268 }
10269
10270 if (Args.hasArg(options::OPT_pthread)) {
10271 if (Args.hasArg(options::OPT_pg))
10272 CmdArgs.push_back("-lpthread_p");
10273 else
10274 CmdArgs.push_back("-lpthread");
10275 }
10276
10277 if (Args.hasArg(options::OPT_pg)) {
10278 if (Args.hasArg(options::OPT_shared))
10279 CmdArgs.push_back("-lc");
10280 else {
10281 if (Args.hasArg(options::OPT_static)) {
10282 CmdArgs.push_back("--start-group");
10283 CmdArgs.push_back("-lc_p");
10284 CmdArgs.push_back("-lpthread_p");
10285 CmdArgs.push_back("--end-group");
10286 } else {
10287 CmdArgs.push_back("-lc_p");
10288 }
10289 }
10290 CmdArgs.push_back("-lgcc_p");
10291 } else {
10292 if (Args.hasArg(options::OPT_static)) {
10293 CmdArgs.push_back("--start-group");
10294 CmdArgs.push_back("-lc");
10295 CmdArgs.push_back("-lpthread");
10296 CmdArgs.push_back("--end-group");
10297 } else {
10298 CmdArgs.push_back("-lc");
10299 }
10300 CmdArgs.push_back("-lcompiler_rt");
10301 }
10302
10303 if (Args.hasArg(options::OPT_static)) {
10304 CmdArgs.push_back("-lstdc++");
10305 } else if (Args.hasArg(options::OPT_pg)) {
10306 CmdArgs.push_back("-lgcc_eh_p");
10307 } else {
10308 CmdArgs.push_back("--as-needed");
10309 CmdArgs.push_back("-lstdc++");
10310 CmdArgs.push_back("--no-as-needed");
10311 }
10312 }
10313
Douglas Katzman78b37b02015-11-17 20:28:07 +000010314 if (!Args.hasArg(options::OPT_nostdlib, options::OPT_nostartfiles)) {
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010315 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
10316 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
10317 else
10318 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
10319 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
10320 }
10321
10322 AddPS4ProfileRT(ToolChain, Args, CmdArgs);
Filipe Cabecinhasc888e192015-10-14 12:25:43 +000010323
10324 const char *Exec =
10325#ifdef LLVM_ON_WIN32
10326 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld.gold.exe"));
10327#else
10328 Args.MakeArgString(ToolChain.GetProgramPath("ps4-ld"));
10329#endif
10330
10331 C.addCommand(llvm::make_unique<Command>(JA, T, Exec, CmdArgs, Inputs));
10332}
10333
10334void PS4cpu::Link::ConstructJob(Compilation &C, const JobAction &JA,
10335 const InputInfo &Output,
10336 const InputInfoList &Inputs,
10337 const ArgList &Args,
10338 const char *LinkingOutput) const {
10339 const toolchains::FreeBSD &ToolChain =
10340 static_cast<const toolchains::FreeBSD &>(getToolChain());
10341 const Driver &D = ToolChain.getDriver();
10342 bool PS4Linker;
10343 StringRef LinkerOptName;
10344 if (const Arg *A = Args.getLastArg(options::OPT_fuse_ld_EQ)) {
10345 LinkerOptName = A->getValue();
10346 if (LinkerOptName != "ps4" && LinkerOptName != "gold")
10347 D.Diag(diag::err_drv_unsupported_linker) << LinkerOptName;
10348 }
10349
10350 if (LinkerOptName == "gold")
10351 PS4Linker = false;
10352 else if (LinkerOptName == "ps4")
10353 PS4Linker = true;
10354 else
10355 PS4Linker = !Args.hasArg(options::OPT_shared);
10356
10357 if (PS4Linker)
10358 ConstructPS4LinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10359 else
10360 ConstructGoldLinkJob(*this, C, JA, Output, Inputs, Args, LinkingOutput);
10361}