blob: f652fadf0f32c3d47b1d2d3cfa3fbde7915ac106 [file] [log] [blame]
Nick Lewyckye47c2452010-09-23 23:48:20 +00001//===--- Tools.cpp - Tools Implementations --------------------------------===//
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"
Josh Mageee0fc1a82014-02-11 01:35:14 +000013#include "clang/Basic/LangOptions.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000014#include "clang/Basic/ObjCRuntime.h"
Kevin Enderbyae2ec472013-01-17 21:38:06 +000015#include "clang/Basic/Version.h"
Daniel Dunbara2aedc62009-03-18 10:01:51 +000016#include "clang/Driver/Action.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000017#include "clang/Driver/Compilation.h"
Daniel Dunbar1a8a2e82009-10-29 02:39:57 +000018#include "clang/Driver/Driver.h"
19#include "clang/Driver/DriverDiagnostic.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000020#include "clang/Driver/Job.h"
Daniel Dunbarda13faf2009-11-19 04:25:22 +000021#include "clang/Driver/Options.h"
Alexey Samsonov609213f92013-08-19 09:14:21 +000022#include "clang/Driver/SanitizerArgs.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000023#include "clang/Driver/ToolChain.h"
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000024#include "clang/Driver/Util.h"
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +000025#include "llvm/ADT/SmallString.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000026#include "llvm/ADT/StringExtras.h"
Douglas Gregorf7b87cb2009-10-29 00:41:01 +000027#include "llvm/ADT/StringSwitch.h"
Daniel Dunbarb4a3e432009-09-09 22:32:34 +000028#include "llvm/ADT/Twine.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000029#include "llvm/Option/Arg.h"
30#include "llvm/Option/ArgList.h"
31#include "llvm/Option/Option.h"
David Blaikie24bbfed22014-03-31 23:29:38 +000032#include "llvm/Support/Compression.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000033#include "llvm/Support/ErrorHandling.h"
Michael J. Spencerf6efe582011-01-10 02:34:13 +000034#include "llvm/Support/FileSystem.h"
Daniel Dunbarc1964212009-03-26 16:23:12 +000035#include "llvm/Support/Format.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000036#include "llvm/Support/Host.h"
Hans Wennborg188382e2013-09-20 18:16:35 +000037#include "llvm/Support/Path.h"
Michael J. Spencer8aaf4992010-11-29 18:12:39 +000038#include "llvm/Support/Process.h"
Chandler Carruth5553d0d2014-01-07 11:51:46 +000039#include "llvm/Support/Program.h"
Chandler Carruth3a022472012-12-04 09:13:33 +000040#include "llvm/Support/raw_ostream.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000041#include <sys/stat.h>
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000042
Daniel Dunbar1a093d22009-03-18 06:00:36 +000043using namespace clang::driver;
44using namespace clang::driver::tools;
Chris Lattner0e62c1c2011-07-23 10:55:15 +000045using namespace clang;
Reid Kleckner898229a2013-06-14 17:17:23 +000046using namespace llvm::opt;
Daniel Dunbar1a093d22009-03-18 06:00:36 +000047
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +000048static void addAssemblerKPIC(const ArgList &Args, ArgStringList &CmdArgs) {
49 Arg *LastPICArg = Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
50 options::OPT_fpic, options::OPT_fno_pic,
51 options::OPT_fPIE, options::OPT_fno_PIE,
52 options::OPT_fpie, options::OPT_fno_pie);
53 if (!LastPICArg)
54 return;
55 if (LastPICArg->getOption().matches(options::OPT_fPIC) ||
56 LastPICArg->getOption().matches(options::OPT_fpic) ||
57 LastPICArg->getOption().matches(options::OPT_fPIE) ||
58 LastPICArg->getOption().matches(options::OPT_fpie)) {
59 CmdArgs.push_back("-KPIC");
60 }
61}
62
Daniel Dunbar64198ef2009-09-10 01:21:05 +000063/// CheckPreprocessingOptions - Perform some validation of preprocessing
64/// arguments that is shared with gcc.
65static void CheckPreprocessingOptions(const Driver &D, const ArgList &Args) {
Hans Wennborg8f008372014-06-11 19:44:53 +000066 if (Arg *A = Args.getLastArg(options::OPT_C, options::OPT_CC)) {
67 if (!Args.hasArg(options::OPT_E) && !Args.hasArg(options::OPT__SLASH_P) &&
68 !Args.hasArg(options::OPT__SLASH_EP) && !D.CCCIsCPP()) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +000069 D.Diag(diag::err_drv_argument_only_allowed_with)
Hans Wennborg8f008372014-06-11 19:44:53 +000070 << A->getBaseArg().getAsString(Args)
71 << (D.IsCLMode() ? "/E, /P or /EP" : "-E");
72 }
73 }
Daniel Dunbar64198ef2009-09-10 01:21:05 +000074}
75
Daniel Dunbar4eadb602009-09-10 01:21:12 +000076/// CheckCodeGenerationOptions - Perform some validation of code generation
77/// arguments that is shared with gcc.
78static void CheckCodeGenerationOptions(const Driver &D, const ArgList &Args) {
79 // In gcc, only ARM checks this, but it seems reasonable to check universally.
80 if (Args.hasArg(options::OPT_static))
81 if (const Arg *A = Args.getLastArg(options::OPT_dynamic,
82 options::OPT_mdynamic_no_pic))
Chris Lattner0e62c1c2011-07-23 10:55:15 +000083 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbar4eadb602009-09-10 01:21:12 +000084 << A->getAsString(Args) << "-static";
85}
86
Chris Lattnerbf2803f2010-03-29 17:55:58 +000087// Quote target names for inclusion in GNU Make dependency files.
88// Only the characters '$', '#', ' ', '\t' are quoted.
Chris Lattner0e62c1c2011-07-23 10:55:15 +000089static void QuoteTarget(StringRef Target,
90 SmallVectorImpl<char> &Res) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +000091 for (unsigned i = 0, e = Target.size(); i != e; ++i) {
92 switch (Target[i]) {
93 case ' ':
94 case '\t':
95 // Escape the preceding backslashes
96 for (int j = i - 1; j >= 0 && Target[j] == '\\'; --j)
97 Res.push_back('\\');
98
99 // Escape the space/tab
100 Res.push_back('\\');
101 break;
102 case '$':
103 Res.push_back('$');
104 break;
105 case '#':
106 Res.push_back('\\');
107 break;
108 default:
109 break;
110 }
111
112 Res.push_back(Target[i]);
113 }
114}
115
Bill Wendlingc0938f32012-03-12 22:10:06 +0000116static void addDirectoryList(const ArgList &Args,
Bill Wendling281ca292012-03-12 21:22:35 +0000117 ArgStringList &CmdArgs,
118 const char *ArgName,
Bill Wendlingc0938f32012-03-12 22:10:06 +0000119 const char *EnvVar) {
120 const char *DirList = ::getenv(EnvVar);
Chad Rosier616e8a52012-10-30 21:42:09 +0000121 bool CombinedArg = false;
122
Bill Wendling281ca292012-03-12 21:22:35 +0000123 if (!DirList)
124 return; // Nothing to do.
125
Chad Rosier616e8a52012-10-30 21:42:09 +0000126 StringRef Name(ArgName);
127 if (Name.equals("-I") || Name.equals("-L"))
128 CombinedArg = true;
129
Bill Wendling281ca292012-03-12 21:22:35 +0000130 StringRef Dirs(DirList);
131 if (Dirs.empty()) // Empty string should not add '.'.
132 return;
133
134 StringRef::size_type Delim;
Rafael Espindola04b3fc42013-06-25 14:29:51 +0000135 while ((Delim = Dirs.find(llvm::sys::EnvPathSeparator)) != StringRef::npos) {
Bill Wendling281ca292012-03-12 21:22:35 +0000136 if (Delim == 0) { // Leading colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000137 if (CombinedArg) {
138 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
139 } else {
140 CmdArgs.push_back(ArgName);
141 CmdArgs.push_back(".");
142 }
Bill Wendling281ca292012-03-12 21:22:35 +0000143 } else {
Chad Rosier616e8a52012-10-30 21:42:09 +0000144 if (CombinedArg) {
145 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs.substr(0, Delim)));
146 } else {
147 CmdArgs.push_back(ArgName);
148 CmdArgs.push_back(Args.MakeArgString(Dirs.substr(0, Delim)));
149 }
Bill Wendling281ca292012-03-12 21:22:35 +0000150 }
Nico Weber89355782012-03-19 15:00:03 +0000151 Dirs = Dirs.substr(Delim + 1);
Bill Wendling281ca292012-03-12 21:22:35 +0000152 }
153
154 if (Dirs.empty()) { // Trailing colon.
Chad Rosier616e8a52012-10-30 21:42:09 +0000155 if (CombinedArg) {
156 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + "."));
157 } else {
158 CmdArgs.push_back(ArgName);
159 CmdArgs.push_back(".");
160 }
Bill Wendling281ca292012-03-12 21:22:35 +0000161 } else { // Add the last path.
Chad Rosier616e8a52012-10-30 21:42:09 +0000162 if (CombinedArg) {
163 CmdArgs.push_back(Args.MakeArgString(std::string(ArgName) + Dirs));
164 } else {
165 CmdArgs.push_back(ArgName);
166 CmdArgs.push_back(Args.MakeArgString(Dirs));
167 }
Bill Wendling281ca292012-03-12 21:22:35 +0000168 }
169}
170
Daniel Dunbar54423b22010-09-17 00:24:54 +0000171static void AddLinkerInputs(const ToolChain &TC,
172 const InputInfoList &Inputs, const ArgList &Args,
173 ArgStringList &CmdArgs) {
174 const Driver &D = TC.getDriver();
175
Daniel Dunbar1094bb12011-02-19 05:33:51 +0000176 // Add extra linker input arguments which are not treated as inputs
177 // (constructed via -Xarch_).
178 Args.AddAllArgValues(CmdArgs, options::OPT_Zlinker_input);
179
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000180 for (const auto &II : Inputs) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000181 if (!TC.HasNativeLLVMSupport()) {
182 // Don't try to pass LLVM inputs unless we have native support.
183 if (II.getType() == types::TY_LLVM_IR ||
184 II.getType() == types::TY_LTO_IR ||
185 II.getType() == types::TY_LLVM_BC ||
186 II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000187 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar54423b22010-09-17 00:24:54 +0000188 << TC.getTripleString();
189 }
190
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000191 // Add filenames immediately.
192 if (II.isFilename()) {
Daniel Dunbar54423b22010-09-17 00:24:54 +0000193 CmdArgs.push_back(II.getFilename());
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000194 continue;
195 }
196
197 // Otherwise, this is a linker input argument.
198 const Arg &A = II.getInputArg();
199
200 // Handle reserved library options.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000201 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx))
Daniel Dunbar3f7796f2010-09-17 01:20:05 +0000202 TC.AddCXXStdlibLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000203 else if (A.getOption().matches(options::OPT_Z_reserved_lib_cckext))
Shantonu Senafeb03b2010-09-17 18:39:08 +0000204 TC.AddCCKextLibArgs(Args, CmdArgs);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +0000205 else
Daniel Dunbar2cc3f172010-09-17 00:45:02 +0000206 A.renderAsInput(Args, CmdArgs);
Daniel Dunbar54423b22010-09-17 00:24:54 +0000207 }
Bill Wendling281ca292012-03-12 21:22:35 +0000208
209 // LIBRARY_PATH - included following the user specified library paths.
Richard Barton5828d7b2013-12-17 11:11:25 +0000210 // and only supported on native toolchains.
211 if (!TC.isCrossCompiling())
212 addDirectoryList(Args, CmdArgs, "-L", "LIBRARY_PATH");
Daniel Dunbar54423b22010-09-17 00:24:54 +0000213}
214
John McCall31168b02011-06-15 23:02:42 +0000215/// \brief Determine whether Objective-C automated reference counting is
216/// enabled.
217static bool isObjCAutoRefCount(const ArgList &Args) {
218 return Args.hasFlag(options::OPT_fobjc_arc, options::OPT_fno_objc_arc, false);
219}
220
Ted Kremeneke65b0862012-03-06 20:05:56 +0000221/// \brief Determine whether we are linking the ObjC runtime.
222static bool isObjCRuntimeLinked(const ArgList &Args) {
Bob Wilson29536fc2012-08-07 19:58:00 +0000223 if (isObjCAutoRefCount(Args)) {
224 Args.ClaimAllArgs(options::OPT_fobjc_link_runtime);
Ted Kremeneke65b0862012-03-06 20:05:56 +0000225 return true;
Bob Wilson29536fc2012-08-07 19:58:00 +0000226 }
Ted Kremeneke65b0862012-03-06 20:05:56 +0000227 return Args.hasArg(options::OPT_fobjc_link_runtime);
228}
229
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000230static bool forwardToGCC(const Option &O) {
Reid Kleckner3793d5e2013-06-19 15:09:06 +0000231 // Don't forward inputs from the original command line. They are added from
232 // InputInfoList.
Richard Smith8e5e9762013-06-20 01:33:59 +0000233 return O.getKind() != Option::InputClass &&
Michael J. Spencer66e2b202012-10-19 22:37:06 +0000234 !O.hasFlag(options::DriverOption) &&
235 !O.hasFlag(options::LinkerInput);
236}
237
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000238void Clang::AddPreprocessingOptions(Compilation &C,
Chad Rosier633dcdc2013-01-24 19:14:47 +0000239 const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +0000240 const Driver &D,
Douglas Gregor111af7d2009-04-18 00:34:01 +0000241 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000242 ArgStringList &CmdArgs,
243 const InputInfo &Output,
244 const InputInfoList &Inputs) const {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000245 Arg *A;
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000246
Daniel Dunbar64198ef2009-09-10 01:21:05 +0000247 CheckPreprocessingOptions(D, Args);
248
249 Args.AddLastArg(CmdArgs, options::OPT_C);
250 Args.AddLastArg(CmdArgs, options::OPT_CC);
Daniel Dunbar367dbb92009-06-08 21:48:20 +0000251
252 // Handle dependency file generation.
Daniel Dunbar86aed7d2010-12-08 21:33:40 +0000253 if ((A = Args.getLastArg(options::OPT_M, options::OPT_MM)) ||
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000254 (A = Args.getLastArg(options::OPT_MD)) ||
255 (A = Args.getLastArg(options::OPT_MMD))) {
256 // Determine the output location.
257 const char *DepFile;
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000258 if (Arg *MF = Args.getLastArg(options::OPT_MF)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000259 DepFile = MF->getValue();
Chad Rosier633dcdc2013-01-24 19:14:47 +0000260 C.addFailureResultFile(DepFile, &JA);
Benjamin Kramer2715fce2012-09-26 19:01:49 +0000261 } else if (Output.getType() == types::TY_Dependencies) {
262 DepFile = Output.getFilename();
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000263 } else if (A->getOption().matches(options::OPT_M) ||
264 A->getOption().matches(options::OPT_MM)) {
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000265 DepFile = "-";
266 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +0000267 DepFile = getDependencyFileName(Args, Inputs);
Chad Rosier633dcdc2013-01-24 19:14:47 +0000268 C.addFailureResultFile(DepFile, &JA);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000269 }
270 CmdArgs.push_back("-dependency-file");
271 CmdArgs.push_back(DepFile);
272
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000273 // Add a default target if one wasn't specified.
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000274 if (!Args.hasArg(options::OPT_MT) && !Args.hasArg(options::OPT_MQ)) {
275 const char *DepTarget;
276
277 // If user provided -o, that is the dependency target, except
278 // when we are only generating a dependency file.
279 Arg *OutputOpt = Args.getLastArg(options::OPT_o);
280 if (OutputOpt && Output.getType() != types::TY_Dependencies) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000281 DepTarget = OutputOpt->getValue();
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000282 } else {
283 // Otherwise derive from the base input.
284 //
285 // FIXME: This should use the computed output file location.
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000286 SmallString<128> P(Inputs[0].getBaseInput());
Michael J. Spencere1696752010-12-18 00:19:12 +0000287 llvm::sys::path::replace_extension(P, "o");
288 DepTarget = Args.MakeArgString(llvm::sys::path::filename(P));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000289 }
290
291 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000292 SmallString<128> Quoted;
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000293 QuoteTarget(DepTarget, Quoted);
294 CmdArgs.push_back(Args.MakeArgString(Quoted));
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000295 }
296
Daniel Dunbar0bfb21e2009-11-19 03:26:40 +0000297 if (A->getOption().matches(options::OPT_M) ||
298 A->getOption().matches(options::OPT_MD))
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000299 CmdArgs.push_back("-sys-header-deps");
Argyrios Kyrtzidis6d0753d2014-03-14 03:07:38 +0000300
301 if (isa<PrecompileJobAction>(JA))
302 CmdArgs.push_back("-module-file-deps");
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000303 }
304
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000305 if (Args.hasArg(options::OPT_MG)) {
306 if (!A || A->getOption().matches(options::OPT_MD) ||
307 A->getOption().matches(options::OPT_MMD))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000308 D.Diag(diag::err_drv_mg_requires_m_or_mm);
Peter Collingbourne77b0e7f22011-07-12 19:35:15 +0000309 CmdArgs.push_back("-MG");
310 }
311
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000312 Args.AddLastArg(CmdArgs, options::OPT_MP);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000313
314 // Convert all -MQ <target> args to -MT <quoted target>
315 for (arg_iterator it = Args.filtered_begin(options::OPT_MT,
316 options::OPT_MQ),
317 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000318 const Arg *A = *it;
319 A->claim();
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000320
Daniel Dunbara442fd52010-06-11 22:00:13 +0000321 if (A->getOption().matches(options::OPT_MQ)) {
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000322 CmdArgs.push_back("-MT");
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +0000323 SmallString<128> Quoted;
Richard Smithbd55daf2012-11-01 04:30:05 +0000324 QuoteTarget(A->getValue(), Quoted);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000325 CmdArgs.push_back(Args.MakeArgString(Quoted));
326
327 // -MT flag - no change
328 } else {
Daniel Dunbara442fd52010-06-11 22:00:13 +0000329 A->render(Args, CmdArgs);
Chris Lattnerbf2803f2010-03-29 17:55:58 +0000330 }
331 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000332
Douglas Gregor111af7d2009-04-18 00:34:01 +0000333 // Add -i* options, and automatically translate to
334 // -include-pch/-include-pth for transparent PCH support. It's
335 // wonky, but we include looking for .gch so we can support seamless
336 // replacement into a build system already set up to be generating
337 // .gch files.
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000338 bool RenderedImplicitInclude = false;
Daniel Dunbar44b36ee2009-11-25 11:53:23 +0000339 for (arg_iterator it = Args.filtered_begin(options::OPT_clang_i_Group),
340 ie = Args.filtered_end(); it != ie; ++it) {
341 const Arg *A = it;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000342
343 if (A->getOption().matches(options::OPT_include)) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000344 bool IsFirstImplicitInclude = !RenderedImplicitInclude;
345 RenderedImplicitInclude = true;
346
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +0000347 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000348 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000349
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000350 bool FoundPTH = false;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000351 bool FoundPCH = false;
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000352 SmallString<128> P(A->getValue());
353 // We want the files to have a name like foo.h.pch. Add a dummy extension
354 // so that replace_extension does the right thing.
355 P += ".dummy";
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000356 if (UsePCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000357 llvm::sys::path::replace_extension(P, "pch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000358 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000359 FoundPCH = true;
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000360 }
361
Douglas Gregor111af7d2009-04-18 00:34:01 +0000362 if (!FoundPCH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000363 llvm::sys::path::replace_extension(P, "pth");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000364 if (llvm::sys::fs::exists(P.str()))
Douglas Gregor111af7d2009-04-18 00:34:01 +0000365 FoundPTH = true;
Mike Stump11289f42009-09-09 15:08:12 +0000366 }
367
Douglas Gregor111af7d2009-04-18 00:34:01 +0000368 if (!FoundPCH && !FoundPTH) {
Rafael Espindola00eaafd2013-06-25 15:03:59 +0000369 llvm::sys::path::replace_extension(P, "gch");
Rafael Espindola54bbaad2013-06-25 14:48:00 +0000370 if (llvm::sys::fs::exists(P.str())) {
Daniel Dunbarcbc34b72009-10-15 20:02:44 +0000371 FoundPCH = UsePCH;
372 FoundPTH = !UsePCH;
Douglas Gregor111af7d2009-04-18 00:34:01 +0000373 }
Douglas Gregor111af7d2009-04-18 00:34:01 +0000374 }
375
376 if (FoundPCH || FoundPTH) {
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000377 if (IsFirstImplicitInclude) {
378 A->claim();
379 if (UsePCH)
380 CmdArgs.push_back("-include-pch");
381 else
382 CmdArgs.push_back("-include-pth");
383 CmdArgs.push_back(Args.MakeArgString(P.str()));
384 continue;
385 } else {
386 // Ignore the PCH if not first on command line and emit warning.
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000387 D.Diag(diag::warn_drv_pch_not_first_include)
Argyrios Kyrtzidis2f23b412010-09-30 16:53:47 +0000388 << P.str() << A->getAsString(Args);
389 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000390 }
391 }
392
393 // Not translated, render as usual.
394 A->claim();
395 A->render(Args, CmdArgs);
396 }
397
398 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
Douglas Gregor9f93e382011-07-28 04:45:53 +0000399 Args.AddAllArgs(CmdArgs, options::OPT_I_Group, options::OPT_F,
400 options::OPT_index_header_map);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000401
402 // Add -Wp, and -Xassembler if using the preprocessor.
403
404 // FIXME: There is a very unfortunate problem here, some troubled
405 // souls abuse -Wp, to pass preprocessor options in gcc syntax. To
406 // really support that we would have to parse and then translate
407 // those options. :(
408 Args.AddAllArgValues(CmdArgs, options::OPT_Wp_COMMA,
409 options::OPT_Xpreprocessor);
Daniel Dunbar38b62792009-10-29 01:53:44 +0000410
411 // -I- is a deprecated GCC feature, reject it.
412 if (Arg *A = Args.getLastArg(options::OPT_I_))
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000413 D.Diag(diag::err_drv_I_dash_not_supported) << A->getAsString(Args);
Chandler Carruth24e17e12010-10-20 07:00:47 +0000414
415 // If we have a --sysroot, and don't have an explicit -isysroot flag, add an
416 // -isysroot to the CC1 invocation.
Sebastian Pop980920a2012-04-16 04:16:43 +0000417 StringRef sysroot = C.getSysRoot();
418 if (sysroot != "") {
Chandler Carruth24e17e12010-10-20 07:00:47 +0000419 if (!Args.hasArg(options::OPT_isysroot)) {
420 CmdArgs.push_back("-isysroot");
Sebastian Pop980920a2012-04-16 04:16:43 +0000421 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Chandler Carruth24e17e12010-10-20 07:00:47 +0000422 }
423 }
Douglas Gregor5dc38992013-02-07 00:21:12 +0000424
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000425 // Parse additional include paths from environment variables.
Chandler Carruth9802c142011-11-04 07:12:58 +0000426 // FIXME: We should probably sink the logic for handling these from the
427 // frontend into the driver. It will allow deleting 4 otherwise unused flags.
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000428 // CPATH - included following the user specified includes (but prior to
429 // builtin and standard includes).
Bill Wendlingc0938f32012-03-12 22:10:06 +0000430 addDirectoryList(Args, CmdArgs, "-I", "CPATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000431 // C_INCLUDE_PATH - system includes enabled when compiling C.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000432 addDirectoryList(Args, CmdArgs, "-c-isystem", "C_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000433 // CPLUS_INCLUDE_PATH - system includes enabled when compiling C++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000434 addDirectoryList(Args, CmdArgs, "-cxx-isystem", "CPLUS_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000435 // OBJC_INCLUDE_PATH - system includes enabled when compiling ObjC.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000436 addDirectoryList(Args, CmdArgs, "-objc-isystem", "OBJC_INCLUDE_PATH");
Benjamin Kramer8404eb02011-09-22 21:41:16 +0000437 // OBJCPLUS_INCLUDE_PATH - system includes enabled when compiling ObjC++.
Bill Wendlingc0938f32012-03-12 22:10:06 +0000438 addDirectoryList(Args, CmdArgs, "-objcxx-isystem", "OBJCPLUS_INCLUDE_PATH");
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000439
Chandler Carruth6bfd84f2011-11-04 07:12:53 +0000440 // Add C++ include arguments, if needed.
Chandler Carruth4c81dfa2011-11-04 07:43:33 +0000441 if (types::isCXX(Inputs[0].getType()))
Chandler Carruth491db322011-11-04 07:34:47 +0000442 getToolChain().AddClangCXXStdlibIncludeArgs(Args, CmdArgs);
Chandler Carrutha796f532011-11-05 20:17:13 +0000443
444 // Add system include arguments.
445 getToolChain().AddClangSystemIncludeArgs(Args, CmdArgs);
Daniel Dunbard067f7f2009-04-08 23:54:23 +0000446}
447
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000448// FIXME: Move to target hook.
449static bool isSignedCharDefault(const llvm::Triple &Triple) {
450 switch (Triple.getArch()) {
451 default:
452 return true;
453
Tim Northover9bb857a2013-01-31 12:13:10 +0000454 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +0000455 case llvm::Triple::aarch64_be:
Tim Northovera2ee4332014-03-29 15:09:45 +0000456 case llvm::Triple::arm64:
James Molloy2b24fc42014-04-17 12:51:23 +0000457 case llvm::Triple::arm64_be:
Jim Grosbach7c2c6642011-05-24 15:40:46 +0000458 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +0000459 case llvm::Triple::armeb:
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000460 if (Triple.isOSDarwin() || Triple.isOSWindows())
461 return true;
462 return false;
463
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000464 case llvm::Triple::ppc:
465 case llvm::Triple::ppc64:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000466 if (Triple.isOSDarwin())
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000467 return true;
468 return false;
Ulrich Weigand47445072013-05-06 16:26:41 +0000469
Bill Schmidt778d3872013-07-26 01:36:11 +0000470 case llvm::Triple::ppc64le:
Ulrich Weigand47445072013-05-06 16:26:41 +0000471 case llvm::Triple::systemz:
Robert Lytton0e076492013-08-13 09:43:10 +0000472 case llvm::Triple::xcore:
Ulrich Weigand47445072013-05-06 16:26:41 +0000473 return false;
Daniel Dunbard609b7b2009-11-17 06:37:03 +0000474 }
475}
476
Robert Lytton0e076492013-08-13 09:43:10 +0000477static bool isNoCommonDefault(const llvm::Triple &Triple) {
478 switch (Triple.getArch()) {
479 default:
480 return false;
481
482 case llvm::Triple::xcore:
483 return true;
484 }
485}
486
Chad Rosiercfbfc582012-04-04 20:51:35 +0000487// Handle -mfpu=.
488//
489// FIXME: Centralize feature selection, defaulting shouldn't be also in the
490// frontend target.
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000491static void getAArch64FPUFeatures(const Driver &D, const Arg *A,
492 const ArgList &Args,
493 std::vector<const char *> &Features) {
494 StringRef FPU = A->getValue();
495 if (FPU == "fp-armv8") {
496 Features.push_back("+fp-armv8");
497 } else if (FPU == "neon-fp-armv8") {
498 Features.push_back("+fp-armv8");
499 Features.push_back("+neon");
500 } else if (FPU == "crypto-neon-fp-armv8") {
501 Features.push_back("+fp-armv8");
502 Features.push_back("+neon");
503 Features.push_back("+crypto");
504 } else if (FPU == "neon") {
505 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000506 } else
507 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
508}
509
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000510// Handle -mhwdiv=.
511static void getARMHWDivFeatures(const Driver &D, const Arg *A,
512 const ArgList &Args,
513 std::vector<const char *> &Features) {
514 StringRef HWDiv = A->getValue();
515 if (HWDiv == "arm") {
516 Features.push_back("+hwdiv-arm");
517 Features.push_back("-hwdiv");
518 } else if (HWDiv == "thumb") {
519 Features.push_back("-hwdiv-arm");
520 Features.push_back("+hwdiv");
521 } else if (HWDiv == "arm,thumb" || HWDiv == "thumb,arm") {
522 Features.push_back("+hwdiv-arm");
523 Features.push_back("+hwdiv");
524 } else if (HWDiv == "none") {
525 Features.push_back("-hwdiv-arm");
526 Features.push_back("-hwdiv");
527 } else
528 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
529}
530
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000531// Handle -mfpu=.
532//
533// FIXME: Centralize feature selection, defaulting shouldn't be also in the
534// frontend target.
535static void getARMFPUFeatures(const Driver &D, const Arg *A,
536 const ArgList &Args,
537 std::vector<const char *> &Features) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000538 StringRef FPU = A->getValue();
Chad Rosiercfbfc582012-04-04 20:51:35 +0000539
540 // Set the target features based on the FPU.
541 if (FPU == "fpa" || FPU == "fpe2" || FPU == "fpe3" || FPU == "maverick") {
542 // Disable any default FPU support.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000543 Features.push_back("-vfp2");
544 Features.push_back("-vfp3");
545 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000546 } else if (FPU == "vfp") {
547 Features.push_back("+vfp2");
548 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000549 } else if (FPU == "vfp3-d16" || FPU == "vfpv3-d16") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000550 Features.push_back("+vfp3");
551 Features.push_back("+d16");
552 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000553 } else if (FPU == "vfp3" || FPU == "vfpv3") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000554 Features.push_back("+vfp3");
555 Features.push_back("-neon");
Artyom Skrobov53b000a82013-11-21 14:04:38 +0000556 } else if (FPU == "vfp4-d16" || FPU == "vfpv4-d16") {
557 Features.push_back("+vfp4");
558 Features.push_back("+d16");
559 Features.push_back("-neon");
560 } else if (FPU == "vfp4" || FPU == "vfpv4") {
561 Features.push_back("+vfp4");
562 Features.push_back("-neon");
Oliver Stannard96601ca2014-02-21 10:39:15 +0000563 } else if (FPU == "fp4-sp-d16" || FPU == "fpv4-sp-d16") {
564 Features.push_back("+vfp4");
565 Features.push_back("+d16");
566 Features.push_back("+fp-only-sp");
567 Features.push_back("-neon");
Joey Gouly7db275b2013-06-27 13:19:54 +0000568 } else if (FPU == "fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000569 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000570 Features.push_back("-neon");
571 Features.push_back("-crypto");
Joey Gouly7db275b2013-06-27 13:19:54 +0000572 } else if (FPU == "neon-fp-armv8") {
Joey Goulybe8c2732013-09-13 13:48:33 +0000573 Features.push_back("+fp-armv8");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000574 Features.push_back("+neon");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000575 Features.push_back("-crypto");
Amara Emersonfc362c62013-09-19 13:54:03 +0000576 } else if (FPU == "crypto-neon-fp-armv8") {
Amara Emersonfc362c62013-09-19 13:54:03 +0000577 Features.push_back("+fp-armv8");
Bernard Ogdenda13af32013-10-24 18:32:51 +0000578 Features.push_back("+neon");
579 Features.push_back("+crypto");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000580 } else if (FPU == "neon") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000581 Features.push_back("+neon");
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000582 } else if (FPU == "none") {
583 Features.push_back("-vfp2");
584 Features.push_back("-vfp3");
585 Features.push_back("-vfp4");
586 Features.push_back("-fp-armv8");
587 Features.push_back("-crypto");
588 Features.push_back("-neon");
Chad Rosiercfbfc582012-04-04 20:51:35 +0000589 } else
590 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
591}
592
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000593// Select the float ABI as determined by -msoft-float, -mhard-float, and
594// -mfloat-abi=.
Tim Northover9c7e0352013-12-12 11:55:52 +0000595StringRef tools::arm::getARMFloatABI(const Driver &D, const ArgList &Args,
596 const llvm::Triple &Triple) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000597 StringRef FloatABI;
Daniel Dunbar78485922009-09-10 23:00:09 +0000598 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
599 options::OPT_mhard_float,
600 options::OPT_mfloat_abi_EQ)) {
601 if (A->getOption().matches(options::OPT_msoft_float))
602 FloatABI = "soft";
603 else if (A->getOption().matches(options::OPT_mhard_float))
604 FloatABI = "hard";
605 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000606 FloatABI = A->getValue();
Daniel Dunbar78485922009-09-10 23:00:09 +0000607 if (FloatABI != "soft" && FloatABI != "softfp" && FloatABI != "hard") {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000608 D.Diag(diag::err_drv_invalid_mfloat_abi)
Daniel Dunbar78485922009-09-10 23:00:09 +0000609 << A->getAsString(Args);
610 FloatABI = "soft";
611 }
612 }
613 }
614
615 // If unspecified, choose the default based on the platform.
616 if (FloatABI.empty()) {
Rafael Espindola0e1fb4f2010-06-28 17:18:09 +0000617 switch (Triple.getOS()) {
Bob Wilson6524dd32011-10-14 05:03:44 +0000618 case llvm::Triple::Darwin:
619 case llvm::Triple::MacOSX:
620 case llvm::Triple::IOS: {
Daniel Dunbar78485922009-09-10 23:00:09 +0000621 // Darwin defaults to "softfp" for v6 and v7.
622 //
623 // FIXME: Factor out an ARM class so we can cache the arch somewhere.
Benjamin Kramer09811c72012-06-26 22:20:06 +0000624 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000625 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000626 if (StringRef(ArchName).startswith("v6") ||
627 StringRef(ArchName).startswith("v7"))
Daniel Dunbar78485922009-09-10 23:00:09 +0000628 FloatABI = "softfp";
629 else
630 FloatABI = "soft";
631 break;
632 }
633
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000634 // FIXME: this is invalid for WindowsCE
635 case llvm::Triple::Win32:
636 FloatABI = "hard";
637 break;
638
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000639 case llvm::Triple::FreeBSD:
Renato Golinf4421f72014-02-19 10:44:07 +0000640 switch(Triple.getEnvironment()) {
641 case llvm::Triple::GNUEABIHF:
642 FloatABI = "hard";
643 break;
644 default:
645 // FreeBSD defaults to soft float
646 FloatABI = "soft";
647 break;
648 }
Rafael Espindola0f207ed2012-12-13 04:17:14 +0000649 break;
650
Daniel Dunbar78485922009-09-10 23:00:09 +0000651 default:
Bob Wilsond1447c42011-02-04 17:59:28 +0000652 switch(Triple.getEnvironment()) {
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000653 case llvm::Triple::GNUEABIHF:
654 FloatABI = "hard";
655 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000656 case llvm::Triple::GNUEABI:
657 FloatABI = "softfp";
658 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000659 case llvm::Triple::EABIHF:
660 FloatABI = "hard";
661 break;
Bob Wilsond1447c42011-02-04 17:59:28 +0000662 case llvm::Triple::EABI:
663 // EABI is always AAPCS, and if it was not marked 'hard', it's softfp
664 FloatABI = "softfp";
665 break;
Logan Chienc6fd8202012-09-02 09:30:11 +0000666 case llvm::Triple::Android: {
Benjamin Kramer09811c72012-06-26 22:20:06 +0000667 std::string ArchName =
Bernard Ogden31561762013-12-12 13:27:11 +0000668 arm::getLLVMArchSuffixForARM(arm::getARMTargetCPU(Args, Triple));
Benjamin Kramer09811c72012-06-26 22:20:06 +0000669 if (StringRef(ArchName).startswith("v7"))
Chandler Carruthc89aa9d2012-01-10 19:47:42 +0000670 FloatABI = "softfp";
671 else
672 FloatABI = "soft";
673 break;
674 }
Bob Wilsond1447c42011-02-04 17:59:28 +0000675 default:
676 // Assume "soft", but warn the user we are guessing.
677 FloatABI = "soft";
Saleem Abdulrasool377066a2014-03-27 22:50:18 +0000678 if (Triple.getOS() != llvm::Triple::UnknownOS ||
679 !Triple.isOSBinFormatMachO())
680 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bob Wilsond1447c42011-02-04 17:59:28 +0000681 break;
682 }
Daniel Dunbar78485922009-09-10 23:00:09 +0000683 }
684 }
685
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000686 return FloatABI;
687}
688
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000689static void getARMTargetFeatures(const Driver &D, const llvm::Triple &Triple,
690 const ArgList &Args,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000691 std::vector<const char *> &Features,
692 bool ForAS) {
Tim Northover9c7e0352013-12-12 11:55:52 +0000693 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000694 if (!ForAS) {
695 // FIXME: Note, this is a hack, the LLVM backend doesn't actually use these
696 // yet (it uses the -mfloat-abi and -msoft-float options), and it is
697 // stripped out by the ARM target. We should probably pass this a new
698 // -target-option, which is handled by the -cc1/-cc1as invocation.
699 //
700 // FIXME2: For consistency, it would be ideal if we set up the target
701 // machine state the same when using the frontend or the assembler. We don't
702 // currently do that for the assembler, we pass the options directly to the
703 // backend and never even instantiate the frontend TargetInfo. If we did,
704 // and used its handleTargetFeatures hook, then we could ensure the
705 // assembler and the frontend behave the same.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000706
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +0000707 // Use software floating point operations?
708 if (FloatABI == "soft")
709 Features.push_back("+soft-float");
710
711 // Use software floating point argument passing?
712 if (FloatABI != "hard")
713 Features.push_back("+soft-float-abi");
714 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000715
716 // Honor -mfpu=.
717 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +0000718 getARMFPUFeatures(D, A, Args, Features);
Silviu Barangaf9671dd2013-10-21 10:54:53 +0000719 if (const Arg *A = Args.getLastArg(options::OPT_mhwdiv_EQ))
720 getARMHWDivFeatures(D, A, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000721
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000722 // Setting -msoft-float effectively disables NEON because of the GCC
723 // implementation, although the same isn't true of VFP or VFP3.
Amara Emersonecbe18e2014-02-12 10:22:35 +0000724 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000725 Features.push_back("-neon");
Amara Emersonecbe18e2014-02-12 10:22:35 +0000726 // Also need to explicitly disable features which imply NEON.
727 Features.push_back("-crypto");
728 }
Bernard Ogden18b57012013-10-29 09:47:51 +0000729
730 // En/disable crc
731 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
732 options::OPT_mnocrc)) {
733 if (A->getOption().matches(options::OPT_mcrc))
734 Features.push_back("+crc");
735 else
736 Features.push_back("-crc");
737 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +0000738}
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000739
740void Clang::AddARMTargetArgs(const ArgList &Args,
741 ArgStringList &CmdArgs,
742 bool KernelOrKext) const {
743 const Driver &D = getToolChain().getDriver();
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000744 // Get the effective triple, which takes into account the deployment target.
745 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
746 llvm::Triple Triple(TripleStr);
Bernard Ogden31561762013-12-12 13:27:11 +0000747 std::string CPUName = arm::getARMTargetCPU(Args, Triple);
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000748
749 // Select the ABI to use.
750 //
751 // FIXME: Support -meabi.
Craig Topper92fc2df2014-05-17 16:56:41 +0000752 const char *ABIName = nullptr;
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000753 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000754 ABIName = A->getValue();
Tim Northovere5c6f4c2014-05-22 12:54:30 +0000755 } else if (Triple.isOSBinFormatMachO()) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000756 // The backend is hardwired to assume AAPCS for M-class processors, ensure
757 // the frontend matches that.
Tim Northovere66c9462013-10-03 14:23:28 +0000758 if (Triple.getEnvironment() == llvm::Triple::EABI ||
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +0000759 (Triple.getOS() == llvm::Triple::UnknownOS &&
760 Triple.getObjectFormat() == llvm::Triple::MachO) ||
Tim Northovere66c9462013-10-03 14:23:28 +0000761 StringRef(CPUName).startswith("cortex-m")) {
Daniel Dunbar5f18f6e2012-10-22 18:30:51 +0000762 ABIName = "aapcs";
763 } else {
764 ABIName = "apcs-gnu";
765 }
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +0000766 } else if (Triple.isOSWindows()) {
767 // FIXME: this is invalid for WindowsCE
768 ABIName = "aapcs";
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000769 } else {
770 // Select the default based on the platform.
771 switch(Triple.getEnvironment()) {
Logan Chienc6fd8202012-09-02 09:30:11 +0000772 case llvm::Triple::Android:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000773 case llvm::Triple::GNUEABI:
Jiangning Liu61b06cb2012-07-31 08:06:29 +0000774 case llvm::Triple::GNUEABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000775 ABIName = "aapcs-linux";
776 break;
Joerg Sonnenbergerd75a1f82013-12-16 19:16:04 +0000777 case llvm::Triple::EABIHF:
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000778 case llvm::Triple::EABI:
779 ABIName = "aapcs";
780 break;
781 default:
782 ABIName = "apcs-gnu";
783 }
784 }
785 CmdArgs.push_back("-target-abi");
786 CmdArgs.push_back(ABIName);
787
Anton Korobeynikova29e4622012-04-09 13:38:30 +0000788 // Determine floating point ABI from the options & target defaults.
Tim Northover9c7e0352013-12-12 11:55:52 +0000789 StringRef FloatABI = tools::arm::getARMFloatABI(D, Args, Triple);
Daniel Dunbar78485922009-09-10 23:00:09 +0000790 if (FloatABI == "soft") {
791 // Floating point operations and argument passing are soft.
792 //
793 // FIXME: This changes CPP defines, we need -target-soft-float.
Daniel Dunbara74f8ff2009-11-30 08:42:00 +0000794 CmdArgs.push_back("-msoft-float");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000795 CmdArgs.push_back("-mfloat-abi");
796 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000797 } else if (FloatABI == "softfp") {
798 // Floating point operations are hard, but argument passing is soft.
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000799 CmdArgs.push_back("-mfloat-abi");
800 CmdArgs.push_back("soft");
Daniel Dunbar78485922009-09-10 23:00:09 +0000801 } else {
802 // Floating point operations and argument passing are hard.
803 assert(FloatABI == "hard" && "Invalid float abi!");
Daniel Dunbar6cc525b2009-12-08 19:49:51 +0000804 CmdArgs.push_back("-mfloat-abi");
805 CmdArgs.push_back("hard");
Daniel Dunbar78485922009-09-10 23:00:09 +0000806 }
Daniel Dunbar893d4752009-12-19 04:15:38 +0000807
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000808 // Kernel code has more strict alignment requirements.
809 if (KernelOrKext) {
Cameron Esfahani556d91e2013-09-14 01:09:11 +0000810 if (!Triple.isiOS() || Triple.isOSVersionLT(6)) {
Daniel Dunbarbd847cc2012-10-15 22:23:53 +0000811 CmdArgs.push_back("-backend-option");
812 CmdArgs.push_back("-arm-long-calls");
813 }
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000814
Daniel Dunbar12100e22011-03-22 16:48:17 +0000815 CmdArgs.push_back("-backend-option");
Daniel Dunbarc9388c12011-03-17 17:10:06 +0000816 CmdArgs.push_back("-arm-strict-align");
Daniel Dunbared904c82011-04-18 21:26:42 +0000817
818 // The kext linker doesn't know how to deal with movw/movt.
Daniel Dunbared904c82011-04-18 21:26:42 +0000819 CmdArgs.push_back("-backend-option");
Renato Golin3d510b32013-08-15 20:54:45 +0000820 CmdArgs.push_back("-arm-use-movt=0");
Daniel Dunbarb1db4b62011-03-17 00:07:34 +0000821 }
Chad Rosierba3df1d2011-08-26 00:26:29 +0000822
823 // Setting -mno-global-merge disables the codegen global merge pass. Setting
824 // -mglobal-merge has no effect as the pass is enabled by default.
825 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
826 options::OPT_mno_global_merge)) {
827 if (A->getOption().matches(options::OPT_mno_global_merge))
828 CmdArgs.push_back("-mno-global-merge");
829 }
Chad Rosierf1985d22012-05-16 20:40:09 +0000830
Bob Wilson9c8af452013-04-11 18:53:25 +0000831 if (!Args.hasFlag(options::OPT_mimplicit_float,
832 options::OPT_mno_implicit_float,
833 true))
Chad Rosierf1985d22012-05-16 20:40:09 +0000834 CmdArgs.push_back("-no-implicit-float");
Renato Golindbb77e62013-08-24 14:44:35 +0000835
Logan Chien749763e2014-04-03 13:12:44 +0000836 // llvm does not support reserving registers in general. There is support
837 // for reserving r9 on ARM though (defined as a platform-specific register
838 // in ARM EABI).
839 if (Args.hasArg(options::OPT_ffixed_r9)) {
840 CmdArgs.push_back("-backend-option");
841 CmdArgs.push_back("-arm-reserve-r9");
842 }
Daniel Dunbar0f5c5422009-09-10 04:57:17 +0000843}
844
Tim Northover573cbee2014-05-24 12:52:07 +0000845/// getAArch64TargetCPU - Get the (LLVM) name of the AArch64 cpu we are
846/// targeting.
847static std::string getAArch64TargetCPU(const ArgList &Args) {
Tim Northovera2ee4332014-03-29 15:09:45 +0000848 // If we have -mcpu=, use that.
849 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
850 StringRef MCPU = A->getValue();
851 // Handle -mcpu=native.
852 if (MCPU == "native")
853 return llvm::sys::getHostCPUName();
854 else
855 return MCPU;
856 }
857
858 // At some point, we may need to check -march here, but for now we only
859 // one arm64 architecture.
860
James Molloy9b1586b2014-04-17 12:51:17 +0000861 // Make sure we pick "cyclone" if -arch is used.
862 // FIXME: Should this be picked by checking the target triple instead?
863 if (Args.getLastArg(options::OPT_arch))
864 return "cyclone";
865
866 return "generic";
Tim Northovera2ee4332014-03-29 15:09:45 +0000867}
868
Tim Northover573cbee2014-05-24 12:52:07 +0000869void Clang::AddAArch64TargetArgs(const ArgList &Args,
870 ArgStringList &CmdArgs) const {
Tim Northovera2ee4332014-03-29 15:09:45 +0000871 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
872 llvm::Triple Triple(TripleStr);
873
874 if (!Args.hasFlag(options::OPT_mred_zone, options::OPT_mno_red_zone, true) ||
875 Args.hasArg(options::OPT_mkernel) ||
876 Args.hasArg(options::OPT_fapple_kext))
877 CmdArgs.push_back("-disable-red-zone");
878
879 if (!Args.hasFlag(options::OPT_mimplicit_float,
880 options::OPT_mno_implicit_float, true))
881 CmdArgs.push_back("-no-implicit-float");
882
Craig Topper92fc2df2014-05-17 16:56:41 +0000883 const char *ABIName = nullptr;
Tim Northovera2ee4332014-03-29 15:09:45 +0000884 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ))
885 ABIName = A->getValue();
886 else if (Triple.isOSDarwin())
887 ABIName = "darwinpcs";
888 else
889 ABIName = "aapcs";
890
891 CmdArgs.push_back("-target-abi");
892 CmdArgs.push_back(ABIName);
893
894 CmdArgs.push_back("-target-cpu");
Tim Northover573cbee2014-05-24 12:52:07 +0000895 CmdArgs.push_back(Args.MakeArgString(getAArch64TargetCPU(Args)));
Tim Northovera2ee4332014-03-29 15:09:45 +0000896
897 if (Args.hasArg(options::OPT_mstrict_align)) {
898 CmdArgs.push_back("-backend-option");
Tim Northover573cbee2014-05-24 12:52:07 +0000899 CmdArgs.push_back("-aarch64-strict-align");
Tim Northovera2ee4332014-03-29 15:09:45 +0000900 }
Bob Wilsonbdd2b3c2014-05-29 19:43:02 +0000901
902 // Setting -mno-global-merge disables the codegen global merge pass. Setting
903 // -mglobal-merge has no effect as the pass is enabled by default.
904 if (Arg *A = Args.getLastArg(options::OPT_mglobal_merge,
905 options::OPT_mno_global_merge)) {
906 if (A->getOption().matches(options::OPT_mno_global_merge))
907 CmdArgs.push_back("-mno-global-merge");
908 }
Tim Northovera2ee4332014-03-29 15:09:45 +0000909}
910
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000911// Get CPU and ABI names. They are not independent
912// so we have to calculate them together.
913static void getMipsCPUAndABI(const ArgList &Args,
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000914 const llvm::Triple &Triple,
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000915 StringRef &CPUName,
916 StringRef &ABIName) {
Simon Atanasyan1a3665b62014-01-27 13:59:04 +0000917 const char *DefMips32CPU = "mips32r2";
918 const char *DefMips64CPU = "mips64r2";
Akira Hatanaka37fd9e92011-09-26 21:07:52 +0000919
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000920 if (Arg *A = Args.getLastArg(options::OPT_march_EQ,
Simon Atanasyane0cc7c72013-10-09 12:12:24 +0000921 options::OPT_mcpu_EQ))
922 CPUName = A->getValue();
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000923
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000924 if (Arg *A = Args.getLastArg(options::OPT_mabi_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +0000925 ABIName = A->getValue();
Simon Atanasyan4938ddb2013-04-21 13:30:10 +0000926 // Convert a GNU style Mips ABI name to the name
927 // accepted by LLVM Mips backend.
928 ABIName = llvm::StringSwitch<llvm::StringRef>(ABIName)
929 .Case("32", "o32")
930 .Case("64", "n64")
931 .Default(ABIName);
932 }
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000933
934 // Setup default CPU and ABI names.
935 if (CPUName.empty() && ABIName.empty()) {
Rafael Espindola22ce34a2013-08-20 22:12:08 +0000936 switch (Triple.getArch()) {
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000937 default:
938 llvm_unreachable("Unexpected triple arch name");
939 case llvm::Triple::mips:
940 case llvm::Triple::mipsel:
941 CPUName = DefMips32CPU;
942 break;
943 case llvm::Triple::mips64:
944 case llvm::Triple::mips64el:
945 CPUName = DefMips64CPU;
946 break;
947 }
948 }
949
950 if (!ABIName.empty()) {
951 // Deduce CPU name from ABI name.
952 CPUName = llvm::StringSwitch<const char *>(ABIName)
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000953 .Cases("32", "o32", "eabi", DefMips32CPU)
954 .Cases("n32", "n64", "64", DefMips64CPU)
Simon Atanasyan464a7f72012-09-10 08:32:41 +0000955 .Default("");
956 }
957 else if (!CPUName.empty()) {
958 // Deduce ABI name from CPU name.
959 ABIName = llvm::StringSwitch<const char *>(CPUName)
960 .Cases("mips32", "mips32r2", "o32")
961 .Cases("mips64", "mips64r2", "n64")
962 .Default("");
963 }
964
965 // FIXME: Warn on inconsistent cpu and abi usage.
Simon Atanasyan3b7589a2012-04-07 22:09:23 +0000966}
967
Simon Atanasyan0da400c2013-02-27 14:55:49 +0000968// Convert ABI name to the GNU tools acceptable variant.
969static StringRef getGnuCompatibleMipsABIName(StringRef ABI) {
970 return llvm::StringSwitch<llvm::StringRef>(ABI)
971 .Case("o32", "32")
972 .Case("n64", "64")
973 .Default(ABI);
974}
975
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000976// Select the MIPS float ABI as determined by -msoft-float, -mhard-float,
977// and -mfloat-abi=.
978static StringRef getMipsFloatABI(const Driver &D, const ArgList &Args) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +0000979 StringRef FloatABI;
Eric Christopher0b26a612010-03-02 02:41:08 +0000980 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000981 options::OPT_mhard_float,
982 options::OPT_mfloat_abi_EQ)) {
Eric Christopher0b26a612010-03-02 02:41:08 +0000983 if (A->getOption().matches(options::OPT_msoft_float))
984 FloatABI = "soft";
985 else if (A->getOption().matches(options::OPT_mhard_float))
986 FloatABI = "hard";
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000987 else {
Richard Smithbd55daf2012-11-01 04:30:05 +0000988 FloatABI = A->getValue();
Simon Atanasyan512dc382013-04-14 08:37:15 +0000989 if (FloatABI != "soft" && FloatABI != "hard") {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +0000990 D.Diag(diag::err_drv_invalid_mfloat_abi) << A->getAsString(Args);
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000991 FloatABI = "hard";
992 }
993 }
Eric Christopher0b26a612010-03-02 02:41:08 +0000994 }
995
996 // If unspecified, choose the default based on the platform.
997 if (FloatABI.empty()) {
Akira Hatanaka6976ec82012-03-23 23:07:09 +0000998 // Assume "hard", because it's a default value used by gcc.
999 // When we start to recognize specific target MIPS processors,
1000 // we will be able to select the default more correctly.
1001 FloatABI = "hard";
Eric Christopher0b26a612010-03-02 02:41:08 +00001002 }
1003
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001004 return FloatABI;
1005}
1006
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001007static void AddTargetFeature(const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001008 std::vector<const char *> &Features,
1009 OptSpecifier OnOpt, OptSpecifier OffOpt,
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001010 StringRef FeatureName) {
1011 if (Arg *A = Args.getLastArg(OnOpt, OffOpt)) {
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001012 if (A->getOption().matches(OnOpt))
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001013 Features.push_back(Args.MakeArgString("+" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001014 else
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001015 Features.push_back(Args.MakeArgString("-" + FeatureName));
Simon Atanasyan9b1932d2012-07-05 18:51:43 +00001016 }
1017}
1018
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001019static void getMIPSTargetFeatures(const Driver &D, const ArgList &Args,
1020 std::vector<const char *> &Features) {
1021 StringRef FloatABI = getMipsFloatABI(D, Args);
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001022 if (FloatABI == "soft") {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001023 // FIXME: Note, this is a hack. We need to pass the selected float
1024 // mode to the MipsTargetInfoBase to define appropriate macros there.
1025 // Now it is the only method.
1026 Features.push_back("+soft-float");
1027 }
1028
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001029 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
Matheus Almeida602bff32014-05-07 16:16:07 +00001030 StringRef Val = StringRef(A->getValue());
1031 if (Val == "2008")
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001032 Features.push_back("+nan2008");
Matheus Almeida602bff32014-05-07 16:16:07 +00001033 else if (Val == "legacy")
1034 Features.push_back("-nan2008");
1035 else
1036 D.Diag(diag::err_drv_unsupported_option_argument)
1037 << A->getOption().getName() << Val;
Simon Atanasyan22127ce2013-09-24 09:09:16 +00001038 }
1039
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001040 AddTargetFeature(Args, Features, options::OPT_msingle_float,
1041 options::OPT_mdouble_float, "single-float");
1042 AddTargetFeature(Args, Features, options::OPT_mips16, options::OPT_mno_mips16,
1043 "mips16");
1044 AddTargetFeature(Args, Features, options::OPT_mmicromips,
1045 options::OPT_mno_micromips, "micromips");
1046 AddTargetFeature(Args, Features, options::OPT_mdsp, options::OPT_mno_dsp,
1047 "dsp");
1048 AddTargetFeature(Args, Features, options::OPT_mdspr2, options::OPT_mno_dspr2,
1049 "dspr2");
1050 AddTargetFeature(Args, Features, options::OPT_mmsa, options::OPT_mno_msa,
1051 "msa");
Daniel Sanders94694172013-10-17 14:55:58 +00001052 AddTargetFeature(Args, Features, options::OPT_mfp64, options::OPT_mfp32,
1053 "fp64");
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001054}
1055
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001056void Clang::AddMIPSTargetArgs(const ArgList &Args,
Simon Atanasyanf0087242013-04-14 14:07:41 +00001057 ArgStringList &CmdArgs) const {
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001058 const Driver &D = getToolChain().getDriver();
1059 StringRef CPUName;
1060 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001061 const llvm::Triple &Triple = getToolChain().getTriple();
1062 getMipsCPUAndABI(Args, Triple, CPUName, ABIName);
Simon Atanasyan590ad8f2012-06-02 15:06:29 +00001063
1064 CmdArgs.push_back("-target-abi");
1065 CmdArgs.push_back(ABIName.data());
1066
1067 StringRef FloatABI = getMipsFloatABI(D, Args);
1068
Simon Atanasyan22a6f4d2013-11-19 12:22:38 +00001069 if (FloatABI == "soft") {
Eric Christopher0b26a612010-03-02 02:41:08 +00001070 // Floating point operations and argument passing are soft.
Eric Christopher0b26a612010-03-02 02:41:08 +00001071 CmdArgs.push_back("-msoft-float");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001072 CmdArgs.push_back("-mfloat-abi");
1073 CmdArgs.push_back("soft");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001074 }
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001075 else {
1076 // Floating point operations and argument passing are hard.
Eric Christopher0b26a612010-03-02 02:41:08 +00001077 assert(FloatABI == "hard" && "Invalid float abi!");
Akira Hatanaka6976ec82012-03-23 23:07:09 +00001078 CmdArgs.push_back("-mfloat-abi");
1079 CmdArgs.push_back("hard");
Eric Christopher0b26a612010-03-02 02:41:08 +00001080 }
Simon Atanasyan6f23fa02012-07-05 14:19:39 +00001081
Simon Atanasyan2eaec512012-12-01 18:27:21 +00001082 if (Arg *A = Args.getLastArg(options::OPT_mxgot, options::OPT_mno_xgot)) {
1083 if (A->getOption().matches(options::OPT_mxgot)) {
1084 CmdArgs.push_back("-mllvm");
1085 CmdArgs.push_back("-mxgot");
1086 }
1087 }
1088
Simon Atanasyanc580b322013-05-11 06:33:44 +00001089 if (Arg *A = Args.getLastArg(options::OPT_mldc1_sdc1,
1090 options::OPT_mno_ldc1_sdc1)) {
1091 if (A->getOption().matches(options::OPT_mno_ldc1_sdc1)) {
1092 CmdArgs.push_back("-mllvm");
1093 CmdArgs.push_back("-mno-ldc1-sdc1");
1094 }
1095 }
1096
Akira Hatanaka0aa60ef2013-07-19 18:58:48 +00001097 if (Arg *A = Args.getLastArg(options::OPT_mcheck_zero_division,
1098 options::OPT_mno_check_zero_division)) {
1099 if (A->getOption().matches(options::OPT_mno_check_zero_division)) {
1100 CmdArgs.push_back("-mllvm");
1101 CmdArgs.push_back("-mno-check-zero-division");
1102 }
1103 }
1104
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001105 if (Arg *A = Args.getLastArg(options::OPT_G)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001106 StringRef v = A->getValue();
Simon Atanasyanec4b1c12012-08-27 20:55:56 +00001107 CmdArgs.push_back("-mllvm");
1108 CmdArgs.push_back(Args.MakeArgString("-mips-ssection-threshold=" + v));
1109 A->claim();
1110 }
Eric Christopher0b26a612010-03-02 02:41:08 +00001111}
1112
Hal Finkel8eb59282012-06-11 22:35:19 +00001113/// getPPCTargetCPU - Get the (LLVM) name of the PowerPC cpu we are targeting.
1114static std::string getPPCTargetCPU(const ArgList &Args) {
1115 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00001116 StringRef CPUName = A->getValue();
Hal Finkel8eb59282012-06-11 22:35:19 +00001117
1118 if (CPUName == "native") {
1119 std::string CPU = llvm::sys::getHostCPUName();
1120 if (!CPU.empty() && CPU != "generic")
1121 return CPU;
1122 else
1123 return "";
1124 }
1125
1126 return llvm::StringSwitch<const char *>(CPUName)
1127 .Case("common", "generic")
1128 .Case("440", "440")
1129 .Case("440fp", "440")
1130 .Case("450", "450")
1131 .Case("601", "601")
1132 .Case("602", "602")
1133 .Case("603", "603")
1134 .Case("603e", "603e")
1135 .Case("603ev", "603ev")
1136 .Case("604", "604")
1137 .Case("604e", "604e")
1138 .Case("620", "620")
Bill Schmidt38378a02013-02-01 20:23:10 +00001139 .Case("630", "pwr3")
Hal Finkel8eb59282012-06-11 22:35:19 +00001140 .Case("G3", "g3")
1141 .Case("7400", "7400")
1142 .Case("G4", "g4")
1143 .Case("7450", "7450")
1144 .Case("G4+", "g4+")
1145 .Case("750", "750")
1146 .Case("970", "970")
1147 .Case("G5", "g5")
1148 .Case("a2", "a2")
Hal Finkeldf1e4bf2013-02-01 05:53:33 +00001149 .Case("a2q", "a2q")
Hal Finkelf6d6cb02012-09-18 22:25:03 +00001150 .Case("e500mc", "e500mc")
1151 .Case("e5500", "e5500")
Bill Schmidt38378a02013-02-01 20:23:10 +00001152 .Case("power3", "pwr3")
1153 .Case("power4", "pwr4")
1154 .Case("power5", "pwr5")
1155 .Case("power5x", "pwr5x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001156 .Case("power6", "pwr6")
Bill Schmidt38378a02013-02-01 20:23:10 +00001157 .Case("power6x", "pwr6x")
Hal Finkel8eb59282012-06-11 22:35:19 +00001158 .Case("power7", "pwr7")
Bill Schmidt38378a02013-02-01 20:23:10 +00001159 .Case("pwr3", "pwr3")
1160 .Case("pwr4", "pwr4")
1161 .Case("pwr5", "pwr5")
1162 .Case("pwr5x", "pwr5x")
1163 .Case("pwr6", "pwr6")
1164 .Case("pwr6x", "pwr6x")
1165 .Case("pwr7", "pwr7")
Hal Finkel8eb59282012-06-11 22:35:19 +00001166 .Case("powerpc", "ppc")
1167 .Case("powerpc64", "ppc64")
Bill Schmidt778d3872013-07-26 01:36:11 +00001168 .Case("powerpc64le", "ppc64le")
Hal Finkel8eb59282012-06-11 22:35:19 +00001169 .Default("");
1170 }
1171
1172 return "";
1173}
1174
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001175static void getPPCTargetFeatures(const ArgList &Args,
1176 std::vector<const char *> &Features) {
Eric Christopher643bb6a2013-10-16 20:40:08 +00001177 for (arg_iterator it = Args.filtered_begin(options::OPT_m_ppc_Features_Group),
1178 ie = Args.filtered_end();
1179 it != ie; ++it) {
1180 StringRef Name = (*it)->getOption().getName();
1181 (*it)->claim();
1182
1183 // Skip over "-m".
1184 assert(Name.startswith("m") && "Invalid feature name.");
1185 Name = Name.substr(1);
1186
1187 bool IsNegative = Name.startswith("no-");
1188 if (IsNegative)
1189 Name = Name.substr(3);
1190
1191 // Note that gcc calls this mfcrf and LLVM calls this mfocrf so we
1192 // pass the correct option to the backend while calling the frontend
1193 // option the same.
1194 // TODO: Change the LLVM backend option maybe?
1195 if (Name == "mfcrf")
1196 Name = "mfocrf";
1197
1198 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1199 }
1200
1201 // Altivec is a bit weird, allow overriding of the Altivec feature here.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001202 AddTargetFeature(Args, Features, options::OPT_faltivec,
1203 options::OPT_fno_altivec, "altivec");
Hal Finkel8eb59282012-06-11 22:35:19 +00001204}
1205
Tom Stellard6674c702013-04-01 20:56:53 +00001206/// Get the (LLVM) name of the R600 gpu we are targeting.
1207static std::string getR600TargetGPU(const ArgList &Args) {
1208 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001209 const char *GPUName = A->getValue();
Tom Stellard6674c702013-04-01 20:56:53 +00001210 return llvm::StringSwitch<const char *>(GPUName)
Tom Stellardb38600c2013-05-06 16:12:05 +00001211 .Cases("rv630", "rv635", "r600")
1212 .Cases("rv610", "rv620", "rs780", "rs880")
Tom Stellard6674c702013-04-01 20:56:53 +00001213 .Case("rv740", "rv770")
1214 .Case("palm", "cedar")
Tom Stellardb38600c2013-05-06 16:12:05 +00001215 .Cases("sumo", "sumo2", "sumo")
Tom Stellard6674c702013-04-01 20:56:53 +00001216 .Case("hemlock", "cypress")
1217 .Case("aruba", "cayman")
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001218 .Default(GPUName);
Tom Stellard6674c702013-04-01 20:56:53 +00001219 }
1220 return "";
1221}
1222
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001223static void getSparcTargetFeatures(const ArgList &Args,
1224 std::vector<const char *> Features) {
1225 bool SoftFloatABI = true;
1226 if (Arg *A =
1227 Args.getLastArg(options::OPT_msoft_float, options::OPT_mhard_float)) {
1228 if (A->getOption().matches(options::OPT_mhard_float))
1229 SoftFloatABI = false;
1230 }
1231 if (SoftFloatABI)
1232 Features.push_back("+soft-float");
1233}
1234
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001235void Clang::AddSparcTargetArgs(const ArgList &Args,
1236 ArgStringList &CmdArgs) const {
1237 const Driver &D = getToolChain().getDriver();
1238
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001239 // Select the float ABI as determined by -msoft-float, -mhard-float, and
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001240 StringRef FloatABI;
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001241 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1242 options::OPT_mhard_float)) {
1243 if (A->getOption().matches(options::OPT_msoft_float))
1244 FloatABI = "soft";
1245 else if (A->getOption().matches(options::OPT_mhard_float))
1246 FloatABI = "hard";
1247 }
1248
1249 // If unspecified, choose the default based on the platform.
1250 if (FloatABI.empty()) {
Aaron Ballmand0d27ab2013-07-15 13:41:33 +00001251 // Assume "soft", but warn the user we are guessing.
1252 FloatABI = "soft";
1253 D.Diag(diag::warn_drv_assuming_mfloat_abi_is) << "soft";
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001254 }
1255
1256 if (FloatABI == "soft") {
1257 // Floating point operations and argument passing are soft.
1258 //
1259 // FIXME: This changes CPP defines, we need -target-soft-float.
1260 CmdArgs.push_back("-msoft-float");
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00001261 } else {
1262 assert(FloatABI == "hard" && "Invalid float abi!");
1263 CmdArgs.push_back("-mhard-float");
1264 }
1265}
1266
Richard Sandiford4652d892013-07-19 16:51:51 +00001267static const char *getSystemZTargetCPU(const ArgList &Args) {
1268 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ))
1269 return A->getValue();
1270 return "z10";
1271}
1272
Chandler Carruth953fb082013-01-13 11:46:33 +00001273static const char *getX86TargetCPU(const ArgList &Args,
1274 const llvm::Triple &Triple) {
1275 if (const Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001276 if (StringRef(A->getValue()) != "native") {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001277 if (Triple.isOSDarwin() && Triple.getArchName() == "x86_64h")
Jim Grosbach82eee262013-11-16 00:53:35 +00001278 return "core-avx2";
1279
Chandler Carruth953fb082013-01-13 11:46:33 +00001280 return A->getValue();
Jim Grosbach82eee262013-11-16 00:53:35 +00001281 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001282
1283 // FIXME: Reject attempts to use -march=native unless the target matches
1284 // the host.
1285 //
1286 // FIXME: We should also incorporate the detected target features for use
1287 // with -native.
1288 std::string CPU = llvm::sys::getHostCPUName();
1289 if (!CPU.empty() && CPU != "generic")
1290 return Args.MakeArgString(CPU);
1291 }
1292
1293 // Select the default CPU if none was given (or detection failed).
1294
1295 if (Triple.getArch() != llvm::Triple::x86_64 &&
1296 Triple.getArch() != llvm::Triple::x86)
Craig Topper92fc2df2014-05-17 16:56:41 +00001297 return nullptr; // This routine is only handling x86 targets.
Chandler Carruth953fb082013-01-13 11:46:33 +00001298
1299 bool Is64Bit = Triple.getArch() == llvm::Triple::x86_64;
1300
1301 // FIXME: Need target hooks.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00001302 if (Triple.isOSDarwin()) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001303 if (Triple.getArchName() == "x86_64h")
1304 return "core-avx2";
Chandler Carruth953fb082013-01-13 11:46:33 +00001305 return Is64Bit ? "core2" : "yonah";
Jim Grosbach82eee262013-11-16 00:53:35 +00001306 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001307
Alexey Bataev286d1b92014-01-31 04:07:13 +00001308 // On Android use targets compatible with gcc
Chandler Carruth953fb082013-01-13 11:46:33 +00001309 if (Triple.getEnvironment() == llvm::Triple::Android)
Alexey Bataev286d1b92014-01-31 04:07:13 +00001310 return Is64Bit ? "x86-64" : "i686";
Chandler Carruth953fb082013-01-13 11:46:33 +00001311
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00001312 // Everything else goes to x86-64 in 64-bit mode.
1313 if (Is64Bit)
1314 return "x86-64";
1315
1316 switch (Triple.getOS()) {
1317 case llvm::Triple::FreeBSD:
1318 case llvm::Triple::NetBSD:
1319 case llvm::Triple::OpenBSD:
1320 return "i486";
1321 case llvm::Triple::Haiku:
1322 return "i586";
1323 case llvm::Triple::Bitrig:
1324 return "i686";
1325 default:
1326 // Fallback to p4.
1327 return "pentium4";
1328 }
Chandler Carruth953fb082013-01-13 11:46:33 +00001329}
1330
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001331static std::string getCPUName(const ArgList &Args, const llvm::Triple &T) {
1332 switch(T.getArch()) {
1333 default:
1334 return "";
1335
Amara Emerson703da2e2013-10-31 09:32:33 +00001336 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001337 case llvm::Triple::aarch64_be:
Quentin Colombetd9f26202014-04-15 00:27:35 +00001338 case llvm::Triple::arm64:
James Molloy2b24fc42014-04-17 12:51:23 +00001339 case llvm::Triple::arm64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00001340 return getAArch64TargetCPU(Args);
Quentin Colombetd9f26202014-04-15 00:27:35 +00001341
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001342 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001343 case llvm::Triple::armeb:
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001344 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001345 case llvm::Triple::thumbeb:
Bernard Ogden31561762013-12-12 13:27:11 +00001346 return arm::getARMTargetCPU(Args, T);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001347
1348 case llvm::Triple::mips:
1349 case llvm::Triple::mipsel:
1350 case llvm::Triple::mips64:
1351 case llvm::Triple::mips64el: {
1352 StringRef CPUName;
1353 StringRef ABIName;
1354 getMipsCPUAndABI(Args, T, CPUName, ABIName);
1355 return CPUName;
1356 }
1357
1358 case llvm::Triple::ppc:
1359 case llvm::Triple::ppc64:
1360 case llvm::Triple::ppc64le: {
1361 std::string TargetCPUName = getPPCTargetCPU(Args);
1362 // LLVM may default to generating code for the native CPU,
1363 // but, like gcc, we default to a more generic option for
1364 // each architecture. (except on Darwin)
1365 if (TargetCPUName.empty() && !T.isOSDarwin()) {
1366 if (T.getArch() == llvm::Triple::ppc64)
1367 TargetCPUName = "ppc64";
1368 else if (T.getArch() == llvm::Triple::ppc64le)
1369 TargetCPUName = "ppc64le";
1370 else
1371 TargetCPUName = "ppc";
1372 }
1373 return TargetCPUName;
1374 }
1375
1376 case llvm::Triple::sparc:
Roman Divackyb1ae3d42014-02-25 18:35:30 +00001377 case llvm::Triple::sparcv9:
1378 if (const Arg *A = Args.getLastArg(options::OPT_mcpu_EQ))
Rafael Espindola22ce34a2013-08-20 22:12:08 +00001379 return A->getValue();
1380 return "";
1381
1382 case llvm::Triple::x86:
1383 case llvm::Triple::x86_64:
1384 return getX86TargetCPU(Args, T);
1385
1386 case llvm::Triple::hexagon:
1387 return "hexagon" + toolchains::Hexagon_TC::GetTargetCPU(Args).str();
1388
1389 case llvm::Triple::systemz:
1390 return getSystemZTargetCPU(Args);
1391
1392 case llvm::Triple::r600:
1393 return getR600TargetGPU(Args);
1394 }
1395}
1396
Alp Tokerce365ca2013-12-02 12:43:03 +00001397static void AddGoldPlugin(const ToolChain &ToolChain, const ArgList &Args,
1398 ArgStringList &CmdArgs) {
1399 // Tell the linker to load the plugin. This has to come before AddLinkerInputs
1400 // as gold requires -plugin to come before any -plugin-opt that -Wl might
1401 // forward.
1402 CmdArgs.push_back("-plugin");
1403 std::string Plugin = ToolChain.getDriver().Dir + "/../lib/LLVMgold.so";
1404 CmdArgs.push_back(Args.MakeArgString(Plugin));
1405
1406 // Try to pass driver level flags relevant to LTO code generation down to
1407 // the plugin.
1408
1409 // Handle flags for selecting CPU variants.
1410 std::string CPU = getCPUName(Args, ToolChain.getTriple());
1411 if (!CPU.empty())
1412 CmdArgs.push_back(Args.MakeArgString(Twine("-plugin-opt=mcpu=") + CPU));
1413}
1414
Jim Grosbach82eee262013-11-16 00:53:35 +00001415static void getX86TargetFeatures(const llvm::Triple &Triple,
1416 const ArgList &Args,
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001417 std::vector<const char *> &Features) {
Jim Grosbach82eee262013-11-16 00:53:35 +00001418 if (Triple.getArchName() == "x86_64h") {
1419 // x86_64h implies quite a few of the more modern subtarget features
1420 // for Haswell class CPUs, but not all of them. Opt-out of a few.
1421 Features.push_back("-rdrnd");
1422 Features.push_back("-aes");
1423 Features.push_back("-pclmul");
1424 Features.push_back("-rtm");
1425 Features.push_back("-hle");
1426 Features.push_back("-fsgsbase");
1427 }
1428
Alexey Volkov54ff0802014-06-25 12:15:36 +00001429 // Add features to comply with gcc on Android
Alexey Bataev286d1b92014-01-31 04:07:13 +00001430 if (Triple.getEnvironment() == llvm::Triple::Android) {
Alexey Volkov54ff0802014-06-25 12:15:36 +00001431 if (Triple.getArch() == llvm::Triple::x86_64) {
1432 Features.push_back("+sse4.2");
1433 Features.push_back("+popcnt");
1434 } else
1435 Features.push_back("+ssse3");
Alexey Bataev286d1b92014-01-31 04:07:13 +00001436 }
1437
Jim Grosbach82eee262013-11-16 00:53:35 +00001438 // Now add any that the user explicitly requested on the command line,
1439 // which may override the defaults.
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001440 for (arg_iterator it = Args.filtered_begin(options::OPT_m_x86_Features_Group),
1441 ie = Args.filtered_end();
1442 it != ie; ++it) {
1443 StringRef Name = (*it)->getOption().getName();
1444 (*it)->claim();
1445
1446 // Skip over "-m".
1447 assert(Name.startswith("m") && "Invalid feature name.");
1448 Name = Name.substr(1);
1449
1450 bool IsNegative = Name.startswith("no-");
1451 if (IsNegative)
1452 Name = Name.substr(3);
1453
1454 Features.push_back(Args.MakeArgString((IsNegative ? "-" : "+") + Name));
1455 }
1456}
1457
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001458void Clang::AddX86TargetArgs(const ArgList &Args,
1459 ArgStringList &CmdArgs) const {
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001460 if (!Args.hasFlag(options::OPT_mred_zone,
1461 options::OPT_mno_red_zone,
1462 true) ||
1463 Args.hasArg(options::OPT_mkernel) ||
1464 Args.hasArg(options::OPT_fapple_kext))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001465 CmdArgs.push_back("-disable-red-zone");
Daniel Dunbare2cf8f72009-09-10 22:59:57 +00001466
Bob Wilson2616e2e2013-02-10 16:01:41 +00001467 // Default to avoid implicit floating-point for kernel/kext code, but allow
1468 // that to be overridden with -mno-soft-float.
1469 bool NoImplicitFloat = (Args.hasArg(options::OPT_mkernel) ||
1470 Args.hasArg(options::OPT_fapple_kext));
1471 if (Arg *A = Args.getLastArg(options::OPT_msoft_float,
1472 options::OPT_mno_soft_float,
Bob Wilson9c8af452013-04-11 18:53:25 +00001473 options::OPT_mimplicit_float,
Bob Wilson2616e2e2013-02-10 16:01:41 +00001474 options::OPT_mno_implicit_float)) {
1475 const Option &O = A->getOption();
1476 NoImplicitFloat = (O.matches(options::OPT_mno_implicit_float) ||
1477 O.matches(options::OPT_msoft_float));
1478 }
1479 if (NoImplicitFloat)
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00001480 CmdArgs.push_back("-no-implicit-float");
Nico Weberad8e36c2014-05-13 11:11:24 +00001481
1482 if (Arg *A = Args.getLastArg(options::OPT_masm_EQ)) {
1483 StringRef Value = A->getValue();
1484 if (Value == "intel" || Value == "att") {
1485 CmdArgs.push_back("-mllvm");
1486 CmdArgs.push_back(Args.MakeArgString("-x86-asm-syntax=" + Value));
1487 } else {
1488 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
1489 << A->getOption().getName() << Value;
1490 }
1491 }
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00001492}
1493
Matthew Curtise8f80a12012-12-06 17:49:03 +00001494static inline bool HasPICArg(const ArgList &Args) {
1495 return Args.hasArg(options::OPT_fPIC)
1496 || Args.hasArg(options::OPT_fpic);
1497}
1498
1499static Arg *GetLastSmallDataThresholdArg(const ArgList &Args) {
1500 return Args.getLastArg(options::OPT_G,
1501 options::OPT_G_EQ,
1502 options::OPT_msmall_data_threshold_EQ);
1503}
1504
1505static std::string GetHexagonSmallDataThresholdValue(const ArgList &Args) {
1506 std::string value;
1507 if (HasPICArg(Args))
1508 value = "0";
1509 else if (Arg *A = GetLastSmallDataThresholdArg(Args)) {
1510 value = A->getValue();
1511 A->claim();
1512 }
1513 return value;
1514}
1515
Tony Linthicum76329bf2011-12-12 21:14:55 +00001516void Clang::AddHexagonTargetArgs(const ArgList &Args,
1517 ArgStringList &CmdArgs) const {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001518 CmdArgs.push_back("-fno-signed-char");
Matthew Curtis6b222782012-12-07 13:52:44 +00001519 CmdArgs.push_back("-mqdsp6-compat");
1520 CmdArgs.push_back("-Wreturn-type");
Tony Linthicum76329bf2011-12-12 21:14:55 +00001521
Matthew Curtise8f80a12012-12-06 17:49:03 +00001522 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
1523 if (!SmallDataThreshold.empty()) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00001524 CmdArgs.push_back ("-mllvm");
Matthew Curtise8f80a12012-12-06 17:49:03 +00001525 CmdArgs.push_back(Args.MakeArgString(
1526 "-hexagon-small-data-threshold=" + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00001527 }
1528
Sirish Pande11ebc4e2012-05-10 20:19:54 +00001529 if (!Args.hasArg(options::OPT_fno_short_enums))
1530 CmdArgs.push_back("-fshort-enums");
1531 if (Args.getLastArg(options::OPT_mieee_rnd_near)) {
1532 CmdArgs.push_back ("-mllvm");
1533 CmdArgs.push_back ("-enable-hexagon-ieee-rnd-near");
1534 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00001535 CmdArgs.push_back ("-mllvm");
1536 CmdArgs.push_back ("-machine-sink-split=0");
1537}
1538
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001539static void getAArch64TargetFeatures(const Driver &D, const ArgList &Args,
1540 std::vector<const char *> &Features) {
Tim Northover2fe823a2013-08-01 09:23:19 +00001541 // Honor -mfpu=.
1542 if (const Arg *A = Args.getLastArg(options::OPT_mfpu_EQ))
Amara Emerson4cdb87b2013-10-01 10:20:54 +00001543 getAArch64FPUFeatures(D, A, Args, Features);
Jiangning Liub19c5b62014-02-14 04:37:46 +00001544 else
1545 Features.push_back("+neon");
Amara Emerson04e2ecf2014-01-23 15:48:30 +00001546
1547 if (Args.getLastArg(options::OPT_mgeneral_regs_only)) {
1548 Features.push_back("-fp-armv8");
1549 Features.push_back("-crypto");
1550 Features.push_back("-neon");
1551 }
Bradley Smith418c5932014-05-02 15:17:51 +00001552
1553 // En/disable crc
1554 if (Arg *A = Args.getLastArg(options::OPT_mcrc,
1555 options::OPT_mnocrc)) {
1556 if (A->getOption().matches(options::OPT_mcrc))
1557 Features.push_back("+crc");
1558 else
1559 Features.push_back("-crc");
1560 }
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001561}
1562
1563static void getTargetFeatures(const Driver &D, const llvm::Triple &Triple,
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001564 const ArgList &Args, ArgStringList &CmdArgs,
1565 bool ForAS) {
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001566 std::vector<const char *> Features;
1567 switch (Triple.getArch()) {
1568 default:
1569 break;
1570 case llvm::Triple::mips:
1571 case llvm::Triple::mipsel:
1572 case llvm::Triple::mips64:
1573 case llvm::Triple::mips64el:
1574 getMIPSTargetFeatures(D, Args, Features);
1575 break;
1576
1577 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001578 case llvm::Triple::armeb:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001579 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001580 case llvm::Triple::thumbeb:
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00001581 getARMTargetFeatures(D, Triple, Args, Features, ForAS);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001582 break;
1583
1584 case llvm::Triple::ppc:
1585 case llvm::Triple::ppc64:
1586 case llvm::Triple::ppc64le:
1587 getPPCTargetFeatures(Args, Features);
1588 break;
1589 case llvm::Triple::sparc:
1590 getSparcTargetFeatures(Args, Features);
1591 break;
1592 case llvm::Triple::aarch64:
Christian Pirker9b019ae2014-02-25 13:51:00 +00001593 case llvm::Triple::aarch64_be:
James Molloyafc352c2014-04-16 15:33:56 +00001594 case llvm::Triple::arm64:
1595 case llvm::Triple::arm64_be:
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001596 getAArch64TargetFeatures(D, Args, Features);
1597 break;
1598 case llvm::Triple::x86:
1599 case llvm::Triple::x86_64:
Jim Grosbach82eee262013-11-16 00:53:35 +00001600 getX86TargetFeatures(Triple, Args, Features);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001601 break;
1602 }
Rafael Espindola43964802013-08-21 17:34:32 +00001603
1604 // Find the last of each feature.
1605 llvm::StringMap<unsigned> LastOpt;
1606 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1607 const char *Name = Features[I];
1608 assert(Name[0] == '-' || Name[0] == '+');
1609 LastOpt[Name + 1] = I;
1610 }
1611
1612 for (unsigned I = 0, N = Features.size(); I < N; ++I) {
1613 // If this feature was overridden, ignore it.
1614 const char *Name = Features[I];
1615 llvm::StringMap<unsigned>::iterator LastI = LastOpt.find(Name + 1);
1616 assert(LastI != LastOpt.end());
1617 unsigned Last = LastI->second;
1618 if (Last != I)
1619 continue;
1620
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001621 CmdArgs.push_back("-target-feature");
Rafael Espindola43964802013-08-21 17:34:32 +00001622 CmdArgs.push_back(Name);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00001623 }
Tim Northover2fe823a2013-08-01 09:23:19 +00001624}
1625
Eric Christopher84fbdb42011-08-19 00:30:14 +00001626static bool
John McCall5fb5df92012-06-20 06:18:46 +00001627shouldUseExceptionTablesForObjCExceptions(const ObjCRuntime &runtime,
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001628 const llvm::Triple &Triple) {
1629 // We use the zero-cost exception tables for Objective-C if the non-fragile
1630 // ABI is enabled or when compiling for x86_64 and ARM on Snow Leopard and
1631 // later.
John McCall5fb5df92012-06-20 06:18:46 +00001632 if (runtime.isNonFragile())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001633 return true;
1634
Bob Wilson83e723a2013-12-05 19:38:42 +00001635 if (!Triple.isMacOSX())
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001636 return false;
1637
Eric Christopherbf15d2b2011-07-02 00:20:22 +00001638 return (!Triple.isMacOSXVersionLT(10,5) &&
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001639 (Triple.getArch() == llvm::Triple::x86_64 ||
Eric Christopher84fbdb42011-08-19 00:30:14 +00001640 Triple.getArch() == llvm::Triple::arm));
Anders Carlsson246ff3f2011-02-28 00:44:51 +00001641}
1642
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001643namespace {
1644 struct ExceptionSettings {
1645 bool ExceptionsEnabled;
1646 bool ShouldUseExceptionTables;
1647 ExceptionSettings() : ExceptionsEnabled(false),
1648 ShouldUseExceptionTables(false) {}
1649 };
1650} // end anonymous namespace.
1651
Nico Webere8e53112014-05-11 01:04:02 +00001652// exceptionSettings() exists to share the logic between -cc1 and linker
1653// invocations.
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001654static ExceptionSettings exceptionSettings(const ArgList &Args,
1655 const llvm::Triple &Triple) {
1656 ExceptionSettings ES;
1657
1658 // Are exceptions enabled by default?
1659 ES.ExceptionsEnabled = (Triple.getArch() != llvm::Triple::xcore);
1660
1661 // This keeps track of whether exceptions were explicitly turned on or off.
1662 bool DidHaveExplicitExceptionFlag = false;
1663
1664 if (Arg *A = Args.getLastArg(options::OPT_fexceptions,
1665 options::OPT_fno_exceptions)) {
1666 if (A->getOption().matches(options::OPT_fexceptions))
1667 ES.ExceptionsEnabled = true;
1668 else
1669 ES.ExceptionsEnabled = false;
1670
1671 DidHaveExplicitExceptionFlag = true;
1672 }
1673
1674 // Exception tables and cleanups can be enabled with -fexceptions even if the
1675 // language itself doesn't support exceptions.
1676 if (ES.ExceptionsEnabled && DidHaveExplicitExceptionFlag)
1677 ES.ShouldUseExceptionTables = true;
1678
1679 return ES;
1680}
1681
Anders Carlssone96ab552011-02-28 02:27:16 +00001682/// addExceptionArgs - Adds exception related arguments to the driver command
1683/// arguments. There's a master flag, -fexceptions and also language specific
1684/// flags to enable/disable C++ and Objective-C exceptions.
1685/// This makes it possible to for example disable C++ exceptions but enable
1686/// Objective-C exceptions.
1687static void addExceptionArgs(const ArgList &Args, types::ID InputType,
1688 const llvm::Triple &Triple,
Fariborz Jahanianb2482212012-04-04 18:28:00 +00001689 bool KernelOrKext,
John McCall5fb5df92012-06-20 06:18:46 +00001690 const ObjCRuntime &objcRuntime,
Anders Carlssone96ab552011-02-28 02:27:16 +00001691 ArgStringList &CmdArgs) {
Chad Rosier4fab82c2012-03-26 22:04:46 +00001692 if (KernelOrKext) {
1693 // -mkernel and -fapple-kext imply no exceptions, so claim exception related
1694 // arguments now to avoid warnings about unused arguments.
1695 Args.ClaimAllArgs(options::OPT_fexceptions);
1696 Args.ClaimAllArgs(options::OPT_fno_exceptions);
1697 Args.ClaimAllArgs(options::OPT_fobjc_exceptions);
1698 Args.ClaimAllArgs(options::OPT_fno_objc_exceptions);
1699 Args.ClaimAllArgs(options::OPT_fcxx_exceptions);
1700 Args.ClaimAllArgs(options::OPT_fno_cxx_exceptions);
Anders Carlssone96ab552011-02-28 02:27:16 +00001701 return;
Chad Rosier4fab82c2012-03-26 22:04:46 +00001702 }
Anders Carlssone96ab552011-02-28 02:27:16 +00001703
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001704 // Gather the exception settings from the command line arguments.
1705 ExceptionSettings ES = exceptionSettings(Args, Triple);
Daniel Dunbar30a12b82010-09-14 23:12:31 +00001706
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001707 // Obj-C exceptions are enabled by default, regardless of -fexceptions. This
1708 // is not necessarily sensible, but follows GCC.
1709 if (types::isObjC(InputType) &&
Eric Christopher84fbdb42011-08-19 00:30:14 +00001710 Args.hasFlag(options::OPT_fobjc_exceptions,
Daniel Dunbarc44f8cf2011-03-17 23:28:31 +00001711 options::OPT_fno_objc_exceptions,
1712 true)) {
1713 CmdArgs.push_back("-fobjc-exceptions");
Anders Carlssone96ab552011-02-28 02:27:16 +00001714
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001715 ES.ShouldUseExceptionTables |=
John McCall5fb5df92012-06-20 06:18:46 +00001716 shouldUseExceptionTablesForObjCExceptions(objcRuntime, Triple);
Anders Carlssone96ab552011-02-28 02:27:16 +00001717 }
1718
1719 if (types::isCXX(InputType)) {
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001720 bool CXXExceptionsEnabled = ES.ExceptionsEnabled;
Anders Carlssone96ab552011-02-28 02:27:16 +00001721
Eric Christopher84fbdb42011-08-19 00:30:14 +00001722 if (Arg *A = Args.getLastArg(options::OPT_fcxx_exceptions,
1723 options::OPT_fno_cxx_exceptions,
Anders Carlssone96ab552011-02-28 02:27:16 +00001724 options::OPT_fexceptions,
1725 options::OPT_fno_exceptions)) {
1726 if (A->getOption().matches(options::OPT_fcxx_exceptions))
1727 CXXExceptionsEnabled = true;
Chandler Carruth74f87112011-02-28 07:25:18 +00001728 else if (A->getOption().matches(options::OPT_fno_cxx_exceptions))
Anders Carlssone96ab552011-02-28 02:27:16 +00001729 CXXExceptionsEnabled = false;
1730 }
1731
1732 if (CXXExceptionsEnabled) {
1733 CmdArgs.push_back("-fcxx-exceptions");
1734
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001735 ES.ShouldUseExceptionTables = true;
Anders Carlssone96ab552011-02-28 02:27:16 +00001736 }
1737 }
1738
Robert Lyttonf7e03c12014-02-13 10:34:44 +00001739 if (ES.ShouldUseExceptionTables)
Anders Carlssone96ab552011-02-28 02:27:16 +00001740 CmdArgs.push_back("-fexceptions");
Rafael Espindola00a66572009-10-01 13:33:33 +00001741}
1742
Daniel Dunbare246fbe2013-04-16 18:21:19 +00001743static bool ShouldDisableAutolink(const ArgList &Args,
1744 const ToolChain &TC) {
1745 bool Default = true;
1746 if (TC.getTriple().isOSDarwin()) {
1747 // The native darwin assembler doesn't support the linker_option directives,
1748 // so we disable them if we think the .s file will be passed to it.
1749 Default = TC.useIntegratedAs();
1750 }
1751 return !Args.hasFlag(options::OPT_fautolink, options::OPT_fno_autolink,
1752 Default);
1753}
1754
Ted Kremenek62093662013-03-12 17:02:12 +00001755static bool ShouldDisableDwarfDirectory(const ArgList &Args,
1756 const ToolChain &TC) {
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001757 bool UseDwarfDirectory = Args.hasFlag(options::OPT_fdwarf_directory_asm,
1758 options::OPT_fno_dwarf_directory_asm,
Rafael Espindola84b588b2013-03-18 18:10:27 +00001759 TC.useIntegratedAs());
Nick Lewycky1d617ac2011-10-17 23:05:52 +00001760 return !UseDwarfDirectory;
1761}
1762
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001763/// \brief Check whether the given input tree contains any compilation actions.
1764static bool ContainsCompileAction(const Action *A) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00001765 if (isa<CompileJobAction>(A))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001766 return true;
1767
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00001768 for (const auto &Act : *A)
1769 if (ContainsCompileAction(Act))
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001770 return true;
1771
1772 return false;
1773}
1774
1775/// \brief Check if -relax-all should be passed to the internal assembler.
1776/// This is done by default when compiling non-assembler source with -O0.
1777static bool UseRelaxAll(Compilation &C, const ArgList &Args) {
1778 bool RelaxDefault = true;
1779
1780 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
1781 RelaxDefault = A->getOption().matches(options::OPT_O0);
1782
1783 if (RelaxDefault) {
1784 RelaxDefault = false;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00001785 for (const auto &Act : C.getActions()) {
1786 if (ContainsCompileAction(Act)) {
Joerg Sonnenbergeref317a22011-05-06 14:35:16 +00001787 RelaxDefault = true;
1788 break;
1789 }
1790 }
1791 }
1792
1793 return Args.hasFlag(options::OPT_mrelax_all, options::OPT_mno_relax_all,
1794 RelaxDefault);
1795}
1796
David Blaikie9260ed62013-07-25 21:19:01 +00001797static void CollectArgsForIntegratedAssembler(Compilation &C,
1798 const ArgList &Args,
1799 ArgStringList &CmdArgs,
1800 const Driver &D) {
1801 if (UseRelaxAll(C, Args))
1802 CmdArgs.push_back("-mrelax-all");
1803
David Peixottodfb66142013-11-14 22:52:58 +00001804 // When passing -I arguments to the assembler we sometimes need to
David Peixotto4afe0792013-11-14 22:58:17 +00001805 // unconditionally take the next argument. For example, when parsing
David Peixottodfb66142013-11-14 22:52:58 +00001806 // '-Wa,-I -Wa,foo' we need to accept the -Wa,foo arg after seeing the
1807 // -Wa,-I arg and when parsing '-Wa,-I,foo' we need to accept the 'foo'
1808 // arg after parsing the '-I' arg.
1809 bool TakeNextArg = false;
1810
David Blaikie9260ed62013-07-25 21:19:01 +00001811 // When using an integrated assembler, translate -Wa, and -Xassembler
1812 // options.
David Blaikie7e2fd942014-03-27 20:47:30 +00001813 bool CompressDebugSections = false;
David Blaikie9260ed62013-07-25 21:19:01 +00001814 for (arg_iterator it = Args.filtered_begin(options::OPT_Wa_COMMA,
1815 options::OPT_Xassembler),
1816 ie = Args.filtered_end(); it != ie; ++it) {
1817 const Arg *A = *it;
1818 A->claim();
1819
1820 for (unsigned i = 0, e = A->getNumValues(); i != e; ++i) {
1821 StringRef Value = A->getValue(i);
David Peixottodfb66142013-11-14 22:52:58 +00001822 if (TakeNextArg) {
1823 CmdArgs.push_back(Value.data());
1824 TakeNextArg = false;
1825 continue;
1826 }
David Blaikie9260ed62013-07-25 21:19:01 +00001827
1828 if (Value == "-force_cpusubtype_ALL") {
1829 // Do nothing, this is the default and we don't support anything else.
1830 } else if (Value == "-L") {
1831 CmdArgs.push_back("-msave-temp-labels");
1832 } else if (Value == "--fatal-warnings") {
1833 CmdArgs.push_back("-mllvm");
1834 CmdArgs.push_back("-fatal-assembler-warnings");
1835 } else if (Value == "--noexecstack") {
1836 CmdArgs.push_back("-mnoexecstack");
David Blaikieec59e752014-01-22 19:22:21 +00001837 } else if (Value == "-compress-debug-sections" ||
1838 Value == "--compress-debug-sections") {
David Blaikie7e2fd942014-03-27 20:47:30 +00001839 CompressDebugSections = true;
1840 } else if (Value == "-nocompress-debug-sections" ||
1841 Value == "--nocompress-debug-sections") {
1842 CompressDebugSections = false;
David Peixottodfb66142013-11-14 22:52:58 +00001843 } else if (Value.startswith("-I")) {
1844 CmdArgs.push_back(Value.data());
1845 // We need to consume the next argument if the current arg is a plain
1846 // -I. The next arg will be the include directory.
1847 if (Value == "-I")
1848 TakeNextArg = true;
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00001849 } else if (Value.startswith("-gdwarf-")) {
1850 CmdArgs.push_back(Value.data());
David Blaikie9260ed62013-07-25 21:19:01 +00001851 } else {
1852 D.Diag(diag::err_drv_unsupported_option_argument)
1853 << A->getOption().getName() << Value;
1854 }
1855 }
1856 }
David Blaikie24bbfed22014-03-31 23:29:38 +00001857 if (CompressDebugSections) {
1858 if (llvm::zlib::isAvailable())
1859 CmdArgs.push_back("-compress-debug-sections");
1860 else
1861 D.Diag(diag::warn_debug_compression_unavailable);
1862 }
David Blaikie9260ed62013-07-25 21:19:01 +00001863}
1864
Renato Goline807c122014-01-31 11:47:28 +00001865// Until ARM libraries are build separately, we have them all in one library
1866static StringRef getArchNameForCompilerRTLib(const ToolChain &TC) {
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00001867 if (TC.getArch() == llvm::Triple::arm ||
1868 TC.getArch() == llvm::Triple::armeb)
Renato Goline807c122014-01-31 11:47:28 +00001869 return "arm";
1870 else
1871 return TC.getArchName();
1872}
1873
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001874static SmallString<128> getCompilerRTLibDir(const ToolChain &TC) {
1875 // The runtimes are located in the OS-specific resource directory.
1876 SmallString<128> Res(TC.getDriver().ResourceDir);
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00001877 const llvm::Triple &Triple = TC.getTriple();
1878 // TC.getOS() yield "freebsd10.0" whereas "freebsd" is expected.
1879 StringRef OSLibName = (Triple.getOS() == llvm::Triple::FreeBSD) ?
1880 "freebsd" : TC.getOS();
1881 llvm::sys::path::append(Res, "lib", OSLibName);
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001882 return Res;
Alexey Samsonov7811d192014-02-20 13:57:37 +00001883}
1884
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00001885// This adds the static libclang_rt.builtins-arch.a directly to the command line
Renato Golinc4b49242014-02-13 10:01:16 +00001886// FIXME: Make sure we can also emit shared objects if they're requested
1887// and available, check for possible errors, etc.
1888static void addClangRTLinux(
1889 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001890 SmallString<128> LibClangRT = getCompilerRTLibDir(TC);
Alexey Samsonov99ee10d2014-05-22 21:13:30 +00001891 llvm::sys::path::append(LibClangRT, Twine("libclang_rt.builtins-") +
1892 getArchNameForCompilerRTLib(TC) +
1893 ".a");
Renato Golinc4b49242014-02-13 10:01:16 +00001894
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001895 CmdArgs.push_back(Args.MakeArgString(LibClangRT));
Renato Golinc4b49242014-02-13 10:01:16 +00001896 CmdArgs.push_back("-lgcc_s");
1897 if (TC.getDriver().CCCIsCXX())
1898 CmdArgs.push_back("-lgcc_eh");
1899}
1900
Alexey Samsonov7811d192014-02-20 13:57:37 +00001901static void addProfileRT(
Chandler Carruth36381702013-06-23 11:28:48 +00001902 const ToolChain &TC, const ArgList &Args, ArgStringList &CmdArgs) {
1903 if (!(Args.hasArg(options::OPT_fprofile_arcs) ||
1904 Args.hasArg(options::OPT_fprofile_generate) ||
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00001905 Args.hasArg(options::OPT_fprofile_instr_generate) ||
Chandler Carruth36381702013-06-23 11:28:48 +00001906 Args.hasArg(options::OPT_fcreate_profile) ||
1907 Args.hasArg(options::OPT_coverage)))
1908 return;
1909
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00001910 // -fprofile-instr-generate requires position-independent code to build with
1911 // shared objects. Link against the right archive.
1912 const char *Lib = "libclang_rt.profile-";
1913 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
1914 Args.hasArg(options::OPT_shared))
1915 Lib = "libclang_rt.profile-pic-";
1916
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001917 SmallString<128> LibProfile = getCompilerRTLibDir(TC);
1918 llvm::sys::path::append(LibProfile,
Duncan P. N. Exon Smith540c3cd2014-05-16 04:09:41 +00001919 Twine(Lib) + getArchNameForCompilerRTLib(TC) + ".a");
Chandler Carruth36381702013-06-23 11:28:48 +00001920
Duncan P. N. Exon Smith2d8f93e2014-03-28 17:53:17 +00001921 CmdArgs.push_back(Args.MakeArgString(LibProfile));
Chandler Carruth36381702013-06-23 11:28:48 +00001922}
1923
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001924static SmallString<128> getSanitizerRTLibName(const ToolChain &TC,
1925 const StringRef Sanitizer,
1926 bool Shared) {
1927 // Sanitizer runtime has name "libclang_rt.<Sanitizer>-<ArchName>.{a,so}"
1928 // (or "libclang_rt.<Sanitizer>-<ArchName>-android.so for Android)
1929 const char *EnvSuffix =
1930 TC.getTriple().getEnvironment() == llvm::Triple::Android ? "-android" : "";
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001931 SmallString<128> LibSanitizer = getCompilerRTLibDir(TC);
1932 llvm::sys::path::append(LibSanitizer,
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001933 Twine("libclang_rt.") + Sanitizer + "-" +
1934 getArchNameForCompilerRTLib(TC) + EnvSuffix +
1935 (Shared ? ".so" : ".a"));
1936 return LibSanitizer;
1937}
1938
1939static void addSanitizerRTLinkFlags(const ToolChain &TC, const ArgList &Args,
1940 ArgStringList &CmdArgs,
1941 const StringRef Sanitizer,
1942 bool BeforeLibStdCXX,
1943 bool ExportSymbols = true,
1944 bool LinkDeps = true) {
1945 SmallString<128> LibSanitizer =
1946 getSanitizerRTLibName(TC, Sanitizer, /*Shared*/ false);
Richard Smithcff3cde2013-03-20 23:49:07 +00001947
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001948 // Sanitizer runtime may need to come before -lstdc++ (or -lc++, libstdc++.a,
1949 // etc.) so that the linker picks custom versions of the global 'operator
1950 // new' and 'operator delete' symbols. We take the extreme (but simple)
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001951 // strategy of inserting it at the front of the link command. It also
1952 // needs to be forced to end up in the executable, so wrap it in
1953 // whole-archive.
Richard Smithcff3cde2013-03-20 23:49:07 +00001954 SmallVector<const char *, 3> LibSanitizerArgs;
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001955 LibSanitizerArgs.push_back("-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001956 LibSanitizerArgs.push_back(Args.MakeArgString(LibSanitizer));
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00001957 LibSanitizerArgs.push_back("-no-whole-archive");
Richard Smithcff3cde2013-03-20 23:49:07 +00001958
1959 CmdArgs.insert(BeforeLibStdCXX ? CmdArgs.begin() : CmdArgs.end(),
1960 LibSanitizerArgs.begin(), LibSanitizerArgs.end());
1961
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001962 if (LinkDeps) {
1963 // Link sanitizer dependencies explicitly
1964 CmdArgs.push_back("-lpthread");
1965 CmdArgs.push_back("-lrt");
1966 CmdArgs.push_back("-lm");
1967 // There's no libdl on FreeBSD.
1968 if (TC.getTriple().getOS() != llvm::Triple::FreeBSD)
1969 CmdArgs.push_back("-ldl");
1970 }
Richard Smithf3e624c2013-03-23 00:30:08 +00001971
1972 // If possible, use a dynamic symbols file to export the symbols from the
1973 // runtime library. If we can't do so, use -export-dynamic instead to export
1974 // all symbols from the binary.
1975 if (ExportSymbols) {
1976 if (llvm::sys::fs::exists(LibSanitizer + ".syms"))
1977 CmdArgs.push_back(
1978 Args.MakeArgString("--dynamic-list=" + LibSanitizer + ".syms"));
1979 else
1980 CmdArgs.push_back("-export-dynamic");
1981 }
Alexey Samsonovbfb0cd32013-02-27 11:14:55 +00001982}
1983
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00001984/// If AddressSanitizer is enabled, add appropriate linker flags (Linux).
1985/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00001986static void addAsanRT(const ToolChain &TC, const ArgList &Args,
Alexey Samsonovb01f9362014-05-12 18:39:51 +00001987 ArgStringList &CmdArgs, bool Shared, bool IsCXX) {
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001988 if (Shared) {
1989 // Link dynamic runtime if necessary.
1990 SmallString<128> LibSanitizer =
1991 getSanitizerRTLibName(TC, "asan", Shared);
1992 CmdArgs.insert(CmdArgs.begin(), Args.MakeArgString(LibSanitizer));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00001993 }
Alexey Samsonovbdfa6c22014-04-01 13:31:10 +00001994
1995 // Do not link static runtime to DSOs or if compiling for Android.
1996 if (Args.hasArg(options::OPT_shared) ||
1997 (TC.getTriple().getEnvironment() == llvm::Triple::Android))
1998 return;
1999
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002000 if (Shared) {
2001 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan-preinit",
2002 /*BeforeLibStdCXX*/ true, /*ExportSymbols*/ false,
2003 /*LinkDeps*/ false);
2004 } else {
2005 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan", true);
2006 if (IsCXX)
2007 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "asan_cxx", true);
2008 }
Kostya Serebryany7bca6c22011-11-30 01:39:16 +00002009}
2010
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00002011/// If ThreadSanitizer is enabled, add appropriate linker flags (Linux).
2012/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002013static void addTsanRT(const ToolChain &TC, const ArgList &Args,
2014 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002015 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002016 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "tsan", true);
Kostya Serebryany66e8fab2012-05-16 06:36:00 +00002017}
2018
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002019/// If MemorySanitizer is enabled, add appropriate linker flags (Linux).
2020/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002021static void addMsanRT(const ToolChain &TC, const ArgList &Args,
2022 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002023 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002024 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "msan", true);
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002025}
2026
2027/// If LeakSanitizer is enabled, add appropriate linker flags (Linux).
2028/// This needs to be called before we add the C run-time (malloc, etc).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002029static void addLsanRT(const ToolChain &TC, const ArgList &Args,
2030 ArgStringList &CmdArgs) {
Sergey Matveev1814e9e2013-05-27 11:17:01 +00002031 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002032 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "lsan", true);
Evgeniy Stepanovaea92e52012-12-03 13:20:43 +00002033}
2034
Richard Smithe30752c2012-10-09 19:52:38 +00002035/// If UndefinedBehaviorSanitizer is enabled, add appropriate linker flags
2036/// (Linux).
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002037static void addUbsanRT(const ToolChain &TC, const ArgList &Args,
2038 ArgStringList &CmdArgs, bool IsCXX,
2039 bool HasOtherSanitizerRt) {
Richard Smith4244ea92014-06-04 23:28:46 +00002040 // Export symbols if we're not building a shared library. This allows two
2041 // models: either every DSO containing ubsan-sanitized code contains the
2042 // ubsan runtime, or the main executable does (or both).
2043 const bool ExportSymbols = !Args.hasArg(options::OPT_shared);
2044
Nick Lewycky24921692013-10-19 00:27:23 +00002045 // Need a copy of sanitizer_common. This could come from another sanitizer
2046 // runtime; if we're not including one, include our own copy.
2047 if (!HasOtherSanitizerRt)
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002048 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "san", true, false);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002049
Richard Smith4244ea92014-06-04 23:28:46 +00002050 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan", false, ExportSymbols);
Peter Collingbournef7ef3fd812013-10-20 21:29:13 +00002051
2052 // Only include the bits of the runtime which need a C++ ABI library if
2053 // we're linking in C++ mode.
2054 if (IsCXX)
Richard Smith4244ea92014-06-04 23:28:46 +00002055 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "ubsan_cxx", false,
2056 ExportSymbols);
Richard Smithe30752c2012-10-09 19:52:38 +00002057}
2058
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002059static void addDfsanRT(const ToolChain &TC, const ArgList &Args,
2060 ArgStringList &CmdArgs) {
Peter Collingbournec3772752013-08-07 22:47:34 +00002061 if (!Args.hasArg(options::OPT_shared))
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002062 addSanitizerRTLinkFlags(TC, Args, CmdArgs, "dfsan", true);
2063}
2064
2065// Should be called before we add C++ ABI library.
2066static void addSanitizerRuntimes(const ToolChain &TC, const ArgList &Args,
2067 ArgStringList &CmdArgs) {
2068 const SanitizerArgs &Sanitize = TC.getSanitizerArgs();
2069 const Driver &D = TC.getDriver();
2070 if (Sanitize.needsUbsanRt())
2071 addUbsanRT(TC, Args, CmdArgs, D.CCCIsCXX(),
2072 Sanitize.needsAsanRt() || Sanitize.needsTsanRt() ||
2073 Sanitize.needsMsanRt() || Sanitize.needsLsanRt());
2074 if (Sanitize.needsAsanRt())
Alexey Samsonovb01f9362014-05-12 18:39:51 +00002075 addAsanRT(TC, Args, CmdArgs, Sanitize.needsSharedAsanRt(), D.CCCIsCXX());
Alexey Samsonovce8ab102014-02-25 12:43:43 +00002076 if (Sanitize.needsTsanRt())
2077 addTsanRT(TC, Args, CmdArgs);
2078 if (Sanitize.needsMsanRt())
2079 addMsanRT(TC, Args, CmdArgs);
2080 if (Sanitize.needsLsanRt())
2081 addLsanRT(TC, Args, CmdArgs);
2082 if (Sanitize.needsDfsanRt())
2083 addDfsanRT(TC, Args, CmdArgs);
Peter Collingbournec3772752013-08-07 22:47:34 +00002084}
2085
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002086static bool shouldUseFramePointerForTarget(const ArgList &Args,
2087 const llvm::Triple &Triple) {
2088 switch (Triple.getArch()) {
2089 // Don't use a frame pointer on linux if optimizing for certain targets.
2090 case llvm::Triple::mips64:
2091 case llvm::Triple::mips64el:
2092 case llvm::Triple::mips:
2093 case llvm::Triple::mipsel:
2094 case llvm::Triple::systemz:
2095 case llvm::Triple::x86:
2096 case llvm::Triple::x86_64:
2097 if (Triple.isOSLinux())
2098 if (Arg *A = Args.getLastArg(options::OPT_O_Group))
2099 if (!A->getOption().matches(options::OPT_O0))
2100 return false;
2101 return true;
2102 case llvm::Triple::xcore:
2103 return false;
2104 default:
2105 return true;
2106 }
2107}
2108
Rafael Espindola224dd632011-12-14 21:02:23 +00002109static bool shouldUseFramePointer(const ArgList &Args,
2110 const llvm::Triple &Triple) {
2111 if (Arg *A = Args.getLastArg(options::OPT_fno_omit_frame_pointer,
2112 options::OPT_fomit_frame_pointer))
2113 return A->getOption().matches(options::OPT_fno_omit_frame_pointer);
2114
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002115 return shouldUseFramePointerForTarget(Args, Triple);
Rafael Espindola224dd632011-12-14 21:02:23 +00002116}
2117
Eric Christopherb7d97e92013-04-03 01:58:53 +00002118static bool shouldUseLeafFramePointer(const ArgList &Args,
2119 const llvm::Triple &Triple) {
2120 if (Arg *A = Args.getLastArg(options::OPT_mno_omit_leaf_frame_pointer,
2121 options::OPT_momit_leaf_frame_pointer))
2122 return A->getOption().matches(options::OPT_mno_omit_leaf_frame_pointer);
2123
Benjamin Kramer34cb0432013-10-16 17:42:39 +00002124 return shouldUseFramePointerForTarget(Args, Triple);
Eric Christopherb7d97e92013-04-03 01:58:53 +00002125}
2126
Rafael Espindolac7367ff2013-08-10 01:40:10 +00002127/// Add a CC1 option to specify the debug compilation directory.
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002128static void addDebugCompDirArg(const ArgList &Args, ArgStringList &CmdArgs) {
Benjamin Kramer698d7c82013-04-27 08:12:29 +00002129 SmallString<128> cwd;
2130 if (!llvm::sys::fs::current_path(cwd)) {
Chad Rosiera35d5a32013-04-26 20:49:50 +00002131 CmdArgs.push_back("-fdebug-compilation-dir");
2132 CmdArgs.push_back(Args.MakeArgString(cwd));
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00002133 }
2134}
2135
Eric Christopherd3804002013-02-22 20:12:52 +00002136static const char *SplitDebugName(const ArgList &Args,
2137 const InputInfoList &Inputs) {
2138 Arg *FinalOutput = Args.getLastArg(options::OPT_o);
2139 if (FinalOutput && Args.hasArg(options::OPT_c)) {
2140 SmallString<128> T(FinalOutput->getValue());
2141 llvm::sys::path::replace_extension(T, "dwo");
2142 return Args.MakeArgString(T);
2143 } else {
2144 // Use the compilation dir.
Nico Webere8e53112014-05-11 01:04:02 +00002145 SmallString<128> T(
2146 Args.getLastArgValue(options::OPT_fdebug_compilation_dir));
Eric Christopherd3804002013-02-22 20:12:52 +00002147 SmallString<128> F(llvm::sys::path::stem(Inputs[0].getBaseInput()));
2148 llvm::sys::path::replace_extension(F, "dwo");
2149 T += F;
2150 return Args.MakeArgString(F);
2151 }
2152}
2153
2154static void SplitDebugInfo(const ToolChain &TC, Compilation &C,
2155 const Tool &T, const JobAction &JA,
2156 const ArgList &Args, const InputInfo &Output,
2157 const char *OutFile) {
Eric Christopher248357f2013-02-21 22:35:01 +00002158 ArgStringList ExtractArgs;
2159 ExtractArgs.push_back("--extract-dwo");
2160
2161 ArgStringList StripArgs;
2162 StripArgs.push_back("--strip-dwo");
2163
2164 // Grabbing the output of the earlier compile step.
2165 StripArgs.push_back(Output.getFilename());
2166 ExtractArgs.push_back(Output.getFilename());
Eric Christopher248357f2013-02-21 22:35:01 +00002167 ExtractArgs.push_back(OutFile);
2168
2169 const char *Exec =
Eric Christopherd3804002013-02-22 20:12:52 +00002170 Args.MakeArgString(TC.GetProgramPath("objcopy"));
Eric Christopher248357f2013-02-21 22:35:01 +00002171
2172 // First extract the dwo sections.
Eric Christopherd3804002013-02-22 20:12:52 +00002173 C.addCommand(new Command(JA, T, Exec, ExtractArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002174
2175 // Then remove them from the original .o file.
Eric Christopherd3804002013-02-22 20:12:52 +00002176 C.addCommand(new Command(JA, T, Exec, StripArgs));
Eric Christopher248357f2013-02-21 22:35:01 +00002177}
2178
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002179/// \brief Vectorize at all optimization levels greater than 1 except for -Oz.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002180/// For -Oz the loop vectorizer is disable, while the slp vectorizer is enabled.
2181static bool shouldEnableVectorizerAtOLevel(const ArgList &Args, bool isSlpVec) {
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002182 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
Rafael Espindolaad70d962013-08-27 16:58:15 +00002183 if (A->getOption().matches(options::OPT_O4) ||
2184 A->getOption().matches(options::OPT_Ofast))
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002185 return true;
2186
2187 if (A->getOption().matches(options::OPT_O0))
2188 return false;
2189
2190 assert(A->getOption().matches(options::OPT_O) && "Must have a -O flag");
2191
Rafael Espindola91780de2013-08-26 14:05:41 +00002192 // Vectorize -Os.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002193 StringRef S(A->getValue());
Rafael Espindola91780de2013-08-26 14:05:41 +00002194 if (S == "s")
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002195 return true;
2196
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002197 // Don't vectorize -Oz, unless it's the slp vectorizer.
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002198 if (S == "z")
Chad Rosier3ba81bd2014-05-02 18:41:57 +00002199 return isSlpVec;
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00002200
2201 unsigned OptLevel = 0;
2202 if (S.getAsInteger(10, OptLevel))
2203 return false;
2204
2205 return OptLevel > 1;
2206 }
2207
2208 return false;
2209}
2210
Ben Langmuir2cb4a782014-02-05 22:21:15 +00002211/// Add -x lang to \p CmdArgs for \p Input.
2212static void addDashXForInput(const ArgList &Args, const InputInfo &Input,
2213 ArgStringList &CmdArgs) {
2214 // When using -verify-pch, we don't want to provide the type
2215 // 'precompiled-header' if it was inferred from the file extension
2216 if (Args.hasArg(options::OPT_verify_pch) && Input.getType() == types::TY_PCH)
2217 return;
2218
2219 CmdArgs.push_back("-x");
2220 if (Args.hasArg(options::OPT_rewrite_objc))
2221 CmdArgs.push_back(types::getTypeName(types::TY_PP_ObjCXX));
2222 else
2223 CmdArgs.push_back(types::getTypeName(Input.getType()));
2224}
2225
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002226void Clang::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +00002227 const InputInfo &Output,
Daniel Dunbar0450e6d2009-03-18 06:07:59 +00002228 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002229 const ArgList &Args,
Daniel Dunbar1a093d22009-03-18 06:00:36 +00002230 const char *LinkingOutput) const {
Daniel Dunbare46b52a2010-03-20 04:52:14 +00002231 bool KernelOrKext = Args.hasArg(options::OPT_mkernel,
2232 options::OPT_fapple_kext);
Daniel Dunbar083edf72009-12-21 18:54:17 +00002233 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00002234 ArgStringList CmdArgs;
2235
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002236 bool IsWindowsGNU = getToolChain().getTriple().isWindowsGNUEnvironment();
Nico Webere8e53112014-05-11 01:04:02 +00002237 bool IsWindowsCygnus =
2238 getToolChain().getTriple().isWindowsCygwinEnvironment();
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002239 bool IsWindowsMSVC = getToolChain().getTriple().isWindowsMSVCEnvironment();
2240
Daniel Dunbare521a892009-03-31 20:53:55 +00002241 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
2242
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00002243 // Invoke ourselves in -cc1 mode.
2244 //
2245 // FIXME: Implement custom jobs for internal actions.
2246 CmdArgs.push_back("-cc1");
2247
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002248 // Add the "effective" target triple.
Daniel Dunbard640be22009-03-31 17:35:15 +00002249 CmdArgs.push_back("-triple");
Daniel Dunbar82eb4ce2010-08-23 22:35:37 +00002250 std::string TripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002251 CmdArgs.push_back(Args.MakeArgString(TripleStr));
Daniel Dunbarfb58b0a2009-09-10 06:49:20 +00002252
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002253 const llvm::Triple TT(TripleStr);
2254 if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
2255 TT.getArch() == llvm::Triple::thumb)) {
2256 unsigned Offset = TT.getArch() == llvm::Triple::arm ? 4 : 6;
2257 unsigned Version;
2258 TT.getArchName().substr(Offset).getAsInteger(10, Version);
2259 if (Version < 7)
Nico Webere8e53112014-05-11 01:04:02 +00002260 D.Diag(diag::err_target_unsupported_arch) << TT.getArchName()
2261 << TripleStr;
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00002262 }
2263
Tim Northover336f1892014-03-29 13:16:12 +00002264 // Push all default warning arguments that are specific to
2265 // the given target. These come before user provided warning options
2266 // are provided.
2267 getToolChain().addClangWarningOptions(CmdArgs);
2268
Daniel Dunbar624c21b2009-10-30 18:12:20 +00002269 // Select the appropriate action.
John McCall5fb5df92012-06-20 06:18:46 +00002270 RewriteKind rewriteKind = RK_None;
Fariborz Jahanian7ebeede2012-04-04 18:50:28 +00002271
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002272 if (isa<AnalyzeJobAction>(JA)) {
2273 assert(JA.getType() == types::TY_Plist && "Invalid output type.");
2274 CmdArgs.push_back("-analyze");
Ted Kremenekf7639e12012-03-06 20:06:33 +00002275 } else if (isa<MigrateJobAction>(JA)) {
2276 CmdArgs.push_back("-migrate");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002277 } else if (isa<PreprocessJobAction>(JA)) {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002278 if (Output.getType() == types::TY_Dependencies)
2279 CmdArgs.push_back("-Eonly");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002280 else {
Daniel Dunbard67a3222009-03-30 06:36:42 +00002281 CmdArgs.push_back("-E");
Fariborz Jahaniane0a75d62013-03-18 19:41:18 +00002282 if (Args.hasArg(options::OPT_rewrite_objc) &&
2283 !Args.hasArg(options::OPT_g_Group))
2284 CmdArgs.push_back("-P");
2285 }
Daniel Dunbarc4343942010-02-03 03:07:56 +00002286 } else if (isa<AssembleJobAction>(JA)) {
2287 CmdArgs.push_back("-emit-obj");
Daniel Dunbar06e2cc32010-05-27 06:18:05 +00002288
David Blaikie9260ed62013-07-25 21:19:01 +00002289 CollectArgsForIntegratedAssembler(C, Args, CmdArgs, D);
Daniel Dunbar7c874332010-11-19 16:23:35 +00002290
2291 // Also ignore explicit -force_cpusubtype_ALL option.
2292 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002293 } else if (isa<PrecompileJobAction>(JA)) {
Argyrios Kyrtzidis90bdfbb2010-08-11 23:27:58 +00002294 // Use PCH if the user requested it.
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002295 bool UsePCH = D.CCCUsePCH;
Daniel Dunbarcbc34b72009-10-15 20:02:44 +00002296
Aaron Ballman1f10cc52012-07-31 01:21:00 +00002297 if (JA.getType() == types::TY_Nothing)
2298 CmdArgs.push_back("-fsyntax-only");
2299 else if (UsePCH)
Douglas Gregor111af7d2009-04-18 00:34:01 +00002300 CmdArgs.push_back("-emit-pch");
2301 else
2302 CmdArgs.push_back("-emit-pth");
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002303 } else if (isa<VerifyPCHJobAction>(JA)) {
2304 CmdArgs.push_back("-verify-pch");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002305 } else {
2306 assert(isa<CompileJobAction>(JA) && "Invalid action for clang tool.");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002307
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002308 if (JA.getType() == types::TY_Nothing) {
Ben Langmuir9b9a8d32014-02-06 18:53:25 +00002309 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002310 } else if (JA.getType() == types::TY_LLVM_IR ||
2311 JA.getType() == types::TY_LTO_IR) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002312 CmdArgs.push_back("-emit-llvm");
Daniel Dunbar24e52992010-06-07 23:28:45 +00002313 } else if (JA.getType() == types::TY_LLVM_BC ||
2314 JA.getType() == types::TY_LTO_BC) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002315 CmdArgs.push_back("-emit-llvm-bc");
2316 } else if (JA.getType() == types::TY_PP_Asm) {
Daniel Dunbard112f102009-09-17 00:47:53 +00002317 CmdArgs.push_back("-S");
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00002318 } else if (JA.getType() == types::TY_AST) {
2319 CmdArgs.push_back("-emit-pch");
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00002320 } else if (JA.getType() == types::TY_ModuleFile) {
2321 CmdArgs.push_back("-module-file-info");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002322 } else if (JA.getType() == types::TY_RewrittenObjC) {
2323 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002324 rewriteKind = RK_NonFragile;
Fariborz Jahanian73223bb2012-04-02 15:59:19 +00002325 } else if (JA.getType() == types::TY_RewrittenLegacyObjC) {
2326 CmdArgs.push_back("-rewrite-objc");
John McCall5fb5df92012-06-20 06:18:46 +00002327 rewriteKind = RK_Fragile;
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00002328 } else {
2329 assert(JA.getType() == types::TY_PP_Asm &&
2330 "Unexpected output type!");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002331 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00002332 }
2333
Justin Bognera88f0122014-06-20 22:59:50 +00002334 // We normally speed up the clang process a bit by skipping destructors at
2335 // exit, but when we're generating diagnostics we can rely on some of the
2336 // cleanup.
2337 if (!C.isForDiagnostics())
2338 CmdArgs.push_back("-disable-free");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002339
John McCallbb79b5f2010-02-13 03:50:24 +00002340 // Disable the verification pass in -asserts builds.
2341#ifdef NDEBUG
2342 CmdArgs.push_back("-disable-llvm-verifier");
2343#endif
2344
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002345 // Set the main file name, so that debug info works even with
2346 // -save-temps.
2347 CmdArgs.push_back("-main-file-name");
Bob Wilsondecc03e2012-11-23 06:14:39 +00002348 CmdArgs.push_back(getBaseInputName(Args, Inputs));
Daniel Dunbar3b358a32009-04-08 05:11:16 +00002349
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002350 // Some flags which affect the language (via preprocessor
Bob Wilsondecc03e2012-11-23 06:14:39 +00002351 // defines).
Daniel Dunbar17ddaa62009-04-08 18:03:55 +00002352 if (Args.hasArg(options::OPT_static))
2353 CmdArgs.push_back("-static-define");
2354
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002355 if (isa<AnalyzeJobAction>(JA)) {
Ted Kremenek05e6f5b2009-09-25 05:55:59 +00002356 // Enable region store model by default.
2357 CmdArgs.push_back("-analyzer-store=region");
2358
Ted Kremenek7bea9a12009-12-07 22:26:14 +00002359 // Treat blocks as analysis entry points.
2360 CmdArgs.push_back("-analyzer-opt-analyze-nested-blocks");
2361
Ted Kremenek49c79792011-03-24 00:28:47 +00002362 CmdArgs.push_back("-analyzer-eagerly-assume");
2363
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002364 // Add default argument set.
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002365 if (!Args.hasArg(options::OPT__analyzer_no_default_checks)) {
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002366 CmdArgs.push_back("-analyzer-checker=core");
Ted Kremenek49c79792011-03-24 00:28:47 +00002367
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00002368 if (!IsWindowsMSVC)
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002369 CmdArgs.push_back("-analyzer-checker=unix");
Ted Kremenek49c79792011-03-24 00:28:47 +00002370
Argyrios Kyrtzidisa6d04d52011-02-15 07:42:33 +00002371 if (getToolChain().getTriple().getVendor() == llvm::Triple::Apple)
Ted Kremenek49c79792011-03-24 00:28:47 +00002372 CmdArgs.push_back("-analyzer-checker=osx");
Ted Kremenekb9ff6b22012-01-20 06:00:17 +00002373
2374 CmdArgs.push_back("-analyzer-checker=deadcode");
Ted Kremenek37e96522012-01-26 02:27:38 +00002375
Jordan Rose10ad0812013-04-05 17:55:07 +00002376 if (types::isCXX(Inputs[0].getType()))
2377 CmdArgs.push_back("-analyzer-checker=cplusplus");
2378
Nico Webere8e53112014-05-11 01:04:02 +00002379 // Enable the following experimental checkers for testing.
2380 CmdArgs.push_back(
2381 "-analyzer-checker=security.insecureAPI.UncheckedReturn");
Ted Kremenek37e96522012-01-26 02:27:38 +00002382 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.getpw");
2383 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.gets");
2384 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mktemp");
2385 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.mkstemp");
2386 CmdArgs.push_back("-analyzer-checker=security.insecureAPI.vfork");
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002387 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00002388
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002389 // Set the output format. The default is plist, for (lame) historical
2390 // reasons.
2391 CmdArgs.push_back("-analyzer-output");
2392 if (Arg *A = Args.getLastArg(options::OPT__analyzer_output))
Richard Smithbd55daf2012-11-01 04:30:05 +00002393 CmdArgs.push_back(A->getValue());
Daniel Dunbar58f345ce2009-05-22 00:38:15 +00002394 else
2395 CmdArgs.push_back("plist");
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002396
Ted Kremenekfe449a22010-03-22 22:32:05 +00002397 // Disable the presentation of standard compiler warnings when
2398 // using --analyze. We only want to show static analyzer diagnostics
2399 // or frontend errors.
2400 CmdArgs.push_back("-w");
2401
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002402 // Add -Xanalyzer arguments when running as analyzer.
2403 Args.AddAllArgValues(CmdArgs, options::OPT_Xanalyzer);
Mike Stump11289f42009-09-09 15:08:12 +00002404 }
2405
Daniel Dunbar4eadb602009-09-10 01:21:12 +00002406 CheckCodeGenerationOptions(D, Args);
2407
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002408 bool PIE = getToolChain().isPIEDefault();
2409 bool PIC = PIE || getToolChain().isPICDefault();
Chandler Carruth76a943b2012-11-19 03:52:03 +00002410 bool IsPICLevelTwo = PIC;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002411
Alexey Bataev40e75222014-01-28 06:30:35 +00002412 // Android-specific defaults for PIC/PIE
2413 if (getToolChain().getTriple().getEnvironment() == llvm::Triple::Android) {
2414 switch (getToolChain().getTriple().getArch()) {
2415 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002416 case llvm::Triple::armeb:
Alexey Bataev40e75222014-01-28 06:30:35 +00002417 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002418 case llvm::Triple::thumbeb:
Logan Chien4ecf0152014-04-29 18:18:58 +00002419 case llvm::Triple::aarch64:
Logan Chien28f87f82014-04-30 12:18:12 +00002420 case llvm::Triple::arm64:
Alexey Bataev40e75222014-01-28 06:30:35 +00002421 case llvm::Triple::mips:
2422 case llvm::Triple::mipsel:
2423 case llvm::Triple::mips64:
2424 case llvm::Triple::mips64el:
2425 PIC = true; // "-fpic"
2426 break;
2427
2428 case llvm::Triple::x86:
2429 case llvm::Triple::x86_64:
2430 PIC = true; // "-fPIC"
2431 IsPICLevelTwo = true;
2432 break;
2433
2434 default:
2435 break;
2436 }
2437 }
2438
Brad Smith5b05db82014-06-24 19:51:29 +00002439 // OpenBSD-specific defaults for PIE
2440 if (getToolChain().getTriple().getOS() == llvm::Triple::OpenBSD) {
2441 switch (getToolChain().getTriple().getArch()) {
2442 case llvm::Triple::mips64:
2443 case llvm::Triple::mips64el:
2444 case llvm::Triple::sparc:
2445 case llvm::Triple::x86:
2446 case llvm::Triple::x86_64:
2447 IsPICLevelTwo = false; // "-fpie"
2448 break;
2449
2450 case llvm::Triple::ppc:
2451 case llvm::Triple::sparcv9:
2452 IsPICLevelTwo = true; // "-fPIE"
2453 break;
2454
2455 default:
2456 break;
2457 }
2458 }
2459
Alexey Samsonov090301e2013-04-09 12:28:19 +00002460 // For the PIC and PIE flag options, this logic is different from the
2461 // legacy logic in very old versions of GCC, as that logic was just
2462 // a bug no one had ever fixed. This logic is both more rational and
2463 // consistent with GCC's new logic now that the bugs are fixed. The last
2464 // argument relating to either PIC or PIE wins, and no other argument is
2465 // used. If the last argument is any flavor of the '-fno-...' arguments,
2466 // both PIC and PIE are disabled. Any PIE option implicitly enables PIC
2467 // at the same level.
2468 Arg *LastPICArg =Args.getLastArg(options::OPT_fPIC, options::OPT_fno_PIC,
2469 options::OPT_fpic, options::OPT_fno_pic,
2470 options::OPT_fPIE, options::OPT_fno_PIE,
2471 options::OPT_fpie, options::OPT_fno_pie);
Chandler Carruth76a943b2012-11-19 03:52:03 +00002472 // Check whether the tool chain trumps the PIC-ness decision. If the PIC-ness
2473 // is forced, then neither PIC nor PIE flags will have no effect.
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002474 if (!getToolChain().isPICDefaultForced()) {
Alexey Samsonov090301e2013-04-09 12:28:19 +00002475 if (LastPICArg) {
2476 Option O = LastPICArg->getOption();
Peter Collingbourne54d770c2013-04-09 04:35:11 +00002477 if (O.matches(options::OPT_fPIC) || O.matches(options::OPT_fpic) ||
2478 O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie)) {
2479 PIE = O.matches(options::OPT_fPIE) || O.matches(options::OPT_fpie);
2480 PIC = PIE || O.matches(options::OPT_fPIC) ||
2481 O.matches(options::OPT_fpic);
2482 IsPICLevelTwo = O.matches(options::OPT_fPIE) ||
2483 O.matches(options::OPT_fPIC);
2484 } else {
2485 PIE = PIC = false;
2486 }
2487 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002488 }
Chandler Carruth76a943b2012-11-19 03:52:03 +00002489
Nick Lewycky609dd662013-10-11 03:33:53 +00002490 // Introduce a Darwin-specific hack. If the default is PIC but the flags
Chandler Carruth76a943b2012-11-19 03:52:03 +00002491 // specified while enabling PIC enabled level 1 PIC, just force it back to
2492 // level 2 PIC instead. This matches the behavior of Darwin GCC (based on my
2493 // informal testing).
2494 if (PIC && getToolChain().getTriple().isOSDarwin())
2495 IsPICLevelTwo |= getToolChain().isPICDefault();
2496
Chandler Carruthc0c04552012-04-08 16:40:35 +00002497 // Note that these flags are trump-cards. Regardless of the order w.r.t. the
2498 // PIC or PIE options above, if these show up, PIC is disabled.
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00002499 llvm::Triple Triple(TripleStr);
Tim Northovera2ee4332014-03-29 15:09:45 +00002500 if (KernelOrKext && (!Triple.isiOS() || Triple.isOSVersionLT(6) ||
Tim Northover573cbee2014-05-24 12:52:07 +00002501 Triple.getArch() == llvm::Triple::arm64 ||
2502 Triple.getArch() == llvm::Triple::aarch64))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002503 PIC = PIE = false;
Simon Atanasyaneeb6f272013-10-04 11:46:54 +00002504 if (Args.hasArg(options::OPT_static))
Chandler Carruth76a943b2012-11-19 03:52:03 +00002505 PIC = PIE = false;
Chandler Carruthc0c04552012-04-08 16:40:35 +00002506
Chandler Carruth76a943b2012-11-19 03:52:03 +00002507 if (Arg *A = Args.getLastArg(options::OPT_mdynamic_no_pic)) {
2508 // This is a very special mode. It trumps the other modes, almost no one
2509 // uses it, and it isn't even valid on any OS but Darwin.
2510 if (!getToolChain().getTriple().isOSDarwin())
2511 D.Diag(diag::err_drv_unsupported_opt_for_target)
2512 << A->getSpelling() << getToolChain().getTriple().str();
2513
2514 // FIXME: Warn when this flag trumps some other PIC or PIE flag.
2515
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002516 CmdArgs.push_back("-mrelocation-model");
Chandler Carruth76a943b2012-11-19 03:52:03 +00002517 CmdArgs.push_back("dynamic-no-pic");
Daniel Dunbar44e71222009-04-29 18:32:25 +00002518
Chandler Carruth76a943b2012-11-19 03:52:03 +00002519 // Only a forced PIC mode can cause the actual compile to have PIC defines
2520 // etc., no flags are sufficient. This behavior was selected to closely
2521 // match that of llvm-gcc and Apple GCC before that.
2522 if (getToolChain().isPICDefault() && getToolChain().isPICDefaultForced()) {
2523 CmdArgs.push_back("-pic-level");
2524 CmdArgs.push_back("2");
2525 }
2526 } else {
2527 // Currently, LLVM only knows about PIC vs. static; the PIE differences are
2528 // handled in Clang's IRGen by the -pie-level flag.
2529 CmdArgs.push_back("-mrelocation-model");
2530 CmdArgs.push_back(PIC ? "pic" : "static");
2531
2532 if (PIC) {
2533 CmdArgs.push_back("-pic-level");
2534 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2535 if (PIE) {
2536 CmdArgs.push_back("-pie-level");
2537 CmdArgs.push_back(IsPICLevelTwo ? "2" : "1");
2538 }
2539 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002540 }
Chandler Carruthc0c04552012-04-08 16:40:35 +00002541
Tanya Lattnerf9d41df2009-11-04 01:18:09 +00002542 if (!Args.hasFlag(options::OPT_fmerge_all_constants,
2543 options::OPT_fno_merge_all_constants))
Chris Lattner9242b332011-04-08 18:06:54 +00002544 CmdArgs.push_back("-fno-merge-all-constants");
Daniel Dunbar306945d2009-09-16 06:17:29 +00002545
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002546 // LLVM Code Generator Options.
2547
Alp Tokerfb8d02b2014-06-05 22:10:59 +00002548 if (Arg *A = Args.getLastArg(options::OPT_Wframe_larger_than_EQ)) {
2549 StringRef v = A->getValue();
2550 CmdArgs.push_back("-mllvm");
2551 CmdArgs.push_back(Args.MakeArgString("-warn-stack-size=" + v));
2552 A->claim();
2553 }
2554
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002555 if (Arg *A = Args.getLastArg(options::OPT_mregparm_EQ)) {
2556 CmdArgs.push_back("-mregparm");
Richard Smithbd55daf2012-11-01 04:30:05 +00002557 CmdArgs.push_back(A->getValue());
Daniel Dunbar0bb03312011-02-09 17:54:19 +00002558 }
2559
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00002560 if (Arg *A = Args.getLastArg(options::OPT_fpcc_struct_return,
2561 options::OPT_freg_struct_return)) {
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002562 if (getToolChain().getArch() != llvm::Triple::x86) {
John McCall1fe2a8c2013-06-18 02:46:29 +00002563 D.Diag(diag::err_drv_unsupported_opt_for_target)
2564 << A->getSpelling() << getToolChain().getTriple().str();
2565 } else if (A->getOption().matches(options::OPT_fpcc_struct_return)) {
2566 CmdArgs.push_back("-fpcc-struct-return");
2567 } else {
2568 assert(A->getOption().matches(options::OPT_freg_struct_return));
2569 CmdArgs.push_back("-freg-struct-return");
2570 }
2571 }
2572
Roman Divacky65b88cd2011-03-01 17:40:53 +00002573 if (Args.hasFlag(options::OPT_mrtd, options::OPT_mno_rtd, false))
2574 CmdArgs.push_back("-mrtd");
2575
Rafael Espindola224dd632011-12-14 21:02:23 +00002576 if (shouldUseFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002577 CmdArgs.push_back("-mdisable-fp-elim");
2578 if (!Args.hasFlag(options::OPT_fzero_initialized_in_bss,
2579 options::OPT_fno_zero_initialized_in_bss))
2580 CmdArgs.push_back("-mno-zero-initialized-in-bss");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002581
2582 bool OFastEnabled = isOptimizationLevelFast(Args);
2583 // If -Ofast is the optimization level, then -fstrict-aliasing should be
2584 // enabled. This alias option is being used to simplify the hasFlag logic.
2585 OptSpecifier StrictAliasingAliasOption = OFastEnabled ? options::OPT_Ofast :
2586 options::OPT_fstrict_aliasing;
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002587 // We turn strict aliasing off by default if we're in CL mode, since MSVC
2588 // doesn't do any TBAA.
2589 bool TBAAOnByDefault = !getToolChain().getDriver().IsCLMode();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002590 if (!Args.hasFlag(options::OPT_fstrict_aliasing, StrictAliasingAliasOption,
Reid Kleckner2a24e3a2014-04-09 20:07:39 +00002591 options::OPT_fno_strict_aliasing, TBAAOnByDefault))
Dan Gohman10169b92010-10-14 22:36:56 +00002592 CmdArgs.push_back("-relaxed-aliasing");
Manman Renf5d9d342013-10-11 20:48:38 +00002593 if (!Args.hasFlag(options::OPT_fstruct_path_tbaa,
2594 options::OPT_fno_struct_path_tbaa))
2595 CmdArgs.push_back("-no-struct-path-tbaa");
Chandler Carruth8b4140d2012-03-27 23:58:37 +00002596 if (Args.hasFlag(options::OPT_fstrict_enums, options::OPT_fno_strict_enums,
2597 false))
2598 CmdArgs.push_back("-fstrict-enums");
Nick Lewycky1c8c4362012-01-23 08:29:12 +00002599 if (!Args.hasFlag(options::OPT_foptimize_sibling_calls,
2600 options::OPT_fno_optimize_sibling_calls))
2601 CmdArgs.push_back("-mdisable-tail-calls");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002602
Eric Christopher006208c2013-04-04 06:29:47 +00002603 // Handle segmented stacks.
2604 if (Args.hasArg(options::OPT_fsplit_stack))
2605 CmdArgs.push_back("-split-stacks");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002606
2607 // If -Ofast is the optimization level, then -ffast-math should be enabled.
2608 // This alias option is being used to simplify the getLastArg logic.
2609 OptSpecifier FastMathAliasOption = OFastEnabled ? options::OPT_Ofast :
2610 options::OPT_ffast_math;
Eric Christopher006208c2013-04-04 06:29:47 +00002611
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002612 // Handle various floating point optimization flags, mapping them to the
2613 // appropriate LLVM code generation flags. The pattern for all of these is to
2614 // default off the codegen optimizations, and if any flag enables them and no
2615 // flag disables them after the flag enabling them, enable the codegen
2616 // optimization. This is complicated by several "umbrella" flags.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002617 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002618 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002619 options::OPT_ffinite_math_only,
2620 options::OPT_fno_finite_math_only,
2621 options::OPT_fhonor_infinities,
2622 options::OPT_fno_honor_infinities))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002623 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2624 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002625 A->getOption().getID() != options::OPT_fhonor_infinities)
2626 CmdArgs.push_back("-menable-no-infs");
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002627 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002628 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002629 options::OPT_ffinite_math_only,
2630 options::OPT_fno_finite_math_only,
2631 options::OPT_fhonor_nans,
2632 options::OPT_fno_honor_nans))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002633 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2634 A->getOption().getID() != options::OPT_fno_finite_math_only &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002635 A->getOption().getID() != options::OPT_fhonor_nans)
2636 CmdArgs.push_back("-menable-no-nans");
2637
Benjamin Kramerc242ef22012-05-02 14:55:48 +00002638 // -fmath-errno is the default on some platforms, e.g. BSD-derived OSes.
2639 bool MathErrno = getToolChain().IsMathErrnoDefault();
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002640 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002641 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002642 options::OPT_fmath_errno,
Chandler Carruth0d4b9e62013-05-18 20:47:36 +00002643 options::OPT_fno_math_errno)) {
2644 // Turning on -ffast_math (with either flag) removes the need for MathErrno.
2645 // However, turning *off* -ffast_math merely restores the toolchain default
2646 // (which may be false).
2647 if (A->getOption().getID() == options::OPT_fno_math_errno ||
2648 A->getOption().getID() == options::OPT_ffast_math ||
2649 A->getOption().getID() == options::OPT_Ofast)
2650 MathErrno = false;
2651 else if (A->getOption().getID() == options::OPT_fmath_errno)
2652 MathErrno = true;
2653 }
Chandler Carruth3634c662012-04-26 02:10:51 +00002654 if (MathErrno)
2655 CmdArgs.push_back("-fmath-errno");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002656
2657 // There are several flags which require disabling very specific
2658 // optimizations. Any of these being disabled forces us to turn off the
2659 // entire set of LLVM optimizations, so collect them through all the flag
2660 // madness.
2661 bool AssociativeMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002662 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002663 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002664 options::OPT_funsafe_math_optimizations,
2665 options::OPT_fno_unsafe_math_optimizations,
2666 options::OPT_fassociative_math,
2667 options::OPT_fno_associative_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002668 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2669 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002670 A->getOption().getID() != options::OPT_fno_associative_math)
2671 AssociativeMath = true;
2672 bool ReciprocalMath = false;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002673 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002674 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002675 options::OPT_funsafe_math_optimizations,
2676 options::OPT_fno_unsafe_math_optimizations,
2677 options::OPT_freciprocal_math,
2678 options::OPT_fno_reciprocal_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002679 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2680 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002681 A->getOption().getID() != options::OPT_fno_reciprocal_math)
2682 ReciprocalMath = true;
2683 bool SignedZeros = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002684 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002685 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002686 options::OPT_funsafe_math_optimizations,
2687 options::OPT_fno_unsafe_math_optimizations,
2688 options::OPT_fsigned_zeros,
2689 options::OPT_fno_signed_zeros))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002690 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2691 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002692 A->getOption().getID() != options::OPT_fsigned_zeros)
2693 SignedZeros = false;
2694 bool TrappingMath = true;
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002695 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002696 options::OPT_fno_fast_math,
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002697 options::OPT_funsafe_math_optimizations,
2698 options::OPT_fno_unsafe_math_optimizations,
2699 options::OPT_ftrapping_math,
2700 options::OPT_fno_trapping_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002701 if (A->getOption().getID() != options::OPT_fno_fast_math &&
2702 A->getOption().getID() != options::OPT_fno_unsafe_math_optimizations &&
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002703 A->getOption().getID() != options::OPT_ftrapping_math)
2704 TrappingMath = false;
2705 if (!MathErrno && AssociativeMath && ReciprocalMath && !SignedZeros &&
2706 !TrappingMath)
2707 CmdArgs.push_back("-menable-unsafe-fp-math");
2708
Lang Hamesaa53b932012-07-06 00:59:19 +00002709
2710 // Validate and pass through -fp-contract option.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002711 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002712 options::OPT_fno_fast_math,
Lang Hamesaa53b932012-07-06 00:59:19 +00002713 options::OPT_ffp_contract)) {
2714 if (A->getOption().getID() == options::OPT_ffp_contract) {
Richard Smithbd55daf2012-11-01 04:30:05 +00002715 StringRef Val = A->getValue();
Lang Hamesaa53b932012-07-06 00:59:19 +00002716 if (Val == "fast" || Val == "on" || Val == "off") {
2717 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=" + Val));
2718 } else {
2719 D.Diag(diag::err_drv_unsupported_option_argument)
2720 << A->getOption().getName() << Val;
2721 }
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002722 } else if (A->getOption().matches(options::OPT_ffast_math) ||
2723 (OFastEnabled && A->getOption().matches(options::OPT_Ofast))) {
Lang Hamesaa53b932012-07-06 00:59:19 +00002724 // If fast-math is set then set the fp-contract mode to fast.
2725 CmdArgs.push_back(Args.MakeArgString("-ffp-contract=fast"));
2726 }
2727 }
2728
Bob Wilson6a039162012-07-19 03:52:53 +00002729 // We separately look for the '-ffast-math' and '-ffinite-math-only' flags,
2730 // and if we find them, tell the frontend to provide the appropriate
2731 // preprocessor macros. This is distinct from enabling any optimizations as
2732 // these options induce language changes which must survive serialization
2733 // and deserialization, etc.
Chad Rosierb71f6aa2013-04-24 18:09:54 +00002734 if (Arg *A = Args.getLastArg(options::OPT_ffast_math, FastMathAliasOption,
2735 options::OPT_fno_fast_math))
2736 if (!A->getOption().matches(options::OPT_fno_fast_math))
2737 CmdArgs.push_back("-ffast-math");
Nico Webere8e53112014-05-11 01:04:02 +00002738 if (Arg *A = Args.getLastArg(options::OPT_ffinite_math_only,
2739 options::OPT_fno_fast_math))
Chad Rosierc30eb1c2012-09-25 22:03:25 +00002740 if (A->getOption().matches(options::OPT_ffinite_math_only))
2741 CmdArgs.push_back("-ffinite-math-only");
Chandler Carruth306bd2c2012-01-02 14:19:45 +00002742
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002743 // Decide whether to use verbose asm. Verbose assembly is the default on
2744 // toolchains which have the integrated assembler on by default.
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002745 bool IsIntegratedAssemblerDefault =
2746 getToolChain().IsIntegratedAssemblerDefault();
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002747 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002748 IsIntegratedAssemblerDefault) ||
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002749 Args.hasArg(options::OPT_dA))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002750 CmdArgs.push_back("-masm-verbose");
Daniel Dunbar0d8ca9e2010-05-14 22:00:22 +00002751
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00002752 if (!Args.hasFlag(options::OPT_fintegrated_as, options::OPT_fno_integrated_as,
Saleem Abdulrasool42e4b592014-02-22 23:37:58 +00002753 IsIntegratedAssemblerDefault))
2754 CmdArgs.push_back("-no-integrated-as");
2755
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002756 if (Args.hasArg(options::OPT_fdebug_pass_structure)) {
2757 CmdArgs.push_back("-mdebug-pass");
2758 CmdArgs.push_back("Structure");
2759 }
2760 if (Args.hasArg(options::OPT_fdebug_pass_arguments)) {
2761 CmdArgs.push_back("-mdebug-pass");
2762 CmdArgs.push_back("Arguments");
2763 }
2764
John McCall8517abc2010-02-19 02:45:38 +00002765 // Enable -mconstructor-aliases except on darwin, where we have to
2766 // work around a linker bug; see <rdar://problem/7651567>.
Bob Wilson6524dd32011-10-14 05:03:44 +00002767 if (!getToolChain().getTriple().isOSDarwin())
John McCall8517abc2010-02-19 02:45:38 +00002768 CmdArgs.push_back("-mconstructor-aliases");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00002769
John McCall7ef5cb32011-03-18 02:56:14 +00002770 // Darwin's kernel doesn't support guard variables; just die if we
2771 // try to use them.
Bob Wilson6524dd32011-10-14 05:03:44 +00002772 if (KernelOrKext && getToolChain().getTriple().isOSDarwin())
John McCall7ef5cb32011-03-18 02:56:14 +00002773 CmdArgs.push_back("-fforbid-guard-variables");
2774
Douglas Gregordbe39272011-02-01 15:15:22 +00002775 if (Args.hasArg(options::OPT_mms_bitfields)) {
2776 CmdArgs.push_back("-mms-bitfields");
2777 }
John McCall8517abc2010-02-19 02:45:38 +00002778
Daniel Dunbar306945d2009-09-16 06:17:29 +00002779 // This is a coarse approximation of what llvm-gcc actually does, both
2780 // -fasynchronous-unwind-tables and -fnon-call-exceptions interact in more
2781 // complicated ways.
2782 bool AsynchronousUnwindTables =
Evgeniy Stepanov7429c592014-02-14 08:56:25 +00002783 Args.hasFlag(options::OPT_fasynchronous_unwind_tables,
2784 options::OPT_fno_asynchronous_unwind_tables,
2785 (getToolChain().IsUnwindTablesDefault() ||
2786 getToolChain().getSanitizerArgs().needsUnwindTables()) &&
2787 !KernelOrKext);
Daniel Dunbar306945d2009-09-16 06:17:29 +00002788 if (Args.hasFlag(options::OPT_funwind_tables, options::OPT_fno_unwind_tables,
2789 AsynchronousUnwindTables))
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002790 CmdArgs.push_back("-munwind-tables");
2791
Chandler Carruth05fb5852012-11-21 23:40:23 +00002792 getToolChain().addClangTargetOptions(Args, CmdArgs);
Rafael Espindola66aa0452012-06-19 01:26:10 +00002793
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002794 if (Arg *A = Args.getLastArg(options::OPT_flimited_precision_EQ)) {
2795 CmdArgs.push_back("-mlimit-float-precision");
Richard Smithbd55daf2012-11-01 04:30:05 +00002796 CmdArgs.push_back(A->getValue());
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002797 }
Daniel Dunbar44e71222009-04-29 18:32:25 +00002798
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002799 // FIXME: Handle -mtune=.
2800 (void) Args.hasArg(options::OPT_mtune_EQ);
Daniel Dunbar44e71222009-04-29 18:32:25 +00002801
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002802 if (Arg *A = Args.getLastArg(options::OPT_mcmodel_EQ)) {
Daniel Dunbara1b02a22009-11-29 07:18:39 +00002803 CmdArgs.push_back("-mcode-model");
Richard Smithbd55daf2012-11-01 04:30:05 +00002804 CmdArgs.push_back(A->getValue());
Benjamin Kramercf4371a2009-08-05 14:30:52 +00002805 }
2806
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002807 // Add the target cpu
2808 std::string ETripleStr = getToolChain().ComputeEffectiveClangTriple(Args);
2809 llvm::Triple ETriple(ETripleStr);
2810 std::string CPU = getCPUName(Args, ETriple);
2811 if (!CPU.empty()) {
2812 CmdArgs.push_back("-target-cpu");
2813 CmdArgs.push_back(Args.MakeArgString(CPU));
2814 }
2815
Rafael Espindolaeb265472013-08-21 21:59:03 +00002816 if (const Arg *A = Args.getLastArg(options::OPT_mfpmath_EQ)) {
2817 CmdArgs.push_back("-mfpmath");
2818 CmdArgs.push_back(A->getValue());
2819 }
2820
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002821 // Add the target features
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00002822 getTargetFeatures(D, ETriple, Args, CmdArgs, false);
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00002823
Rafael Espindola22ce34a2013-08-20 22:12:08 +00002824 // Add target specific flags.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002825 switch(getToolChain().getArch()) {
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002826 default:
2827 break;
Daniel Dunbar4dbaaa62009-05-06 03:16:41 +00002828
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002829 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002830 case llvm::Triple::armeb:
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002831 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00002832 case llvm::Triple::thumbeb:
Daniel Dunbarc9388c12011-03-17 17:10:06 +00002833 AddARMTargetArgs(Args, CmdArgs, KernelOrKext);
Daniel Dunbar0f5c5422009-09-10 04:57:17 +00002834 break;
2835
Tim Northover573cbee2014-05-24 12:52:07 +00002836 case llvm::Triple::aarch64:
2837 case llvm::Triple::aarch64_be:
Tim Northovera2ee4332014-03-29 15:09:45 +00002838 case llvm::Triple::arm64:
James Molloy2b24fc42014-04-17 12:51:23 +00002839 case llvm::Triple::arm64_be:
Tim Northover573cbee2014-05-24 12:52:07 +00002840 AddAArch64TargetArgs(Args, CmdArgs);
Tim Northovera2ee4332014-03-29 15:09:45 +00002841 break;
2842
Eric Christopher0b26a612010-03-02 02:41:08 +00002843 case llvm::Triple::mips:
2844 case llvm::Triple::mipsel:
Akira Hatanaka94ab5542011-09-21 02:13:07 +00002845 case llvm::Triple::mips64:
2846 case llvm::Triple::mips64el:
Eric Christopher0b26a612010-03-02 02:41:08 +00002847 AddMIPSTargetArgs(Args, CmdArgs);
2848 break;
2849
Bruno Cardoso Lopese7f211c2010-11-09 17:21:19 +00002850 case llvm::Triple::sparc:
2851 AddSparcTargetArgs(Args, CmdArgs);
2852 break;
2853
Daniel Dunbar3b3191f2009-09-09 22:33:08 +00002854 case llvm::Triple::x86:
2855 case llvm::Triple::x86_64:
2856 AddX86TargetArgs(Args, CmdArgs);
2857 break;
Tony Linthicum76329bf2011-12-12 21:14:55 +00002858
2859 case llvm::Triple::hexagon:
2860 AddHexagonTargetArgs(Args, CmdArgs);
2861 break;
Daniel Dunbar44e71222009-04-29 18:32:25 +00002862 }
2863
Hans Wennborg75958c42013-08-08 00:17:41 +00002864 // Add clang-cl arguments.
2865 if (getToolChain().getDriver().IsCLMode())
2866 AddClangCLArgs(Args, CmdArgs);
2867
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002868 // Pass the linker version in use.
2869 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
2870 CmdArgs.push_back("-target-linker-version");
Richard Smithbd55daf2012-11-01 04:30:05 +00002871 CmdArgs.push_back(A->getValue());
Daniel Dunbar976a2f52010-08-11 23:07:47 +00002872 }
2873
Eric Christopherb7d97e92013-04-03 01:58:53 +00002874 if (!shouldUseLeafFramePointer(Args, getToolChain().getTriple()))
Daniel Dunbarbb7ac522010-07-01 01:31:45 +00002875 CmdArgs.push_back("-momit-leaf-frame-pointer");
2876
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002877 // Explicitly error on some things we know we don't support and can't just
2878 // ignore.
2879 types::ID InputType = Inputs[0].getType();
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002880 if (!Args.hasArg(options::OPT_fallow_unsupported)) {
2881 Arg *Unsupported;
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002882 if (types::isCXX(InputType) &&
Bob Wilson6524dd32011-10-14 05:03:44 +00002883 getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00002884 getToolChain().getArch() == llvm::Triple::x86) {
Bob Wilson0d45f582011-08-13 23:48:55 +00002885 if ((Unsupported = Args.getLastArg(options::OPT_fapple_kext)) ||
2886 (Unsupported = Args.getLastArg(options::OPT_mkernel)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00002887 D.Diag(diag::err_drv_clang_unsupported_opt_cxx_darwin_i386)
Daniel Dunbar4ed214a2010-09-24 19:39:37 +00002888 << Unsupported->getOption().getName();
2889 }
Daniel Dunbarfcc49a82010-05-12 18:19:58 +00002890 }
2891
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002892 Args.AddAllArgs(CmdArgs, options::OPT_v);
Daniel Dunbard4352752010-08-24 22:44:13 +00002893 Args.AddLastArg(CmdArgs, options::OPT_H);
Chad Rosierbe10f982011-08-02 17:58:04 +00002894 if (D.CCPrintHeaders && !D.CCGenDiagnostics) {
Daniel Dunbarac540b32011-02-02 21:11:35 +00002895 CmdArgs.push_back("-header-include-file");
2896 CmdArgs.push_back(D.CCPrintHeadersFilename ?
2897 D.CCPrintHeadersFilename : "-");
2898 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002899 Args.AddLastArg(CmdArgs, options::OPT_P);
Mike Stump11289f42009-09-09 15:08:12 +00002900 Args.AddLastArg(CmdArgs, options::OPT_print_ivar_layout);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002901
Chad Rosierbe10f982011-08-02 17:58:04 +00002902 if (D.CCLogDiagnostics && !D.CCGenDiagnostics) {
Daniel Dunbar529c03b2011-04-07 18:01:20 +00002903 CmdArgs.push_back("-diagnostic-log-file");
2904 CmdArgs.push_back(D.CCLogDiagnosticsFilename ?
2905 D.CCLogDiagnosticsFilename : "-");
2906 }
2907
Manman Ren17bdb0f2013-11-20 20:22:14 +00002908 // Use the last option from "-g" group. "-gline-tables-only" and "-gdwarf-x"
2909 // are preserved, all other debug options are substituted with "-g".
Rafael Espindola08a692a2010-03-07 04:46:18 +00002910 Args.ClaimAllArgs(options::OPT_g_Group);
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002911 if (Arg *A = Args.getLastArg(options::OPT_g_Group)) {
David Blaikief5961452014-03-25 20:42:27 +00002912 if (A->getOption().matches(options::OPT_gline_tables_only)) {
Manman Ren17bdb0f2013-11-20 20:22:14 +00002913 // FIXME: we should support specifying dwarf version with
2914 // -gline-tables-only.
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002915 CmdArgs.push_back("-gline-tables-only");
Brad Smith378e7f9b2014-06-13 03:35:37 +00002916 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
2917 const llvm::Triple &Triple = getToolChain().getTriple();
2918 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
2919 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00002920 CmdArgs.push_back("-gdwarf-2");
Manman Ren17bdb0f2013-11-20 20:22:14 +00002921 } else if (A->getOption().matches(options::OPT_gdwarf_2))
Manman Ren9691f7f2013-06-19 01:46:49 +00002922 CmdArgs.push_back("-gdwarf-2");
2923 else if (A->getOption().matches(options::OPT_gdwarf_3))
2924 CmdArgs.push_back("-gdwarf-3");
2925 else if (A->getOption().matches(options::OPT_gdwarf_4))
2926 CmdArgs.push_back("-gdwarf-4");
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002927 else if (!A->getOption().matches(options::OPT_g0) &&
Adrian Prantl549c5142014-02-17 17:40:52 +00002928 !A->getOption().matches(options::OPT_ggdb0)) {
Brad Smith378e7f9b2014-06-13 03:35:37 +00002929 // Default is dwarf-2 for Darwin, OpenBSD and FreeBSD.
2930 const llvm::Triple &Triple = getToolChain().getTriple();
2931 if (Triple.isOSDarwin() || Triple.getOS() == llvm::Triple::OpenBSD ||
2932 Triple.getOS() == llvm::Triple::FreeBSD)
Adrian Prantl549c5142014-02-17 17:40:52 +00002933 CmdArgs.push_back("-gdwarf-2");
2934 else
2935 CmdArgs.push_back("-g");
2936 }
Alexey Samsonovdda3a7f2012-05-29 08:10:34 +00002937 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00002938
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002939 // We ignore flags -gstrict-dwarf and -grecord-gcc-switches for now.
2940 Args.ClaimAllArgs(options::OPT_g_flags_Group);
Eric Christophera2f7eb72012-10-18 21:52:18 +00002941 if (Args.hasArg(options::OPT_gcolumn_info))
2942 CmdArgs.push_back("-dwarf-column-info");
Alexey Samsonovf50a9ff2012-06-21 08:22:39 +00002943
Eric Christopher138c32b2013-09-13 22:37:55 +00002944 // FIXME: Move backend command line options to the module.
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002945 // -gsplit-dwarf should turn on -g and enable the backend dwarf
2946 // splitting and extraction.
Eric Christopherd42fb732013-02-21 22:35:05 +00002947 // FIXME: Currently only works on Linux.
Cameron Esfahani556d91e2013-09-14 01:09:11 +00002948 if (getToolChain().getTriple().isOSLinux() &&
Eric Christopherd42fb732013-02-21 22:35:05 +00002949 Args.hasArg(options::OPT_gsplit_dwarf)) {
Eric Christopher2ba5fcb2013-02-05 07:29:57 +00002950 CmdArgs.push_back("-g");
2951 CmdArgs.push_back("-backend-option");
2952 CmdArgs.push_back("-split-dwarf=Enable");
2953 }
2954
Eric Christopher138c32b2013-09-13 22:37:55 +00002955 // -ggnu-pubnames turns on gnu style pubnames in the backend.
2956 if (Args.hasArg(options::OPT_ggnu_pubnames)) {
2957 CmdArgs.push_back("-backend-option");
2958 CmdArgs.push_back("-generate-gnu-dwarf-pub-sections");
2959 }
Eric Christophereec89c22013-06-18 00:03:50 +00002960
Eric Christopher0d403d22014-02-14 01:27:03 +00002961 // -gdwarf-aranges turns on the emission of the aranges section in the
2962 // backend.
2963 if (Args.hasArg(options::OPT_gdwarf_aranges)) {
2964 CmdArgs.push_back("-backend-option");
2965 CmdArgs.push_back("-generate-arange-section");
2966 }
2967
David Blaikief36d9ba2014-01-27 18:52:43 +00002968 if (Args.hasFlag(options::OPT_fdebug_types_section,
2969 options::OPT_fno_debug_types_section, false)) {
David Blaikied74be702014-01-18 02:02:06 +00002970 CmdArgs.push_back("-backend-option");
2971 CmdArgs.push_back("-generate-type-units");
2972 }
Eric Christophereec89c22013-06-18 00:03:50 +00002973
Evgeniy Stepanov9e7cb332014-02-03 11:11:37 +00002974 if (Args.hasFlag(options::OPT_ffunction_sections,
2975 options::OPT_fno_function_sections, false)) {
2976 CmdArgs.push_back("-ffunction-sections");
2977 }
2978
2979 if (Args.hasFlag(options::OPT_fdata_sections,
2980 options::OPT_fno_data_sections, false)) {
2981 CmdArgs.push_back("-fdata-sections");
2982 }
Rafael Espindola66bfb2752010-05-06 21:06:04 +00002983
Chris Lattner3c77a352010-06-22 00:03:40 +00002984 Args.AddAllArgs(CmdArgs, options::OPT_finstrument_functions);
2985
Justin Bogner6a9d2cf2014-01-06 22:27:36 +00002986 if (Args.hasArg(options::OPT_fprofile_instr_generate) &&
2987 (Args.hasArg(options::OPT_fprofile_instr_use) ||
2988 Args.hasArg(options::OPT_fprofile_instr_use_EQ)))
2989 D.Diag(diag::err_drv_argument_not_allowed_with)
2990 << "-fprofile-instr-generate" << "-fprofile-instr-use";
2991
2992 Args.AddAllArgs(CmdArgs, options::OPT_fprofile_instr_generate);
2993
2994 if (Arg *A = Args.getLastArg(options::OPT_fprofile_instr_use_EQ))
2995 A->render(Args, CmdArgs);
2996 else if (Args.hasArg(options::OPT_fprofile_instr_use))
2997 CmdArgs.push_back("-fprofile-instr-use=pgo-data");
2998
Nick Lewycky207bce32011-04-21 23:44:07 +00002999 if (Args.hasArg(options::OPT_ftest_coverage) ||
3000 Args.hasArg(options::OPT_coverage))
3001 CmdArgs.push_back("-femit-coverage-notes");
3002 if (Args.hasArg(options::OPT_fprofile_arcs) ||
3003 Args.hasArg(options::OPT_coverage))
3004 CmdArgs.push_back("-femit-coverage-data");
3005
Nick Lewycky480cb992011-05-04 20:46:58 +00003006 if (C.getArgs().hasArg(options::OPT_c) ||
3007 C.getArgs().hasArg(options::OPT_S)) {
3008 if (Output.isFilename()) {
Nick Lewycky85c011d2011-05-05 00:08:20 +00003009 CmdArgs.push_back("-coverage-file");
Eric Christophere30f61c2013-02-22 00:24:40 +00003010 SmallString<128> CoverageFilename(Output.getFilename());
Nick Lewycky737a4522013-03-07 08:28:53 +00003011 if (llvm::sys::path::is_relative(CoverageFilename.str())) {
Rafael Espindolac7367ff2013-08-10 01:40:10 +00003012 SmallString<128> Pwd;
3013 if (!llvm::sys::fs::current_path(Pwd)) {
3014 llvm::sys::path::append(Pwd, CoverageFilename.str());
3015 CoverageFilename.swap(Pwd);
Nick Lewycky737a4522013-03-07 08:28:53 +00003016 }
3017 }
Eric Christophere30f61c2013-02-22 00:24:40 +00003018 CmdArgs.push_back(Args.MakeArgString(CoverageFilename));
Nick Lewycky480cb992011-05-04 20:46:58 +00003019 }
3020 }
3021
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003022 // Pass options for controlling the default header search paths.
3023 if (Args.hasArg(options::OPT_nostdinc)) {
3024 CmdArgs.push_back("-nostdsysteminc");
3025 CmdArgs.push_back("-nobuiltininc");
3026 } else {
Daniel Dunbar0f41eee2011-10-11 18:20:16 +00003027 if (Args.hasArg(options::OPT_nostdlibinc))
3028 CmdArgs.push_back("-nostdsysteminc");
Daniel Dunbarb25bfde2011-10-11 18:20:10 +00003029 Args.AddLastArg(CmdArgs, options::OPT_nostdincxx);
3030 Args.AddLastArg(CmdArgs, options::OPT_nobuiltininc);
3031 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003032
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003033 // Pass the path to compiler resource files.
Daniel Dunbar34e0b8c2009-12-15 01:02:52 +00003034 CmdArgs.push_back("-resource-dir");
Daniel Dunbar3f3e2cd2010-01-20 02:35:16 +00003035 CmdArgs.push_back(D.ResourceDir.c_str());
Daniel Dunbar9dc82a22009-04-07 21:42:00 +00003036
Argyrios Kyrtzidis71731d62010-11-03 22:45:23 +00003037 Args.AddLastArg(CmdArgs, options::OPT_working_directory);
3038
Ted Kremenekf7639e12012-03-06 20:06:33 +00003039 bool ARCMTEnabled = false;
Argyrios Kyrtzidis85230d52013-09-17 19:14:29 +00003040 if (!Args.hasArg(options::OPT_fno_objc_arc, options::OPT_fobjc_arc)) {
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003041 if (const Arg *A = Args.getLastArg(options::OPT_ccc_arcmt_check,
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003042 options::OPT_ccc_arcmt_modify,
3043 options::OPT_ccc_arcmt_migrate)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003044 ARCMTEnabled = true;
John McCalld70fb982011-06-15 23:25:17 +00003045 switch (A->getOption().getID()) {
3046 default:
3047 llvm_unreachable("missed a case");
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003048 case options::OPT_ccc_arcmt_check:
John McCalld70fb982011-06-15 23:25:17 +00003049 CmdArgs.push_back("-arcmt-check");
3050 break;
Argyrios Kyrtzidisc44b93d2011-07-07 04:00:39 +00003051 case options::OPT_ccc_arcmt_modify:
John McCalld70fb982011-06-15 23:25:17 +00003052 CmdArgs.push_back("-arcmt-modify");
3053 break;
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003054 case options::OPT_ccc_arcmt_migrate:
3055 CmdArgs.push_back("-arcmt-migrate");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003056 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003057 CmdArgs.push_back(A->getValue());
Argyrios Kyrtzidisd5713632011-07-19 17:20:03 +00003058
3059 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_report_output);
3060 Args.AddLastArg(CmdArgs, options::OPT_arcmt_migrate_emit_arc_errors);
Argyrios Kyrtzidis7fbd97f2011-07-09 20:00:58 +00003061 break;
John McCalld70fb982011-06-15 23:25:17 +00003062 }
3063 }
Argyrios Kyrtzidisb11a1922013-06-24 19:01:18 +00003064 } else {
3065 Args.ClaimAllArgs(options::OPT_ccc_arcmt_check);
3066 Args.ClaimAllArgs(options::OPT_ccc_arcmt_modify);
3067 Args.ClaimAllArgs(options::OPT_ccc_arcmt_migrate);
John McCalld70fb982011-06-15 23:25:17 +00003068 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003069
Ted Kremenekf7639e12012-03-06 20:06:33 +00003070 if (const Arg *A = Args.getLastArg(options::OPT_ccc_objcmt_migrate)) {
3071 if (ARCMTEnabled) {
3072 D.Diag(diag::err_drv_argument_not_allowed_with)
3073 << A->getAsString(Args) << "-ccc-arcmt-migrate";
3074 }
3075 CmdArgs.push_back("-mt-migrate-directory");
Richard Smithbd55daf2012-11-01 04:30:05 +00003076 CmdArgs.push_back(A->getValue());
Ted Kremenekf7639e12012-03-06 20:06:33 +00003077
3078 if (!Args.hasArg(options::OPT_objcmt_migrate_literals,
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003079 options::OPT_objcmt_migrate_subscripting,
3080 options::OPT_objcmt_migrate_property)) {
Ted Kremenekf7639e12012-03-06 20:06:33 +00003081 // None specified, means enable them all.
3082 CmdArgs.push_back("-objcmt-migrate-literals");
3083 CmdArgs.push_back("-objcmt-migrate-subscripting");
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003084 CmdArgs.push_back("-objcmt-migrate-property");
Ted Kremenekf7639e12012-03-06 20:06:33 +00003085 } else {
3086 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3087 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
Fariborz Jahaniand83ef842013-07-09 16:59:14 +00003088 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003089 }
Argyrios Kyrtzidis55ecf992013-11-13 23:38:20 +00003090 } else {
3091 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_literals);
3092 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_subscripting);
3093 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_property);
3094 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_all);
3095 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readonly_property);
3096 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_readwrite_property);
3097 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_annotation);
3098 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_instancetype);
3099 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_nsmacros);
3100 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_protocol_conformance);
3101 Args.AddLastArg(CmdArgs, options::OPT_objcmt_atomic_property);
3102 Args.AddLastArg(CmdArgs, options::OPT_objcmt_returns_innerpointer_property);
3103 Args.AddLastArg(CmdArgs, options::OPT_objcmt_ns_nonatomic_iosonly);
Argyrios Kyrtzidis74aa02562013-12-11 01:29:48 +00003104 Args.AddLastArg(CmdArgs, options::OPT_objcmt_migrate_designated_init);
Argyrios Kyrtzidisd5ba86b2013-12-10 18:36:53 +00003105 Args.AddLastArg(CmdArgs, options::OPT_objcmt_whitelist_dir_path);
Ted Kremenekf7639e12012-03-06 20:06:33 +00003106 }
3107
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003108 // Add preprocessing options like -I, -D, etc. if we are using the
3109 // preprocessor.
3110 //
3111 // FIXME: Support -fpreprocessed
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003112 if (types::getPreprocessedType(InputType) != types::TY_INVALID)
Chad Rosier633dcdc2013-01-24 19:14:47 +00003113 AddPreprocessingOptions(C, JA, D, Args, CmdArgs, Output, Inputs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003114
Rafael Espindolaa7431922011-07-21 23:40:37 +00003115 // Don't warn about "clang -c -DPIC -fPIC test.i" because libtool.m4 assumes
3116 // that "The compiler can only warn and ignore the option if not recognized".
3117 // When building with ccache, it will pass -D options to clang even on
3118 // preprocessed inputs and configure concludes that -fPIC is not supported.
3119 Args.ClaimAllArgs(options::OPT_D);
3120
Alp Toker7874bdc2013-11-15 20:40:58 +00003121 // Manually translate -O4 to -O3; let clang reject others.
Rafael Espindolaad70d962013-08-27 16:58:15 +00003122 if (Arg *A = Args.getLastArg(options::OPT_O_Group)) {
3123 if (A->getOption().matches(options::OPT_O4)) {
3124 CmdArgs.push_back("-O3");
3125 D.Diag(diag::warn_O4_is_O3);
3126 } else {
3127 A->render(Args, CmdArgs);
3128 }
3129 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003130
Chad Rosier86b82082012-12-12 20:06:31 +00003131 // Don't warn about unused -flto. This can happen when we're preprocessing or
3132 // precompiling.
3133 Args.ClaimAllArgs(options::OPT_flto);
3134
Daniel Dunbar945577c2009-10-29 02:24:45 +00003135 Args.AddAllArgs(CmdArgs, options::OPT_W_Group);
Ted Kremenekb22ea2a2012-07-07 05:53:30 +00003136 if (Args.hasFlag(options::OPT_pedantic, options::OPT_no_pedantic, false))
3137 CmdArgs.push_back("-pedantic");
Daniel Dunbar945577c2009-10-29 02:24:45 +00003138 Args.AddLastArg(CmdArgs, options::OPT_pedantic_errors);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003139 Args.AddLastArg(CmdArgs, options::OPT_w);
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003140
3141 // Handle -{std, ansi, trigraphs} -- take the last of -{std, ansi}
Hans Wennborgec993822013-07-31 16:57:56 +00003142 // (-ansi is equivalent to -std=c89 or -std=c++98).
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003143 //
3144 // If a std is supplied, only add -trigraphs if it follows the
3145 // option.
3146 if (Arg *Std = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi)) {
3147 if (Std->getOption().matches(options::OPT_ansi))
Nuno Lopes275225d2009-10-16 14:28:06 +00003148 if (types::isCXX(InputType))
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003149 CmdArgs.push_back("-std=c++98");
Nuno Lopes275225d2009-10-16 14:28:06 +00003150 else
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003151 CmdArgs.push_back("-std=c89");
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003152 else
3153 Std->render(Args, CmdArgs);
3154
Daniel Dunbar3f1a1ff2010-06-14 21:23:08 +00003155 if (Arg *A = Args.getLastArg(options::OPT_std_EQ, options::OPT_ansi,
3156 options::OPT_trigraphs))
3157 if (A != Std)
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003158 A->render(Args, CmdArgs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003159 } else {
3160 // Honor -std-default.
Daniel Dunbar12998192010-01-29 21:03:02 +00003161 //
3162 // FIXME: Clang doesn't correctly handle -std= when the input language
3163 // doesn't match. For the time being just ignore this for C++ inputs;
3164 // eventually we want to do all the standard defaulting here instead of
3165 // splitting it between the driver and clang -cc1.
3166 if (!types::isCXX(InputType))
Nico Weber723b4f02012-08-30 02:08:31 +00003167 Args.AddAllArgsTranslated(CmdArgs, options::OPT_std_default_EQ,
3168 "-std=", /*Joined=*/true);
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003169 else if (IsWindowsMSVC)
Nico Weber723b4f02012-08-30 02:08:31 +00003170 CmdArgs.push_back("-std=c++11");
3171
Daniel Dunbarc44b4cc2009-04-07 22:13:21 +00003172 Args.AddLastArg(CmdArgs, options::OPT_trigraphs);
Daniel Dunbar72a60902009-04-26 01:10:38 +00003173 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003174
Richard Smith282b4492013-09-04 22:50:31 +00003175 // GCC's behavior for -Wwrite-strings is a bit strange:
3176 // * In C, this "warning flag" changes the types of string literals from
3177 // 'char[N]' to 'const char[N]', and thus triggers an unrelated warning
3178 // for the discarded qualifier.
3179 // * In C++, this is just a normal warning flag.
3180 //
3181 // Implementing this warning correctly in C is hard, so we follow GCC's
3182 // behavior for now. FIXME: Directly diagnose uses of a string literal as
3183 // a non-const char* in C, rather than using this crude hack.
3184 if (!types::isCXX(InputType)) {
Argyrios Kyrtzidis25f2afde2014-02-07 08:33:28 +00003185 // FIXME: This should behave just like a warning flag, and thus should also
3186 // respect -Weverything, -Wno-everything, -Werror=write-strings, and so on.
3187 Arg *WriteStrings =
3188 Args.getLastArg(options::OPT_Wwrite_strings,
3189 options::OPT_Wno_write_strings, options::OPT_w);
3190 if (WriteStrings &&
3191 WriteStrings->getOption().matches(options::OPT_Wwrite_strings))
Richard Smith282b4492013-09-04 22:50:31 +00003192 CmdArgs.push_back("-fconst-strings");
Chandler Carruthb009b142011-04-23 06:30:43 +00003193 }
3194
Chandler Carruth61fbf622011-04-23 09:27:53 +00003195 // GCC provides a macro definition '__DEPRECATED' when -Wdeprecated is active
Chandler Carruth30483fb2011-04-23 19:48:40 +00003196 // during C++ compilation, which it is by default. GCC keeps this define even
3197 // in the presence of '-w', match this behavior bug-for-bug.
3198 if (types::isCXX(InputType) &&
3199 Args.hasFlag(options::OPT_Wdeprecated, options::OPT_Wno_deprecated,
3200 true)) {
3201 CmdArgs.push_back("-fdeprecated-macro");
Chandler Carruth61fbf622011-04-23 09:27:53 +00003202 }
3203
Chandler Carruthe0391482010-05-22 02:21:53 +00003204 // Translate GCC's misnamer '-fasm' arguments to '-fgnu-keywords'.
3205 if (Arg *Asm = Args.getLastArg(options::OPT_fasm, options::OPT_fno_asm)) {
3206 if (Asm->getOption().matches(options::OPT_fasm))
3207 CmdArgs.push_back("-fgnu-keywords");
3208 else
3209 CmdArgs.push_back("-fno-gnu-keywords");
3210 }
3211
Nick Lewycky1d617ac2011-10-17 23:05:52 +00003212 if (ShouldDisableDwarfDirectory(Args, getToolChain()))
3213 CmdArgs.push_back("-fno-dwarf-directory-asm");
3214
Daniel Dunbare246fbe2013-04-16 18:21:19 +00003215 if (ShouldDisableAutolink(Args, getToolChain()))
3216 CmdArgs.push_back("-fno-autolink");
3217
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00003218 // Add in -fdebug-compilation-dir if necessary.
3219 addDebugCompDirArg(Args, CmdArgs);
Nick Lewyckyba743b72011-10-21 02:32:14 +00003220
Richard Smith9a568822011-11-21 19:36:32 +00003221 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_depth_,
3222 options::OPT_ftemplate_depth_EQ)) {
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003223 CmdArgs.push_back("-ftemplate-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003224 CmdArgs.push_back(A->getValue());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003225 }
3226
Richard Smith79c927b2013-11-06 19:31:51 +00003227 if (Arg *A = Args.getLastArg(options::OPT_foperator_arrow_depth_EQ)) {
3228 CmdArgs.push_back("-foperator-arrow-depth");
3229 CmdArgs.push_back(A->getValue());
3230 }
3231
Richard Smith9a568822011-11-21 19:36:32 +00003232 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_depth_EQ)) {
3233 CmdArgs.push_back("-fconstexpr-depth");
Richard Smithbd55daf2012-11-01 04:30:05 +00003234 CmdArgs.push_back(A->getValue());
Richard Smith9a568822011-11-21 19:36:32 +00003235 }
3236
Richard Smitha3d3bd22013-05-08 02:12:03 +00003237 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_steps_EQ)) {
3238 CmdArgs.push_back("-fconstexpr-steps");
3239 CmdArgs.push_back(A->getValue());
3240 }
3241
Richard Smithb3a14522013-02-22 01:59:51 +00003242 if (Arg *A = Args.getLastArg(options::OPT_fbracket_depth_EQ)) {
3243 CmdArgs.push_back("-fbracket-depth");
3244 CmdArgs.push_back(A->getValue());
3245 }
3246
Argyrios Kyrtzidisef6c8da2010-11-18 00:20:36 +00003247 if (Arg *A = Args.getLastArg(options::OPT_Wlarge_by_value_copy_EQ,
3248 options::OPT_Wlarge_by_value_copy_def)) {
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003249 if (A->getNumValues()) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003250 StringRef bytes = A->getValue();
Jean-Daniel Dupas73d801c2012-05-04 08:08:37 +00003251 CmdArgs.push_back(Args.MakeArgString("-Wlarge-by-value-copy=" + bytes));
3252 } else
3253 CmdArgs.push_back("-Wlarge-by-value-copy=64"); // default value
Argyrios Kyrtzidisaf84ec02010-11-17 23:11:54 +00003254 }
3255
Nuno Lopes3d6311d2012-05-08 22:10:46 +00003256
Michael J. Spencer929fccd2012-10-22 22:13:48 +00003257 if (Args.hasArg(options::OPT_relocatable_pch))
Daniel Dunbar8bed86c2009-11-20 22:21:36 +00003258 CmdArgs.push_back("-relocatable-pch");
Mike Stump11289f42009-09-09 15:08:12 +00003259
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003260 if (Arg *A = Args.getLastArg(options::OPT_fconstant_string_class_EQ)) {
3261 CmdArgs.push_back("-fconstant-string-class");
Richard Smithbd55daf2012-11-01 04:30:05 +00003262 CmdArgs.push_back(A->getValue());
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00003263 }
David Chisnall5778fce2009-08-31 16:41:57 +00003264
Chris Lattnere23003d2010-01-09 21:54:33 +00003265 if (Arg *A = Args.getLastArg(options::OPT_ftabstop_EQ)) {
3266 CmdArgs.push_back("-ftabstop");
Richard Smithbd55daf2012-11-01 04:30:05 +00003267 CmdArgs.push_back(A->getValue());
Chris Lattnere23003d2010-01-09 21:54:33 +00003268 }
3269
Chris Lattnerb35583d2010-04-07 20:49:23 +00003270 CmdArgs.push_back("-ferror-limit");
3271 if (Arg *A = Args.getLastArg(options::OPT_ferror_limit_EQ))
Richard Smithbd55daf2012-11-01 04:30:05 +00003272 CmdArgs.push_back(A->getValue());
Chris Lattnerb35583d2010-04-07 20:49:23 +00003273 else
3274 CmdArgs.push_back("19");
Douglas Gregorffed1cb2010-04-20 07:18:24 +00003275
Chandler Carrutha77a7272010-05-06 04:55:18 +00003276 if (Arg *A = Args.getLastArg(options::OPT_fmacro_backtrace_limit_EQ)) {
3277 CmdArgs.push_back("-fmacro-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003278 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003279 }
3280
3281 if (Arg *A = Args.getLastArg(options::OPT_ftemplate_backtrace_limit_EQ)) {
3282 CmdArgs.push_back("-ftemplate-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003283 CmdArgs.push_back(A->getValue());
Chandler Carrutha77a7272010-05-06 04:55:18 +00003284 }
3285
Richard Smithf6f003a2011-12-16 19:06:07 +00003286 if (Arg *A = Args.getLastArg(options::OPT_fconstexpr_backtrace_limit_EQ)) {
3287 CmdArgs.push_back("-fconstexpr-backtrace-limit");
Richard Smithbd55daf2012-11-01 04:30:05 +00003288 CmdArgs.push_back(A->getValue());
Richard Smithf6f003a2011-12-16 19:06:07 +00003289 }
3290
Daniel Dunbar2c978472009-11-04 06:24:47 +00003291 // Pass -fmessage-length=.
Daniel Dunbar84bb7932009-11-30 08:40:54 +00003292 CmdArgs.push_back("-fmessage-length");
Daniel Dunbar2c978472009-11-04 06:24:47 +00003293 if (Arg *A = Args.getLastArg(options::OPT_fmessage_length_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003294 CmdArgs.push_back(A->getValue());
Daniel Dunbar2c978472009-11-04 06:24:47 +00003295 } else {
3296 // If -fmessage-length=N was not specified, determine whether this is a
3297 // terminal and, if so, implicitly define -fmessage-length appropriately.
3298 unsigned N = llvm::sys::Process::StandardErrColumns();
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003299 CmdArgs.push_back(Args.MakeArgString(Twine(N)));
Daniel Dunbar2c978472009-11-04 06:24:47 +00003300 }
3301
John McCallb4a99d32013-02-19 01:57:35 +00003302 // -fvisibility= and -fvisibility-ms-compat are of a piece.
3303 if (const Arg *A = Args.getLastArg(options::OPT_fvisibility_EQ,
3304 options::OPT_fvisibility_ms_compat)) {
3305 if (A->getOption().matches(options::OPT_fvisibility_EQ)) {
3306 CmdArgs.push_back("-fvisibility");
3307 CmdArgs.push_back(A->getValue());
3308 } else {
3309 assert(A->getOption().matches(options::OPT_fvisibility_ms_compat));
3310 CmdArgs.push_back("-fvisibility");
3311 CmdArgs.push_back("hidden");
3312 CmdArgs.push_back("-ftype-visibility");
3313 CmdArgs.push_back("default");
3314 }
Daniel Dunbare357d562009-12-03 18:42:11 +00003315 }
3316
Douglas Gregor08329632010-06-15 17:05:35 +00003317 Args.AddLastArg(CmdArgs, options::OPT_fvisibility_inlines_hidden);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003318
Hans Wennborgf60f6af2012-06-28 08:01:44 +00003319 Args.AddLastArg(CmdArgs, options::OPT_ftlsmodel_EQ);
3320
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003321 // -fhosted is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003322 if (Args.hasFlag(options::OPT_ffreestanding, options::OPT_fhosted, false) ||
3323 KernelOrKext)
Daniel Dunbare46b52a2010-03-20 04:52:14 +00003324 CmdArgs.push_back("-ffreestanding");
3325
Daniel Dunbare357d562009-12-03 18:42:11 +00003326 // Forward -f (flag) options which we can pass directly.
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003327 Args.AddLastArg(CmdArgs, options::OPT_femit_all_decls);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003328 Args.AddLastArg(CmdArgs, options::OPT_fheinous_gnu_extensions);
Adrian Prantla7634472014-01-07 01:19:08 +00003329 Args.AddLastArg(CmdArgs, options::OPT_fstandalone_debug);
3330 Args.AddLastArg(CmdArgs, options::OPT_fno_standalone_debug);
Eric Christopher86050822011-10-25 07:13:06 +00003331 Args.AddLastArg(CmdArgs, options::OPT_fno_operator_names);
Bill Schmidtb3b804e2013-07-03 15:36:02 +00003332 // AltiVec language extensions aren't relevant for assembling.
3333 if (!isa<PreprocessJobAction>(JA) ||
3334 Output.getType() != types::TY_PP_Asm)
3335 Args.AddLastArg(CmdArgs, options::OPT_faltivec);
Richard Trieu91844232012-06-26 18:18:47 +00003336 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_show_template_tree);
3337 Args.AddLastArg(CmdArgs, options::OPT_fno_elide_type);
Chad Rosier864dfe12012-03-13 23:45:51 +00003338
Peter Collingbourne32701642013-11-01 18:16:25 +00003339 const SanitizerArgs &Sanitize = getToolChain().getSanitizerArgs();
3340 Sanitize.addArgs(Args, CmdArgs);
Richard Smith52be6192012-11-05 22:04:41 +00003341
Will Dietz3676d562012-12-30 20:53:28 +00003342 if (!Args.hasFlag(options::OPT_fsanitize_recover,
3343 options::OPT_fno_sanitize_recover,
3344 true))
3345 CmdArgs.push_back("-fno-sanitize-recover");
3346
Alexey Samsonovcb3f8122014-03-20 10:48:29 +00003347 if (Args.hasFlag(options::OPT_fsanitize_undefined_trap_on_error,
Chad Rosierae229d52013-01-29 23:31:22 +00003348 options::OPT_fno_sanitize_undefined_trap_on_error, false))
3349 CmdArgs.push_back("-fsanitize-undefined-trap-on-error");
3350
Eric Christopher459d2712013-02-19 06:16:53 +00003351 // Report an error for -faltivec on anything other than PowerPC.
Chad Rosier864dfe12012-03-13 23:45:51 +00003352 if (const Arg *A = Args.getLastArg(options::OPT_faltivec))
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003353 if (!(getToolChain().getArch() == llvm::Triple::ppc ||
Bill Schmidt778d3872013-07-26 01:36:11 +00003354 getToolChain().getArch() == llvm::Triple::ppc64 ||
3355 getToolChain().getArch() == llvm::Triple::ppc64le))
Chad Rosier864dfe12012-03-13 23:45:51 +00003356 D.Diag(diag::err_drv_argument_only_allowed_with)
Bill Schmidt778d3872013-07-26 01:36:11 +00003357 << A->getAsString(Args) << "ppc/ppc64/ppc64le";
Chad Rosier864dfe12012-03-13 23:45:51 +00003358
Daniel Dunbar733b0f82011-03-01 18:49:30 +00003359 if (getToolChain().SupportsProfiling())
3360 Args.AddLastArg(CmdArgs, options::OPT_pg);
Daniel Dunbar35621a92010-03-16 16:57:46 +00003361
3362 // -flax-vector-conversions is default.
3363 if (!Args.hasFlag(options::OPT_flax_vector_conversions,
3364 options::OPT_fno_lax_vector_conversions))
3365 CmdArgs.push_back("-fno-lax-vector-conversions");
3366
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003367 if (Args.getLastArg(options::OPT_fapple_kext))
3368 CmdArgs.push_back("-fapple-kext");
3369
Fariborz Jahaniana4404f22009-05-22 20:17:16 +00003370 Args.AddLastArg(CmdArgs, options::OPT_fobjc_sender_dependent_dispatch);
Chris Lattner69686412009-04-21 05:34:31 +00003371 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_print_source_range_info);
Douglas Gregoreec975c2010-08-19 20:24:43 +00003372 Args.AddLastArg(CmdArgs, options::OPT_fdiagnostics_parseable_fixits);
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003373 Args.AddLastArg(CmdArgs, options::OPT_ftime_report);
3374 Args.AddLastArg(CmdArgs, options::OPT_ftrapv);
David Chisnalldd84ef12010-09-17 18:29:54 +00003375
3376 if (Arg *A = Args.getLastArg(options::OPT_ftrapv_handler_EQ)) {
3377 CmdArgs.push_back("-ftrapv-handler");
Richard Smithbd55daf2012-11-01 04:30:05 +00003378 CmdArgs.push_back(A->getValue());
David Chisnalldd84ef12010-09-17 18:29:54 +00003379 }
3380
Bob Wilson14adb362012-02-03 06:27:22 +00003381 Args.AddLastArg(CmdArgs, options::OPT_ftrap_function_EQ);
Evan Cheng04c94292011-04-08 21:37:45 +00003382
Chandler Carruth6e501032011-03-27 00:04:55 +00003383 // -fno-strict-overflow implies -fwrapv if it isn't disabled, but
3384 // -fstrict-overflow won't turn off an explicitly enabled -fwrapv.
3385 if (Arg *A = Args.getLastArg(options::OPT_fwrapv,
3386 options::OPT_fno_wrapv)) {
3387 if (A->getOption().matches(options::OPT_fwrapv))
3388 CmdArgs.push_back("-fwrapv");
3389 } else if (Arg *A = Args.getLastArg(options::OPT_fstrict_overflow,
3390 options::OPT_fno_strict_overflow)) {
3391 if (A->getOption().matches(options::OPT_fno_strict_overflow))
3392 CmdArgs.push_back("-fwrapv");
3393 }
Hal Finkelce0697f2013-11-17 16:03:29 +00003394
3395 if (Arg *A = Args.getLastArg(options::OPT_freroll_loops,
3396 options::OPT_fno_reroll_loops))
3397 if (A->getOption().matches(options::OPT_freroll_loops))
3398 CmdArgs.push_back("-freroll-loops");
3399
Daniel Dunbar3a148f22009-04-07 21:51:40 +00003400 Args.AddLastArg(CmdArgs, options::OPT_fwritable_strings);
Chandler Carruth54c29102013-08-08 08:34:35 +00003401 Args.AddLastArg(CmdArgs, options::OPT_funroll_loops,
3402 options::OPT_fno_unroll_loops);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00003403
Daniel Dunbara77eaeb2009-09-03 04:54:28 +00003404 Args.AddLastArg(CmdArgs, options::OPT_pthread);
3405
Mahesha S6a682be42012-10-27 07:47:56 +00003406
Daniel Dunbar4930e332009-11-17 08:07:36 +00003407 // -stack-protector=0 is default.
3408 unsigned StackProtectorLevel = 0;
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003409 if (Arg *A = Args.getLastArg(options::OPT_fno_stack_protector,
3410 options::OPT_fstack_protector_all,
Josh Mageee0fc1a82014-02-11 01:35:14 +00003411 options::OPT_fstack_protector_strong,
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003412 options::OPT_fstack_protector)) {
Rafael Espindolace5c6092014-05-22 22:57:39 +00003413 if (A->getOption().matches(options::OPT_fstack_protector)) {
3414 StackProtectorLevel = std::max<unsigned>(LangOptions::SSPOn,
3415 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext));
3416 } else if (A->getOption().matches(options::OPT_fstack_protector_strong))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003417 StackProtectorLevel = LangOptions::SSPStrong;
Daniel Dunbar4930e332009-11-17 08:07:36 +00003418 else if (A->getOption().matches(options::OPT_fstack_protector_all))
Josh Mageee0fc1a82014-02-11 01:35:14 +00003419 StackProtectorLevel = LangOptions::SSPReq;
Nico Weberdd473632011-08-23 07:38:27 +00003420 } else {
3421 StackProtectorLevel =
3422 getToolChain().GetDefaultStackProtectorLevel(KernelOrKext);
3423 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003424 if (StackProtectorLevel) {
3425 CmdArgs.push_back("-stack-protector");
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003426 CmdArgs.push_back(Args.MakeArgString(Twine(StackProtectorLevel)));
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003427 }
Chad Rosierdb3da832012-08-21 16:16:06 +00003428
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003429 // --param ssp-buffer-size=
3430 for (arg_iterator it = Args.filtered_begin(options::OPT__param),
3431 ie = Args.filtered_end(); it != ie; ++it) {
Richard Smithbd55daf2012-11-01 04:30:05 +00003432 StringRef Str((*it)->getValue());
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003433 if (Str.startswith("ssp-buffer-size=")) {
3434 if (StackProtectorLevel) {
Chad Rosierdb3da832012-08-21 16:16:06 +00003435 CmdArgs.push_back("-stack-protector-buffer-size");
3436 // FIXME: Verify the argument is a valid integer.
3437 CmdArgs.push_back(Args.MakeArgString(Str.drop_front(16)));
Chad Rosierdb3da832012-08-21 16:16:06 +00003438 }
Joerg Sonnenberger85e2bbc2012-09-12 13:51:14 +00003439 (*it)->claim();
Chad Rosierdb3da832012-08-21 16:16:06 +00003440 }
Bill Wendlingd63bbad2009-06-28 07:36:13 +00003441 }
3442
Nick Lewyckyf4d3f7a2011-12-06 03:33:03 +00003443 // Translate -mstackrealign
3444 if (Args.hasFlag(options::OPT_mstackrealign, options::OPT_mno_stackrealign,
3445 false)) {
3446 CmdArgs.push_back("-backend-option");
3447 CmdArgs.push_back("-force-align-stack");
3448 }
3449 if (!Args.hasFlag(options::OPT_mno_stackrealign, options::OPT_mstackrealign,
3450 false)) {
3451 CmdArgs.push_back(Args.MakeArgString("-mstackrealign"));
3452 }
3453
Joerg Sonnenbergerdb66ed02011-12-05 23:05:23 +00003454 if (Args.hasArg(options::OPT_mstack_alignment)) {
3455 StringRef alignment = Args.getLastArgValue(options::OPT_mstack_alignment);
3456 CmdArgs.push_back(Args.MakeArgString("-mstack-alignment=" + alignment));
Eric Christopherd5c45f62011-05-02 21:18:22 +00003457 }
Chad Rosier9ae53f82012-11-29 00:42:06 +00003458 // -mkernel implies -mstrict-align; don't add the redundant option.
Renato Golina146a482013-08-24 14:44:41 +00003459 if (!KernelOrKext) {
Renato Golin8d5f3142013-08-28 23:56:07 +00003460 if (Arg *A = Args.getLastArg(options::OPT_mno_unaligned_access,
3461 options::OPT_munaligned_access)) {
3462 if (A->getOption().matches(options::OPT_mno_unaligned_access)) {
3463 CmdArgs.push_back("-backend-option");
Tim Northover573cbee2014-05-24 12:52:07 +00003464 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3465 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be ||
3466 getToolChain().getTriple().getArch() == llvm::Triple::arm64 ||
Kevin Qine5cee2602014-05-06 09:51:32 +00003467 getToolChain().getTriple().getArch() == llvm::Triple::arm64_be)
Tim Northover573cbee2014-05-24 12:52:07 +00003468 CmdArgs.push_back("-aarch64-strict-align");
Kevin Qine5cee2602014-05-06 09:51:32 +00003469 else
3470 CmdArgs.push_back("-arm-strict-align");
Renato Golin8d5f3142013-08-28 23:56:07 +00003471 } else {
3472 CmdArgs.push_back("-backend-option");
Tim Northover573cbee2014-05-24 12:52:07 +00003473 if (getToolChain().getTriple().getArch() == llvm::Triple::aarch64 ||
3474 getToolChain().getTriple().getArch() == llvm::Triple::aarch64_be ||
3475 getToolChain().getTriple().getArch() == llvm::Triple::arm64 ||
Kevin Qine5cee2602014-05-06 09:51:32 +00003476 getToolChain().getTriple().getArch() == llvm::Triple::arm64_be)
Tim Northover573cbee2014-05-24 12:52:07 +00003477 CmdArgs.push_back("-aarch64-no-strict-align");
Kevin Qine5cee2602014-05-06 09:51:32 +00003478 else
3479 CmdArgs.push_back("-arm-no-strict-align");
Renato Golin8d5f3142013-08-28 23:56:07 +00003480 }
Renato Golina146a482013-08-24 14:44:41 +00003481 }
Chad Rosier60027022012-11-09 17:29:19 +00003482 }
Eric Christopher84fbdb42011-08-19 00:30:14 +00003483
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003484 if (Arg *A = Args.getLastArg(options::OPT_mrestrict_it,
3485 options::OPT_mno_restrict_it)) {
3486 if (A->getOption().matches(options::OPT_mrestrict_it)) {
3487 CmdArgs.push_back("-backend-option");
3488 CmdArgs.push_back("-arm-restrict-it");
3489 } else {
3490 CmdArgs.push_back("-backend-option");
3491 CmdArgs.push_back("-arm-no-restrict-it");
3492 }
Saleem Abdulrasool6deb8162014-05-18 06:42:02 +00003493 } else if (TT.isOSWindows() && (TT.getArch() == llvm::Triple::arm ||
3494 TT.getArch() == llvm::Triple::thumb)) {
3495 // Windows on ARM expects restricted IT blocks
3496 CmdArgs.push_back("-backend-option");
3497 CmdArgs.push_back("-arm-restrict-it");
Weiming Zhao580dcfb2013-11-13 18:31:23 +00003498 }
3499
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003500 if (TT.getArch() == llvm::Triple::arm ||
3501 TT.getArch() == llvm::Triple::thumb) {
3502 if (Arg *A = Args.getLastArg(options::OPT_mlong_calls,
3503 options::OPT_mno_long_calls)) {
3504 if (A->getOption().matches(options::OPT_mlong_calls)) {
3505 CmdArgs.push_back("-backend-option");
Saleem Abdulrasooldf903932014-06-18 16:52:24 +00003506 CmdArgs.push_back("-arm-long-calls");
Saleem Abdulrasoolaea65e92014-06-07 19:32:38 +00003507 }
3508 }
3509 }
3510
Daniel Dunbard18049a2009-04-07 21:16:11 +00003511 // Forward -f options with positive and negative forms; we translate
3512 // these by hand.
Diego Novillo5c297052013-11-13 12:22:39 +00003513 if (Arg *A = Args.getLastArg(options::OPT_fprofile_sample_use_EQ)) {
3514 StringRef fname = A->getValue();
3515 if (!llvm::sys::fs::exists(fname))
3516 D.Diag(diag::err_drv_no_such_file) << fname;
3517 else
3518 A->render(Args, CmdArgs);
3519 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003520
Diego Novillo829b1702014-04-16 16:54:24 +00003521 if (Arg *A = Args.getLastArg(options::OPT_Rpass_EQ))
3522 A->render(Args, CmdArgs);
3523
Diego Novillod23ec942014-05-29 19:55:06 +00003524 if (Arg *A = Args.getLastArg(options::OPT_Rpass_missed_EQ))
3525 A->render(Args, CmdArgs);
3526
3527 if (Arg *A = Args.getLastArg(options::OPT_Rpass_analysis_EQ))
3528 A->render(Args, CmdArgs);
3529
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003530 if (Args.hasArg(options::OPT_mkernel)) {
Daniel Dunbar80f787c2011-02-04 17:24:47 +00003531 if (!Args.hasArg(options::OPT_fapple_kext) && types::isCXX(InputType))
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003532 CmdArgs.push_back("-fapple-kext");
3533 if (!Args.hasArg(options::OPT_fbuiltin))
3534 CmdArgs.push_back("-fno-builtin");
Chad Rosierf27e1c42012-03-26 21:29:17 +00003535 Args.ClaimAllArgs(options::OPT_fno_builtin);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003536 }
Daniel Dunbar4930e332009-11-17 08:07:36 +00003537 // -fbuiltin is default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003538 else if (!Args.hasFlag(options::OPT_fbuiltin, options::OPT_fno_builtin))
Daniel Dunbar484afa22009-11-19 04:55:23 +00003539 CmdArgs.push_back("-fno-builtin");
Daniel Dunbard18049a2009-04-07 21:16:11 +00003540
Nuno Lopes13c88c72009-12-16 16:59:22 +00003541 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3542 options::OPT_fno_assume_sane_operator_new))
3543 CmdArgs.push_back("-fno-assume-sane-operator-new");
3544
Daniel Dunbar4930e332009-11-17 08:07:36 +00003545 // -fblocks=0 is default.
3546 if (Args.hasFlag(options::OPT_fblocks, options::OPT_fno_blocks,
David Chisnallda209912011-02-28 17:11:43 +00003547 getToolChain().IsBlocksDefault()) ||
3548 (Args.hasArg(options::OPT_fgnu_runtime) &&
3549 Args.hasArg(options::OPT_fobjc_nonfragile_abi) &&
3550 !Args.hasArg(options::OPT_fno_blocks))) {
Daniel Dunbar4930e332009-11-17 08:07:36 +00003551 CmdArgs.push_back("-fblocks");
John McCall7959fee2011-09-09 20:41:01 +00003552
3553 if (!Args.hasArg(options::OPT_fgnu_runtime) &&
3554 !getToolChain().hasBlocksRuntime())
3555 CmdArgs.push_back("-fblocks-runtime-optional");
David Chisnall950a9512009-11-17 19:33:30 +00003556 }
Daniel Dunbard18049a2009-04-07 21:16:11 +00003557
Douglas Gregor226173a2012-01-18 15:19:58 +00003558 // -fmodules enables modules (off by default). However, for C++/Objective-C++,
3559 // users must also pass -fcxx-modules. The latter flag will disappear once the
3560 // modules implementation is solid for C++/Objective-C++ programs as well.
Douglas Gregorc60437f2013-01-16 01:23:41 +00003561 bool HaveModules = false;
Douglas Gregor226173a2012-01-18 15:19:58 +00003562 if (Args.hasFlag(options::OPT_fmodules, options::OPT_fno_modules, false)) {
3563 bool AllowedInCXX = Args.hasFlag(options::OPT_fcxx_modules,
3564 options::OPT_fno_cxx_modules,
3565 false);
Douglas Gregorc60437f2013-01-16 01:23:41 +00003566 if (AllowedInCXX || !types::isCXX(InputType)) {
Douglas Gregor226173a2012-01-18 15:19:58 +00003567 CmdArgs.push_back("-fmodules");
Douglas Gregorc60437f2013-01-16 01:23:41 +00003568 HaveModules = true;
3569 }
3570 }
3571
Daniel Jasper07e6c402013-08-05 20:26:17 +00003572 // -fmodule-maps enables module map processing (off by default) for header
3573 // checking. It is implied by -fmodules.
3574 if (Args.hasFlag(options::OPT_fmodule_maps, options::OPT_fno_module_maps,
3575 false)) {
3576 CmdArgs.push_back("-fmodule-maps");
3577 }
3578
Daniel Jasperac42b752013-10-21 06:34:34 +00003579 // -fmodules-decluse checks that modules used are declared so (off by
3580 // default).
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003581 if (Args.hasFlag(options::OPT_fmodules_decluse,
3582 options::OPT_fno_modules_decluse,
3583 false)) {
Daniel Jasper6e16d542013-09-29 12:40:54 +00003584 CmdArgs.push_back("-fmodules-decluse");
Daniel Jasperba7f2f72013-09-24 09:14:14 +00003585 }
3586
Daniel Jasper962b38e2014-04-11 11:47:45 +00003587 // -fmodules-strict-decluse is like -fmodule-decluse, but also checks that
3588 // all #included headers are part of modules.
3589 if (Args.hasFlag(options::OPT_fmodules_strict_decluse,
3590 options::OPT_fno_modules_strict_decluse,
3591 false)) {
3592 CmdArgs.push_back("-fmodules-strict-decluse");
3593 }
3594
Daniel Jasperac42b752013-10-21 06:34:34 +00003595 // -fmodule-name specifies the module that is currently being built (or
3596 // used for header checking by -fmodule-maps).
Justin Bogner5443ad52014-06-20 21:12:53 +00003597 if (Arg *A = Args.getLastArg(options::OPT_fmodule_name))
Daniel Jasperac42b752013-10-21 06:34:34 +00003598 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003599
3600 // -fmodule-map-file can be used to specify a file containing module
3601 // definitions.
Justin Bogner5443ad52014-06-20 21:12:53 +00003602 if (Arg *A = Args.getLastArg(options::OPT_fmodule_map_file))
Daniel Jasperac42b752013-10-21 06:34:34 +00003603 A->render(Args, CmdArgs);
Daniel Jasperac42b752013-10-21 06:34:34 +00003604
Justin Bognera88f0122014-06-20 22:59:50 +00003605 // -fmodule-cache-path specifies where our module files should be written.
3606 SmallString<128> ModuleCachePath;
3607 if (Arg *A = Args.getLastArg(options::OPT_fmodules_cache_path))
3608 ModuleCachePath = A->getValue();
3609 if (HaveModules) {
3610 if (C.isForDiagnostics()) {
3611 // When generating crash reports, we want to emit the modules along with
3612 // the reproduction sources, so we ignore any provided module path.
3613 ModuleCachePath = Output.getFilename();
3614 llvm::sys::path::replace_extension(ModuleCachePath, ".cache");
3615 llvm::sys::path::append(ModuleCachePath, "modules");
3616 } else if (ModuleCachePath.empty()) {
3617 // No module path was provided: use the default.
3618 llvm::sys::path::system_temp_directory(/*erasedOnReboot=*/false,
3619 ModuleCachePath);
3620 llvm::sys::path::append(ModuleCachePath, "org.llvm.clang");
3621 llvm::sys::path::append(ModuleCachePath, "ModuleCache");
3622 }
Douglas Gregor4bedb492013-02-07 22:59:12 +00003623 const char Arg[] = "-fmodules-cache-path=";
Justin Bognera88f0122014-06-20 22:59:50 +00003624 ModuleCachePath.insert(ModuleCachePath.begin(), Arg, Arg + strlen(Arg));
3625 CmdArgs.push_back(Args.MakeArgString(ModuleCachePath));
3626 }
3627
3628 // When building modules and generating crashdumps, we need to dump a module
3629 // dependency VFS alongside the output.
3630 if (HaveModules && C.isForDiagnostics()) {
3631 SmallString<128> VFSDir(Output.getFilename());
3632 llvm::sys::path::replace_extension(VFSDir, ".cache");
3633 llvm::sys::path::append(VFSDir, "vfs");
3634 CmdArgs.push_back("-module-dependency-dir");
3635 CmdArgs.push_back(Args.MakeArgString(VFSDir));
Douglas Gregor35b04d62013-02-07 19:01:24 +00003636 }
3637
Justin Bogner5443ad52014-06-20 21:12:53 +00003638 if (Arg *A = Args.getLastArg(options::OPT_fmodules_user_build_path))
3639 if (HaveModules)
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003640 A->render(Args, CmdArgs);
Argyrios Kyrtzidis1594c152014-03-03 08:12:05 +00003641
Douglas Gregor35b04d62013-02-07 19:01:24 +00003642 // Pass through all -fmodules-ignore-macro arguments.
3643 Args.AddAllArgs(CmdArgs, options::OPT_fmodules_ignore_macro);
Douglas Gregor527b1c92013-03-25 21:19:16 +00003644 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_interval);
3645 Args.AddLastArg(CmdArgs, options::OPT_fmodules_prune_after);
Douglas Gregor35b04d62013-02-07 19:01:24 +00003646
Dmitri Gribenkof430da42014-02-12 10:33:14 +00003647 Args.AddLastArg(CmdArgs, options::OPT_fbuild_session_timestamp);
3648
3649 if (Args.getLastArg(options::OPT_fmodules_validate_once_per_build_session)) {
3650 if (!Args.getLastArg(options::OPT_fbuild_session_timestamp))
3651 D.Diag(diag::err_drv_modules_validate_once_requires_timestamp);
3652
3653 Args.AddLastArg(CmdArgs,
3654 options::OPT_fmodules_validate_once_per_build_session);
3655 }
3656
Ben Langmuirdcf73862014-03-12 00:06:17 +00003657 Args.AddLastArg(CmdArgs, options::OPT_fmodules_validate_system_headers);
3658
John McCalldfea9982010-04-09 19:12:06 +00003659 // -faccess-control is default.
John McCall3155f572010-04-09 19:03:51 +00003660 if (Args.hasFlag(options::OPT_fno_access_control,
3661 options::OPT_faccess_control,
John McCalldfea9982010-04-09 19:12:06 +00003662 false))
John McCall3155f572010-04-09 19:03:51 +00003663 CmdArgs.push_back("-fno-access-control");
John McCall59bb1d42010-03-17 01:32:13 +00003664
Anders Carlssond470fef2010-11-21 00:09:52 +00003665 // -felide-constructors is the default.
3666 if (Args.hasFlag(options::OPT_fno_elide_constructors,
3667 options::OPT_felide_constructors,
3668 false))
3669 CmdArgs.push_back("-fno-elide-constructors");
3670
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003671 // -frtti is default.
Chad Rosier4fab82c2012-03-26 22:04:46 +00003672 if (!Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti) ||
Richard Smith52be6192012-11-05 22:04:41 +00003673 KernelOrKext) {
Daniel Dunbar484afa22009-11-19 04:55:23 +00003674 CmdArgs.push_back("-fno-rtti");
Mike Stump183c3d22009-07-31 23:15:31 +00003675
Richard Smith52be6192012-11-05 22:04:41 +00003676 // -fno-rtti cannot usefully be combined with -fsanitize=vptr.
Alexey Samsonov627b10f2012-11-06 15:09:03 +00003677 if (Sanitize.sanitizesVptr()) {
NAKAMURA Takumiab060362012-11-06 22:02:00 +00003678 std::string NoRttiArg =
Richard Smith52be6192012-11-05 22:04:41 +00003679 Args.getLastArg(options::OPT_mkernel,
3680 options::OPT_fapple_kext,
Richard Smithaa716572012-11-06 01:12:02 +00003681 options::OPT_fno_rtti)->getAsString(Args);
Richard Smith52be6192012-11-05 22:04:41 +00003682 D.Diag(diag::err_drv_argument_not_allowed_with)
3683 << "-fsanitize=vptr" << NoRttiArg;
3684 }
3685 }
3686
Tony Linthicum76329bf2011-12-12 21:14:55 +00003687 // -fshort-enums=0 is default for all architectures except Hexagon.
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003688 if (Args.hasFlag(options::OPT_fshort_enums,
Tony Linthicum76329bf2011-12-12 21:14:55 +00003689 options::OPT_fno_short_enums,
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003690 getToolChain().getArch() ==
Tony Linthicum76329bf2011-12-12 21:14:55 +00003691 llvm::Triple::hexagon))
Argyrios Kyrtzidis74825bc2010-10-08 00:25:19 +00003692 CmdArgs.push_back("-fshort-enums");
3693
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003694 // -fsigned-char is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003695 if (!Args.hasFlag(options::OPT_fsigned_char, options::OPT_funsigned_char,
Daniel Dunbard609b7b2009-11-17 06:37:03 +00003696 isSignedCharDefault(getToolChain().getTriple())))
Daniel Dunbar5fe08662009-11-29 02:39:08 +00003697 CmdArgs.push_back("-fno-signed-char");
Eli Friedman327f0b52009-06-05 07:21:14 +00003698
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003699 // -fthreadsafe-static is default.
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00003700 if (!Args.hasFlag(options::OPT_fthreadsafe_statics,
Anders Carlssonfcd764a2010-02-06 23:23:06 +00003701 options::OPT_fno_threadsafe_statics))
3702 CmdArgs.push_back("-fno-threadsafe-statics");
3703
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003704 // -fuse-cxa-atexit is default.
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003705 if (!Args.hasFlag(options::OPT_fuse_cxa_atexit,
3706 options::OPT_fno_use_cxa_atexit,
3707 !IsWindowsCygnus && !IsWindowsGNU &&
3708 getToolChain().getArch() != llvm::Triple::hexagon &&
3709 getToolChain().getArch() != llvm::Triple::xcore) ||
Chad Rosier4fab82c2012-03-26 22:04:46 +00003710 KernelOrKext)
Daniel Dunbarfe06df42010-03-20 04:15:41 +00003711 CmdArgs.push_back("-fno-use-cxa-atexit");
3712
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003713 // -fms-extensions=0 is default.
Daniel Dunbar5bdd2992009-11-25 10:14:30 +00003714 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003715 IsWindowsMSVC))
Daniel Dunbar0730e4f2009-11-17 07:06:20 +00003716 CmdArgs.push_back("-fms-extensions");
3717
Francois Pichet1b4f1632011-09-17 04:32:15 +00003718 // -fms-compatibility=0 is default.
Douglas Gregor2b4907e2011-10-24 15:49:38 +00003719 if (Args.hasFlag(options::OPT_fms_compatibility,
3720 options::OPT_fno_ms_compatibility,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003721 (IsWindowsMSVC && Args.hasFlag(options::OPT_fms_extensions,
3722 options::OPT_fno_ms_extensions,
3723 true))))
Francois Pichet1b4f1632011-09-17 04:32:15 +00003724 CmdArgs.push_back("-fms-compatibility");
3725
Reid Klecknerc106fda2013-09-18 00:33:59 +00003726 // -fmsc-version=1700 is default.
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003727 if (Args.hasFlag(options::OPT_fms_extensions, options::OPT_fno_ms_extensions,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003728 IsWindowsMSVC) || Args.hasArg(options::OPT_fmsc_version)) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003729 StringRef msc_ver = Args.getLastArgValue(options::OPT_fmsc_version);
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003730 if (msc_ver.empty())
Reid Klecknerc106fda2013-09-18 00:33:59 +00003731 CmdArgs.push_back("-fmsc-version=1700");
Michael J. Spencer4992ca4b2010-10-21 05:21:48 +00003732 else
3733 CmdArgs.push_back(Args.MakeArgString("-fmsc-version=" + msc_ver));
3734 }
3735
3736
Eric Christopher5ecce122013-02-18 00:38:31 +00003737 // -fno-borland-extensions is default.
Dawn Perchik68bb1b42010-09-02 23:59:25 +00003738 if (Args.hasFlag(options::OPT_fborland_extensions,
3739 options::OPT_fno_borland_extensions, false))
3740 CmdArgs.push_back("-fborland-extensions");
3741
Francois Pichet02744872011-09-01 16:38:08 +00003742 // -fno-delayed-template-parsing is default, except for Windows where MSVC STL
3743 // needs it.
Francois Pichet1c229c02011-04-22 22:18:13 +00003744 if (Args.hasFlag(options::OPT_fdelayed_template_parsing,
Saleem Abdulrasool377066a2014-03-27 22:50:18 +00003745 options::OPT_fno_delayed_template_parsing, IsWindowsMSVC))
Francois Pichet35bc5de2011-08-26 00:22:34 +00003746 CmdArgs.push_back("-fdelayed-template-parsing");
Francois Pichet1c229c02011-04-22 22:18:13 +00003747
Chandler Carruthe03aa552010-04-17 20:17:31 +00003748 // -fgnu-keywords default varies depending on language; only pass if
3749 // specified.
3750 if (Arg *A = Args.getLastArg(options::OPT_fgnu_keywords,
Daniel Dunbardb059592010-04-24 17:56:39 +00003751 options::OPT_fno_gnu_keywords))
3752 A->render(Args, CmdArgs);
Chandler Carruthe03aa552010-04-17 20:17:31 +00003753
Rafael Espindola922a6242011-06-02 17:30:53 +00003754 if (Args.hasFlag(options::OPT_fgnu89_inline,
3755 options::OPT_fno_gnu89_inline,
3756 false))
Rafael Espindolafb2af642011-06-02 16:13:27 +00003757 CmdArgs.push_back("-fgnu89-inline");
3758
Chad Rosier9c76d242012-03-15 22:31:42 +00003759 if (Args.hasArg(options::OPT_fno_inline))
3760 CmdArgs.push_back("-fno-inline");
3761
Chad Rosier64d6be92012-03-06 21:17:19 +00003762 if (Args.hasArg(options::OPT_fno_inline_functions))
3763 CmdArgs.push_back("-fno-inline-functions");
Chad Rosier80603182012-03-06 18:49:20 +00003764
John McCall5fb5df92012-06-20 06:18:46 +00003765 ObjCRuntime objcRuntime = AddObjCRuntimeArgs(Args, CmdArgs, rewriteKind);
John McCall24fc0de2011-07-06 00:26:06 +00003766
John McCall5fb5df92012-06-20 06:18:46 +00003767 // -fobjc-dispatch-method is only relevant with the nonfragile-abi, and
Fariborz Jahanian15f60cb2014-01-20 19:32:33 +00003768 // legacy is the default. Except for deployment taget of 10.5,
3769 // next runtime is always legacy dispatch and -fno-objc-legacy-dispatch
3770 // gets ignored silently.
3771 if (objcRuntime.isNonFragile()) {
David Chisnall3154e682011-09-30 13:32:35 +00003772 if (!Args.hasFlag(options::OPT_fobjc_legacy_dispatch,
3773 options::OPT_fno_objc_legacy_dispatch,
David Chisnallda225352012-07-04 11:52:24 +00003774 objcRuntime.isLegacyDispatchDefaultForArch(
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00003775 getToolChain().getArch()))) {
David Chisnall3154e682011-09-30 13:32:35 +00003776 if (getToolChain().UseObjCMixedDispatch())
3777 CmdArgs.push_back("-fobjc-dispatch-method=mixed");
3778 else
3779 CmdArgs.push_back("-fobjc-dispatch-method=non-legacy");
3780 }
3781 }
Rafael Espindolab44676c2013-11-12 04:33:56 +00003782
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003783 // When ObjectiveC legacy runtime is in effect on MacOSX,
3784 // turn on the option to do Array/Dictionary subscripting
3785 // by default.
Fariborz Jahanianff6c97c2013-11-12 20:50:26 +00003786 if (getToolChain().getTriple().getArch() == llvm::Triple::x86 &&
3787 getToolChain().getTriple().isMacOSX() &&
3788 !getToolChain().getTriple().isMacOSXVersionLT(10, 7) &&
3789 objcRuntime.getKind() == ObjCRuntime::FragileMacOSX &&
Fariborz Jahanianfd4ce192013-11-12 17:08:46 +00003790 objcRuntime.isNeXTFamily())
3791 CmdArgs.push_back("-fobjc-subscripting-legacy-runtime");
3792
Fariborz Jahanian0e3043b2012-11-15 19:02:45 +00003793 // -fencode-extended-block-signature=1 is default.
3794 if (getToolChain().IsEncodeExtendedBlockSignatureDefault()) {
3795 CmdArgs.push_back("-fencode-extended-block-signature");
3796 }
3797
John McCall24fc0de2011-07-06 00:26:06 +00003798 // Allow -fno-objc-arr to trump -fobjc-arr/-fobjc-arc.
3799 // NOTE: This logic is duplicated in ToolChains.cpp.
3800 bool ARC = isObjCAutoRefCount(Args);
3801 if (ARC) {
John McCall3deb1ad2012-08-21 02:47:43 +00003802 getToolChain().CheckObjCARC();
Argyrios Kyrtzidis3dbeb552012-02-29 03:43:52 +00003803
John McCall24fc0de2011-07-06 00:26:06 +00003804 CmdArgs.push_back("-fobjc-arc");
3805
Chandler Carruth491db322011-11-04 07:34:47 +00003806 // FIXME: It seems like this entire block, and several around it should be
3807 // wrapped in isObjC, but for now we just use it here as this is where it
3808 // was being used previously.
3809 if (types::isCXX(InputType) && types::isObjC(InputType)) {
3810 if (getToolChain().GetCXXStdlibType(Args) == ToolChain::CST_Libcxx)
3811 CmdArgs.push_back("-fobjc-arc-cxxlib=libc++");
3812 else
3813 CmdArgs.push_back("-fobjc-arc-cxxlib=libstdc++");
3814 }
3815
John McCall24fc0de2011-07-06 00:26:06 +00003816 // Allow the user to enable full exceptions code emission.
3817 // We define off for Objective-CC, on for Objective-C++.
3818 if (Args.hasFlag(options::OPT_fobjc_arc_exceptions,
3819 options::OPT_fno_objc_arc_exceptions,
3820 /*default*/ types::isCXX(InputType)))
3821 CmdArgs.push_back("-fobjc-arc-exceptions");
3822 }
3823
3824 // -fobjc-infer-related-result-type is the default, except in the Objective-C
3825 // rewriter.
John McCall5fb5df92012-06-20 06:18:46 +00003826 if (rewriteKind != RK_None)
John McCall24fc0de2011-07-06 00:26:06 +00003827 CmdArgs.push_back("-fno-objc-infer-related-result-type");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003828
John McCall24fc0de2011-07-06 00:26:06 +00003829 // Handle -fobjc-gc and -fobjc-gc-only. They are exclusive, and -fobjc-gc-only
3830 // takes precedence.
3831 const Arg *GCArg = Args.getLastArg(options::OPT_fobjc_gc_only);
3832 if (!GCArg)
3833 GCArg = Args.getLastArg(options::OPT_fobjc_gc);
3834 if (GCArg) {
3835 if (ARC) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003836 D.Diag(diag::err_drv_objc_gc_arr)
John McCall24fc0de2011-07-06 00:26:06 +00003837 << GCArg->getAsString(Args);
3838 } else if (getToolChain().SupportsObjCGC()) {
3839 GCArg->render(Args, CmdArgs);
3840 } else {
3841 // FIXME: We should move this to a hard error.
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003842 D.Diag(diag::warn_drv_objc_gc_unsupported)
John McCall24fc0de2011-07-06 00:26:06 +00003843 << GCArg->getAsString(Args);
3844 }
3845 }
3846
John McCallb5f652e2011-06-22 00:53:57 +00003847 // Add exception args.
3848 addExceptionArgs(Args, InputType, getToolChain().getTriple(),
John McCall5fb5df92012-06-20 06:18:46 +00003849 KernelOrKext, objcRuntime, CmdArgs);
John McCallb5f652e2011-06-22 00:53:57 +00003850
3851 if (getToolChain().UseSjLjExceptions())
3852 CmdArgs.push_back("-fsjlj-exceptions");
3853
3854 // C++ "sane" operator new.
Daniel Dunbar2e3f2c82010-02-01 21:07:25 +00003855 if (!Args.hasFlag(options::OPT_fassume_sane_operator_new,
3856 options::OPT_fno_assume_sane_operator_new))
3857 CmdArgs.push_back("-fno-assume-sane-operator-new");
3858
Daniel Dunbar34d7a992010-04-27 15:34:57 +00003859 // -fconstant-cfstrings is default, and may be subject to argument translation
3860 // on Darwin.
3861 if (!Args.hasFlag(options::OPT_fconstant_cfstrings,
3862 options::OPT_fno_constant_cfstrings) ||
3863 !Args.hasFlag(options::OPT_mconstant_cfstrings,
3864 options::OPT_mno_constant_cfstrings))
3865 CmdArgs.push_back("-fno-constant-cfstrings");
3866
John Thompsoned4e2952009-11-05 20:14:16 +00003867 // -fshort-wchar default varies depending on platform; only
3868 // pass if specified.
Richard Bartonc9b5f352014-02-24 18:43:28 +00003869 if (Arg *A = Args.getLastArg(options::OPT_fshort_wchar,
3870 options::OPT_fno_short_wchar))
Daniel Dunbar2cb4e7a2010-04-27 15:35:03 +00003871 A->render(Args, CmdArgs);
John Thompsoned4e2952009-11-05 20:14:16 +00003872
Hans Wennborg28c96312013-07-31 23:39:13 +00003873 // -fno-pascal-strings is default, only pass non-default.
Daniel Dunbard067f7f2009-04-08 23:54:23 +00003874 if (Args.hasFlag(options::OPT_fpascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003875 options::OPT_fno_pascal_strings,
Daniel Dunbard4510f22009-04-07 23:51:44 +00003876 false))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003877 CmdArgs.push_back("-fpascal-strings");
NAKAMURA Takumi029d74b2011-02-17 08:50:50 +00003878
Daniel Dunbar096ed292011-10-05 21:04:55 +00003879 // Honor -fpack-struct= and -fpack-struct, if given. Note that
3880 // -fno-pack-struct doesn't apply to -fpack-struct=.
3881 if (Arg *A = Args.getLastArg(options::OPT_fpack_struct_EQ)) {
James Molloycebf75e2012-05-02 07:56:14 +00003882 std::string PackStructStr = "-fpack-struct=";
Richard Smithbd55daf2012-11-01 04:30:05 +00003883 PackStructStr += A->getValue();
James Molloycebf75e2012-05-02 07:56:14 +00003884 CmdArgs.push_back(Args.MakeArgString(PackStructStr));
Daniel Dunbar096ed292011-10-05 21:04:55 +00003885 } else if (Args.hasFlag(options::OPT_fpack_struct,
3886 options::OPT_fno_pack_struct, false)) {
James Molloycebf75e2012-05-02 07:56:14 +00003887 CmdArgs.push_back("-fpack-struct=1");
Daniel Dunbar096ed292011-10-05 21:04:55 +00003888 }
3889
Robert Lytton0e076492013-08-13 09:43:10 +00003890 if (KernelOrKext || isNoCommonDefault(getToolChain().getTriple())) {
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003891 if (!Args.hasArg(options::OPT_fcommon))
3892 CmdArgs.push_back("-fno-common");
Chad Rosierd9d80e02012-03-26 21:35:40 +00003893 Args.ClaimAllArgs(options::OPT_fno_common);
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003894 }
Daniel Dunbar096ed292011-10-05 21:04:55 +00003895
Daniel Dunbard18049a2009-04-07 21:16:11 +00003896 // -fcommon is default, only pass non-default.
Fariborz Jahaniana4cfff82011-01-07 01:05:02 +00003897 else if (!Args.hasFlag(options::OPT_fcommon, options::OPT_fno_common))
Daniel Dunbard18049a2009-04-07 21:16:11 +00003898 CmdArgs.push_back("-fno-common");
3899
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003900 // -fsigned-bitfields is default, and clang doesn't yet support
Daniel Dunbar6358d682010-10-15 22:30:42 +00003901 // -funsigned-bitfields.
Mike Stump11289f42009-09-09 15:08:12 +00003902 if (!Args.hasFlag(options::OPT_fsigned_bitfields,
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003903 options::OPT_funsigned_bitfields))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003904 D.Diag(diag::warn_drv_clang_unsupported)
Daniel Dunbar2edd9232009-04-15 02:37:43 +00003905 << Args.getLastArg(options::OPT_funsigned_bitfields)->getAsString(Args);
3906
Daniel Dunbar6358d682010-10-15 22:30:42 +00003907 // -fsigned-bitfields is default, and clang doesn't support -fno-for-scope.
3908 if (!Args.hasFlag(options::OPT_ffor_scope,
3909 options::OPT_fno_for_scope))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00003910 D.Diag(diag::err_drv_clang_unsupported)
Daniel Dunbar6358d682010-10-15 22:30:42 +00003911 << Args.getLastArg(options::OPT_fno_for_scope)->getAsString(Args);
3912
Jeffrey Yasskin460aa542010-06-08 04:56:20 +00003913 // -fcaret-diagnostics is default.
3914 if (!Args.hasFlag(options::OPT_fcaret_diagnostics,
3915 options::OPT_fno_caret_diagnostics, true))
3916 CmdArgs.push_back("-fno-caret-diagnostics");
3917
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003918 // -fdiagnostics-fixit-info is default, only pass non-default.
Mike Stump11289f42009-09-09 15:08:12 +00003919 if (!Args.hasFlag(options::OPT_fdiagnostics_fixit_info,
Daniel Dunbar8281bde2009-04-19 21:09:34 +00003920 options::OPT_fno_diagnostics_fixit_info))
3921 CmdArgs.push_back("-fno-diagnostics-fixit-info");
Eric Christopher84fbdb42011-08-19 00:30:14 +00003922
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003923 // Enable -fdiagnostics-show-option by default.
Mike Stump11289f42009-09-09 15:08:12 +00003924 if (Args.hasFlag(options::OPT_fdiagnostics_show_option,
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003925 options::OPT_fno_diagnostics_show_option))
3926 CmdArgs.push_back("-fdiagnostics-show-option");
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003927
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003928 if (const Arg *A =
3929 Args.getLastArg(options::OPT_fdiagnostics_show_category_EQ)) {
3930 CmdArgs.push_back("-fdiagnostics-show-category");
Richard Smithbd55daf2012-11-01 04:30:05 +00003931 CmdArgs.push_back(A->getValue());
Chris Lattnerbf6fac82010-05-04 21:55:25 +00003932 }
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00003933
Douglas Gregor643c9222011-05-21 17:07:29 +00003934 if (const Arg *A =
3935 Args.getLastArg(options::OPT_fdiagnostics_format_EQ)) {
3936 CmdArgs.push_back("-fdiagnostics-format");
Richard Smithbd55daf2012-11-01 04:30:05 +00003937 CmdArgs.push_back(A->getValue());
Douglas Gregor643c9222011-05-21 17:07:29 +00003938 }
3939
Chandler Carruthb6766f02011-03-27 01:50:55 +00003940 if (Arg *A = Args.getLastArg(
3941 options::OPT_fdiagnostics_show_note_include_stack,
3942 options::OPT_fno_diagnostics_show_note_include_stack)) {
3943 if (A->getOption().matches(
3944 options::OPT_fdiagnostics_show_note_include_stack))
3945 CmdArgs.push_back("-fdiagnostics-show-note-include-stack");
3946 else
3947 CmdArgs.push_back("-fno-diagnostics-show-note-include-stack");
3948 }
3949
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003950 // Color diagnostics are the default, unless the terminal doesn't support
3951 // them.
Nico Weber7e2da792013-04-17 21:52:44 +00003952 // Support both clang's -f[no-]color-diagnostics and gcc's
3953 // -f[no-]diagnostics-colors[=never|always|auto].
3954 enum { Colors_On, Colors_Off, Colors_Auto } ShowColors = Colors_Auto;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00003955 for (const auto &Arg : Args) {
3956 const Option &O = Arg->getOption();
Nico Weber7e2da792013-04-17 21:52:44 +00003957 if (!O.matches(options::OPT_fcolor_diagnostics) &&
3958 !O.matches(options::OPT_fdiagnostics_color) &&
3959 !O.matches(options::OPT_fno_color_diagnostics) &&
3960 !O.matches(options::OPT_fno_diagnostics_color) &&
3961 !O.matches(options::OPT_fdiagnostics_color_EQ))
3962 continue;
3963
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00003964 Arg->claim();
Nico Weber7e2da792013-04-17 21:52:44 +00003965 if (O.matches(options::OPT_fcolor_diagnostics) ||
3966 O.matches(options::OPT_fdiagnostics_color)) {
3967 ShowColors = Colors_On;
3968 } else if (O.matches(options::OPT_fno_color_diagnostics) ||
3969 O.matches(options::OPT_fno_diagnostics_color)) {
3970 ShowColors = Colors_Off;
3971 } else {
3972 assert(O.matches(options::OPT_fdiagnostics_color_EQ));
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00003973 StringRef value(Arg->getValue());
Nico Weber7e2da792013-04-17 21:52:44 +00003974 if (value == "always")
3975 ShowColors = Colors_On;
3976 else if (value == "never")
3977 ShowColors = Colors_Off;
3978 else if (value == "auto")
3979 ShowColors = Colors_Auto;
3980 else
3981 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
3982 << ("-fdiagnostics-color=" + value).str();
3983 }
3984 }
3985 if (ShowColors == Colors_On ||
3986 (ShowColors == Colors_Auto && llvm::sys::Process::StandardErrHasColors()))
Daniel Dunbar5ec95022009-11-04 06:24:57 +00003987 CmdArgs.push_back("-fcolor-diagnostics");
3988
Nico Rieck7857d462013-09-11 00:38:02 +00003989 if (Args.hasArg(options::OPT_fansi_escape_codes))
3990 CmdArgs.push_back("-fansi-escape-codes");
3991
Daniel Dunbardb097022009-06-08 21:13:54 +00003992 if (!Args.hasFlag(options::OPT_fshow_source_location,
3993 options::OPT_fno_show_source_location))
3994 CmdArgs.push_back("-fno-show-source-location");
Daniel Dunbar092f0cc2009-04-16 06:32:38 +00003995
Douglas Gregor643c9222011-05-21 17:07:29 +00003996 if (!Args.hasFlag(options::OPT_fshow_column,
3997 options::OPT_fno_show_column,
3998 true))
3999 CmdArgs.push_back("-fno-show-column");
4000
Douglas Gregor8ed0c0b2010-07-09 17:35:33 +00004001 if (!Args.hasFlag(options::OPT_fspell_checking,
4002 options::OPT_fno_spell_checking))
4003 CmdArgs.push_back("-fno-spell-checking");
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004004
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004005
Chad Rosierc8e56e82012-12-05 21:08:21 +00004006 // -fno-asm-blocks is default.
4007 if (Args.hasFlag(options::OPT_fasm_blocks, options::OPT_fno_asm_blocks,
4008 false))
4009 CmdArgs.push_back("-fasm-blocks");
Daniel Dunbar473f8a62010-10-18 22:49:46 +00004010
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004011 // Enable vectorization per default according to the optimization level
4012 // selected. For optimization levels that want vectorization we use the alias
4013 // option to simplify the hasFlag logic.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004014 bool EnableVec = shouldEnableVectorizerAtOLevel(Args, false);
Arnold Schwaighofer7f994ce2013-08-13 15:46:23 +00004015 OptSpecifier VectorizeAliasOption = EnableVec ? options::OPT_O_Group :
Chad Rosier679b0752013-04-24 18:29:59 +00004016 options::OPT_fvectorize;
Chad Rosier679b0752013-04-24 18:29:59 +00004017 if (Args.hasFlag(options::OPT_fvectorize, VectorizeAliasOption,
Hal Finkel108c46a2013-08-28 05:21:45 +00004018 options::OPT_fno_vectorize, EnableVec))
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004019 CmdArgs.push_back("-vectorize-loops");
Chad Rosier0d3ed6f2012-12-11 17:12:28 +00004020
Chad Rosier136d67d2014-04-28 19:30:57 +00004021 // -fslp-vectorize is enabled based on the optimization level selected.
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004022 bool EnableSLPVec = shouldEnableVectorizerAtOLevel(Args, true);
4023 OptSpecifier SLPVectAliasOption = EnableSLPVec ? options::OPT_O_Group :
Chad Rosier136d67d2014-04-28 19:30:57 +00004024 options::OPT_fslp_vectorize;
4025 if (Args.hasFlag(options::OPT_fslp_vectorize, SLPVectAliasOption,
Chad Rosier3ba81bd2014-05-02 18:41:57 +00004026 options::OPT_fno_slp_vectorize, EnableSLPVec))
Nadav Rotem0a2604d2013-04-15 04:57:18 +00004027 CmdArgs.push_back("-vectorize-slp");
Hal Finkel061f1652012-12-11 19:59:32 +00004028
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004029 // -fno-slp-vectorize-aggressive is default.
4030 if (Args.hasFlag(options::OPT_fslp_vectorize_aggressive,
Nick Lewyckyd3f3e4f2013-06-25 01:49:44 +00004031 options::OPT_fno_slp_vectorize_aggressive, false))
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004032 CmdArgs.push_back("-vectorize-slp-aggressive");
Nadav Rotem6a0dd6b2013-04-15 05:38:41 +00004033
Jeffrey Yasskin2b99c6f2010-06-11 05:57:47 +00004034 if (Arg *A = Args.getLastArg(options::OPT_fshow_overloads_EQ))
4035 A->render(Args, CmdArgs);
4036
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004037 // -fdollars-in-identifiers default varies depending on platform and
4038 // language; only pass if specified.
Mike Stump11289f42009-09-09 15:08:12 +00004039 if (Arg *A = Args.getLastArg(options::OPT_fdollars_in_identifiers,
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004040 options::OPT_fno_dollars_in_identifiers)) {
4041 if (A->getOption().matches(options::OPT_fdollars_in_identifiers))
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004042 CmdArgs.push_back("-fdollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004043 else
Daniel Dunbar15cef0e2009-12-16 20:10:18 +00004044 CmdArgs.push_back("-fno-dollars-in-identifiers");
Daniel Dunbarf5e9b1f2009-04-19 21:20:32 +00004045 }
4046
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004047 // -funit-at-a-time is default, and we don't support -fno-unit-at-a-time for
4048 // practical purposes.
Mike Stump11289f42009-09-09 15:08:12 +00004049 if (Arg *A = Args.getLastArg(options::OPT_funit_at_a_time,
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004050 options::OPT_fno_unit_at_a_time)) {
4051 if (A->getOption().matches(options::OPT_fno_unit_at_a_time))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004052 D.Diag(diag::warn_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbaradeeb052009-05-22 19:02:20 +00004053 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004054
Eli Friedman055c9702011-11-02 01:53:16 +00004055 if (Args.hasFlag(options::OPT_fapple_pragma_pack,
4056 options::OPT_fno_apple_pragma_pack, false))
4057 CmdArgs.push_back("-fapple-pragma-pack");
4058
Eli Benderskyc95cfe82013-07-24 18:20:14 +00004059 // le32-specific flags:
4060 // -fno-math-builtin: clang should not convert math builtins to intrinsics
4061 // by default.
4062 if (getToolChain().getArch() == llvm::Triple::le32) {
4063 CmdArgs.push_back("-fno-math-builtin");
4064 }
4065
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004066 // Default to -fno-builtin-str{cat,cpy} on Darwin for ARM.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004067 //
Daniel Dunbar6c536aa2009-12-11 23:00:49 +00004068 // FIXME: This is disabled until clang -cc1 supports -fno-builtin-foo. PR4941.
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004069#if 0
Bob Wilson6524dd32011-10-14 05:03:44 +00004070 if (getToolChain().getTriple().isOSDarwin() &&
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00004071 (getToolChain().getArch() == llvm::Triple::arm ||
4072 getToolChain().getArch() == llvm::Triple::thumb)) {
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004073 if (!Args.hasArg(options::OPT_fbuiltin_strcat))
4074 CmdArgs.push_back("-fno-builtin-strcat");
4075 if (!Args.hasArg(options::OPT_fbuiltin_strcpy))
4076 CmdArgs.push_back("-fno-builtin-strcpy");
4077 }
Daniel Dunbar4fa08112009-09-10 04:57:27 +00004078#endif
Daniel Dunbar2ffe0292009-09-10 03:37:02 +00004079
Justin Bognera88f0122014-06-20 22:59:50 +00004080 // Enable rewrite includes if the user's asked for it or if we're generating
4081 // diagnostics.
4082 // TODO: Once -module-dependency-dir works with -frewrite-includes it'd be
4083 // nice to enable this when doing a crashdump for modules as well.
Justin Bogner332a5e52014-06-20 22:16:00 +00004084 if (Args.hasFlag(options::OPT_frewrite_includes,
4085 options::OPT_fno_rewrite_includes, false) ||
Justin Bognera88f0122014-06-20 22:59:50 +00004086 (C.isForDiagnostics() && !HaveModules))
Justin Bogner332a5e52014-06-20 22:16:00 +00004087 CmdArgs.push_back("-frewrite-includes");
4088
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004089 // Only allow -traditional or -traditional-cpp outside in preprocessing modes.
Mike Stump11289f42009-09-09 15:08:12 +00004090 if (Arg *A = Args.getLastArg(options::OPT_traditional,
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004091 options::OPT_traditional_cpp)) {
4092 if (isa<PreprocessJobAction>(JA))
4093 CmdArgs.push_back("-traditional-cpp");
Eric Christopher84fbdb42011-08-19 00:30:14 +00004094 else
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004095 D.Diag(diag::err_drv_clang_unsupported) << A->getAsString(Args);
Daniel Dunbar8c3d7352011-03-18 21:23:40 +00004096 }
Eli Friedmanbb0d9a52009-07-14 21:58:17 +00004097
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004098 Args.AddLastArg(CmdArgs, options::OPT_dM);
Chris Lattnercac63f32009-04-12 01:56:53 +00004099 Args.AddLastArg(CmdArgs, options::OPT_dD);
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004100
4101 // Handle serialized diagnostics.
4102 if (Arg *A = Args.getLastArg(options::OPT__serialize_diags)) {
4103 CmdArgs.push_back("-serialize-diagnostic-file");
Richard Smithbd55daf2012-11-01 04:30:05 +00004104 CmdArgs.push_back(Args.MakeArgString(A->getValue()));
Ted Kremeneke73d9ed2011-11-11 00:07:43 +00004105 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004106
Ted Kremenekb47e6bc2012-09-13 06:41:18 +00004107 if (Args.hasArg(options::OPT_fretain_comments_from_system_headers))
4108 CmdArgs.push_back("-fretain-comments-from-system-headers");
4109
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004110 // Forward -fcomment-block-commands to -cc1.
4111 Args.AddAllArgs(CmdArgs, options::OPT_fcomment_block_commands);
Dmitri Gribenkoa7d16ce2013-04-10 15:35:17 +00004112 // Forward -fparse-all-comments to -cc1.
4113 Args.AddAllArgs(CmdArgs, options::OPT_fparse_all_comments);
Dmitri Gribenkoacf2e782013-02-22 14:21:27 +00004114
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004115 // Forward -Xclang arguments to -cc1, and -mllvm arguments to the LLVM option
4116 // parser.
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004117 Args.AddAllArgValues(CmdArgs, options::OPT_Xclang);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004118 for (arg_iterator it = Args.filtered_begin(options::OPT_mllvm),
4119 ie = Args.filtered_end(); it != ie; ++it) {
Daniel Dunbara442fd52010-06-11 22:00:13 +00004120 (*it)->claim();
Daniel Dunbar88534f42010-04-17 06:10:00 +00004121
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004122 // We translate this by hand to the -cc1 argument, since nightly test uses
4123 // it and developers have been trained to spell it with -mllvm.
Richard Smithbd55daf2012-11-01 04:30:05 +00004124 if (StringRef((*it)->getValue(0)) == "-disable-llvm-optzns")
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004125 CmdArgs.push_back("-disable-llvm-optzns");
4126 else
Daniel Dunbara442fd52010-06-11 22:00:13 +00004127 (*it)->render(Args, CmdArgs);
Daniel Dunbar76fa8402010-04-15 06:09:03 +00004128 }
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004129
Daniel Dunbard67a3222009-03-30 06:36:42 +00004130 if (Output.getType() == types::TY_Dependencies) {
4131 // Handled with other dependency code.
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004132 } else if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004133 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004134 CmdArgs.push_back(Output.getFilename());
4135 } else {
4136 assert(Output.isNothing() && "Invalid output.");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004137 }
4138
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004139 for (const auto &II : Inputs) {
Ben Langmuir2cb4a782014-02-05 22:21:15 +00004140 addDashXForInput(Args, II, CmdArgs);
4141
Daniel Dunbarb440f562010-08-02 02:38:21 +00004142 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004143 CmdArgs.push_back(II.getFilename());
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004144 else
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004145 II.getInputArg().renderAsInput(Args, CmdArgs);
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004146 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004147
Chris Lattnere9d7d782009-11-03 19:50:27 +00004148 Args.AddAllArgs(CmdArgs, options::OPT_undef);
4149
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004150 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004151
4152 // Optionally embed the -cc1 level arguments into the debug info, for build
4153 // analysis.
4154 if (getToolChain().UseDwarfDebugFlags()) {
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004155 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004156 for (const auto &Arg : Args)
4157 Arg->render(Args, OriginalArgs);
Daniel Dunbarfe6c97b2010-08-24 16:47:49 +00004158
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004159 SmallString<256> Flags;
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004160 Flags += Exec;
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004161 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004162 Flags += " ";
Daniel Dunbar7f3d9502010-06-04 18:47:06 +00004163 Flags += OriginalArgs[i];
Daniel Dunbar24c7f5e2009-12-18 02:43:17 +00004164 }
4165 CmdArgs.push_back("-dwarf-debug-flags");
4166 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4167 }
4168
Eric Christopherd3804002013-02-22 20:12:52 +00004169 // Add the split debug info name to the command lines here so we
4170 // can propagate it to the backend.
4171 bool SplitDwarf = Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004172 getToolChain().getTriple().isOSLinux() &&
Eric Christopherf1545832013-02-22 23:50:16 +00004173 (isa<AssembleJobAction>(JA) || isa<CompileJobAction>(JA));
Eric Christopherd3804002013-02-22 20:12:52 +00004174 const char *SplitDwarfOut;
4175 if (SplitDwarf) {
4176 CmdArgs.push_back("-split-dwarf-file");
4177 SplitDwarfOut = SplitDebugName(Args, Inputs);
4178 CmdArgs.push_back(SplitDwarfOut);
4179 }
4180
4181 // Finally add the compile command to the compilation.
Hans Wennborg859422a2014-01-13 22:24:42 +00004182 if (Args.hasArg(options::OPT__SLASH_fallback) &&
Hans Wennborg26a44302014-04-25 16:44:17 +00004183 Output.getType() == types::TY_Object &&
4184 (InputType == types::TY_C || InputType == types::TY_CXX)) {
Hans Wennborg87cfa712013-09-19 20:32:16 +00004185 tools::visualstudio::Compile CL(getToolChain());
4186 Command *CLCommand = CL.GetCommand(C, JA, Output, Inputs, Args,
4187 LinkingOutput);
Reid Kleckner47c2f842014-05-14 16:03:05 +00004188 // RTTI support in clang-cl is a work in progress. Fall back to MSVC early
4189 // if we are using 'clang-cl /fallback /GR'.
4190 // FIXME: Remove this when RTTI is finished.
4191 if (Args.hasFlag(options::OPT_frtti, options::OPT_fno_rtti, false)) {
4192 D.Diag(diag::warn_drv_rtti_fallback) << CLCommand->getExecutable();
4193 C.addCommand(CLCommand);
4194 } else {
4195 C.addCommand(new FallbackCommand(JA, *this, Exec, CmdArgs, CLCommand));
4196 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00004197 } else {
4198 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
4199 }
4200
Daniel Dunbar17731772009-03-23 19:03:36 +00004201
Eric Christopherf1545832013-02-22 23:50:16 +00004202 // Handle the debug info splitting at object creation time if we're
4203 // creating an object.
Eric Christopher248357f2013-02-21 22:35:01 +00004204 // TODO: Currently only works on linux with newer objcopy.
Eric Christopherf1545832013-02-22 23:50:16 +00004205 if (SplitDwarf && !isa<CompileJobAction>(JA))
Eric Christopherd3804002013-02-22 20:12:52 +00004206 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output, SplitDwarfOut);
Eric Christopher248357f2013-02-21 22:35:01 +00004207
Roman Divacky178e01602011-02-10 16:52:03 +00004208 if (Arg *A = Args.getLastArg(options::OPT_pg))
4209 if (Args.hasArg(options::OPT_fomit_frame_pointer))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004210 D.Diag(diag::err_drv_argument_not_allowed_with)
Roman Divacky178e01602011-02-10 16:52:03 +00004211 << "-fomit-frame-pointer" << A->getAsString(Args);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004212
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004213 // Claim some arguments which clang supports automatically.
4214
Daniel Dunbar3e0cac62010-04-15 06:18:42 +00004215 // -fpch-preprocess is used with gcc to add a special marker in the output to
4216 // include the PCH file. Clang's PTH solution is completely transparent, so we
4217 // do not need to deal with it at all.
Daniel Dunbarc2a71892009-04-03 20:51:31 +00004218 Args.ClaimAllArgs(options::OPT_fpch_preprocess);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004219
Daniel Dunbar17731772009-03-23 19:03:36 +00004220 // Claim some arguments which clang doesn't support, but we don't
4221 // care to warn the user about.
Daniel Dunbar44b36ee2009-11-25 11:53:23 +00004222 Args.ClaimAllArgs(options::OPT_clang_ignored_f_Group);
4223 Args.ClaimAllArgs(options::OPT_clang_ignored_m_Group);
Rafael Espindola22f603032011-02-28 23:29:45 +00004224
Rafael Espindolab0092d72013-09-04 19:37:35 +00004225 // Disable warnings for clang -E -emit-llvm foo.c
Rafael Espindolad95a8122011-03-01 05:25:27 +00004226 Args.ClaimAllArgs(options::OPT_emit_llvm);
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004227}
4228
John McCall5fb5df92012-06-20 06:18:46 +00004229/// Add options related to the Objective-C runtime/ABI.
4230///
4231/// Returns true if the runtime is non-fragile.
4232ObjCRuntime Clang::AddObjCRuntimeArgs(const ArgList &args,
4233 ArgStringList &cmdArgs,
4234 RewriteKind rewriteKind) const {
4235 // Look for the controlling runtime option.
4236 Arg *runtimeArg = args.getLastArg(options::OPT_fnext_runtime,
4237 options::OPT_fgnu_runtime,
4238 options::OPT_fobjc_runtime_EQ);
4239
4240 // Just forward -fobjc-runtime= to the frontend. This supercedes
4241 // options about fragility.
4242 if (runtimeArg &&
4243 runtimeArg->getOption().matches(options::OPT_fobjc_runtime_EQ)) {
4244 ObjCRuntime runtime;
Richard Smithbd55daf2012-11-01 04:30:05 +00004245 StringRef value = runtimeArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004246 if (runtime.tryParse(value)) {
4247 getToolChain().getDriver().Diag(diag::err_drv_unknown_objc_runtime)
4248 << value;
4249 }
4250
4251 runtimeArg->render(args, cmdArgs);
4252 return runtime;
4253 }
4254
4255 // Otherwise, we'll need the ABI "version". Version numbers are
4256 // slightly confusing for historical reasons:
4257 // 1 - Traditional "fragile" ABI
4258 // 2 - Non-fragile ABI, version 1
4259 // 3 - Non-fragile ABI, version 2
4260 unsigned objcABIVersion = 1;
4261 // If -fobjc-abi-version= is present, use that to set the version.
4262 if (Arg *abiArg = args.getLastArg(options::OPT_fobjc_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004263 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004264 if (value == "1")
4265 objcABIVersion = 1;
4266 else if (value == "2")
4267 objcABIVersion = 2;
4268 else if (value == "3")
4269 objcABIVersion = 3;
4270 else
4271 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4272 << value;
4273 } else {
4274 // Otherwise, determine if we are using the non-fragile ABI.
4275 bool nonFragileABIIsDefault =
4276 (rewriteKind == RK_NonFragile ||
4277 (rewriteKind == RK_None &&
4278 getToolChain().IsObjCNonFragileABIDefault()));
4279 if (args.hasFlag(options::OPT_fobjc_nonfragile_abi,
4280 options::OPT_fno_objc_nonfragile_abi,
4281 nonFragileABIIsDefault)) {
4282 // Determine the non-fragile ABI version to use.
4283#ifdef DISABLE_DEFAULT_NONFRAGILEABI_TWO
4284 unsigned nonFragileABIVersion = 1;
4285#else
4286 unsigned nonFragileABIVersion = 2;
4287#endif
4288
4289 if (Arg *abiArg = args.getLastArg(
4290 options::OPT_fobjc_nonfragile_abi_version_EQ)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00004291 StringRef value = abiArg->getValue();
John McCall5fb5df92012-06-20 06:18:46 +00004292 if (value == "1")
4293 nonFragileABIVersion = 1;
4294 else if (value == "2")
4295 nonFragileABIVersion = 2;
4296 else
4297 getToolChain().getDriver().Diag(diag::err_drv_clang_unsupported)
4298 << value;
4299 }
4300
4301 objcABIVersion = 1 + nonFragileABIVersion;
4302 } else {
4303 objcABIVersion = 1;
4304 }
4305 }
4306
4307 // We don't actually care about the ABI version other than whether
4308 // it's non-fragile.
4309 bool isNonFragile = objcABIVersion != 1;
4310
4311 // If we have no runtime argument, ask the toolchain for its default runtime.
4312 // However, the rewriter only really supports the Mac runtime, so assume that.
4313 ObjCRuntime runtime;
4314 if (!runtimeArg) {
4315 switch (rewriteKind) {
4316 case RK_None:
4317 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4318 break;
4319 case RK_Fragile:
4320 runtime = ObjCRuntime(ObjCRuntime::FragileMacOSX, VersionTuple());
4321 break;
4322 case RK_NonFragile:
4323 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4324 break;
4325 }
4326
4327 // -fnext-runtime
4328 } else if (runtimeArg->getOption().matches(options::OPT_fnext_runtime)) {
4329 // On Darwin, make this use the default behavior for the toolchain.
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004330 if (getToolChain().getTriple().isOSDarwin()) {
John McCall5fb5df92012-06-20 06:18:46 +00004331 runtime = getToolChain().getDefaultObjCRuntime(isNonFragile);
4332
4333 // Otherwise, build for a generic macosx port.
4334 } else {
4335 runtime = ObjCRuntime(ObjCRuntime::MacOSX, VersionTuple());
4336 }
4337
4338 // -fgnu-runtime
4339 } else {
4340 assert(runtimeArg->getOption().matches(options::OPT_fgnu_runtime));
David Chisnall314896c2012-07-04 10:37:03 +00004341 // Legacy behaviour is to target the gnustep runtime if we are i
4342 // non-fragile mode or the GCC runtime in fragile mode.
4343 if (isNonFragile)
David Chisnalla5f59412012-10-16 15:11:55 +00004344 runtime = ObjCRuntime(ObjCRuntime::GNUstep, VersionTuple(1,6));
David Chisnall314896c2012-07-04 10:37:03 +00004345 else
4346 runtime = ObjCRuntime(ObjCRuntime::GCC, VersionTuple());
John McCall5fb5df92012-06-20 06:18:46 +00004347 }
4348
4349 cmdArgs.push_back(args.MakeArgString(
4350 "-fobjc-runtime=" + runtime.getAsString()));
4351 return runtime;
4352}
4353
Hans Wennborg75958c42013-08-08 00:17:41 +00004354void Clang::AddClangCLArgs(const ArgList &Args, ArgStringList &CmdArgs) const {
4355 unsigned RTOptionID = options::OPT__SLASH_MT;
4356
Hans Wennborgf1a74252013-09-10 20:18:04 +00004357 if (Args.hasArg(options::OPT__SLASH_LDd))
4358 // The /LDd option implies /MTd. The dependent lib part can be overridden,
4359 // but defining _DEBUG is sticky.
4360 RTOptionID = options::OPT__SLASH_MTd;
4361
Hans Wennborg9cb7d9ba2013-09-18 22:26:39 +00004362 if (Arg *A = Args.getLastArg(options::OPT__SLASH_M_Group))
Hans Wennborg75958c42013-08-08 00:17:41 +00004363 RTOptionID = A->getOption().getID();
Hans Wennborgd9ad0682013-09-11 16:38:41 +00004364
Hans Wennborg75958c42013-08-08 00:17:41 +00004365 switch(RTOptionID) {
4366 case options::OPT__SLASH_MD:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004367 if (Args.hasArg(options::OPT__SLASH_LDd))
4368 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004369 CmdArgs.push_back("-D_MT");
4370 CmdArgs.push_back("-D_DLL");
4371 CmdArgs.push_back("--dependent-lib=msvcrt");
4372 break;
4373 case options::OPT__SLASH_MDd:
4374 CmdArgs.push_back("-D_DEBUG");
4375 CmdArgs.push_back("-D_MT");
4376 CmdArgs.push_back("-D_DLL");
4377 CmdArgs.push_back("--dependent-lib=msvcrtd");
4378 break;
4379 case options::OPT__SLASH_MT:
Hans Wennborgf1a74252013-09-10 20:18:04 +00004380 if (Args.hasArg(options::OPT__SLASH_LDd))
4381 CmdArgs.push_back("-D_DEBUG");
Hans Wennborg75958c42013-08-08 00:17:41 +00004382 CmdArgs.push_back("-D_MT");
4383 CmdArgs.push_back("--dependent-lib=libcmt");
4384 break;
4385 case options::OPT__SLASH_MTd:
4386 CmdArgs.push_back("-D_DEBUG");
4387 CmdArgs.push_back("-D_MT");
4388 CmdArgs.push_back("--dependent-lib=libcmtd");
4389 break;
4390 default:
4391 llvm_unreachable("Unexpected option ID.");
4392 }
4393
Reid Kleckner6beca0e2013-08-08 19:33:10 +00004394 // This provides POSIX compatibility (maps 'open' to '_open'), which most
4395 // users want. The /Za flag to cl.exe turns this off, but it's not
4396 // implemented in clang.
4397 CmdArgs.push_back("--dependent-lib=oldnames");
Hans Wennborg614f7072013-08-08 19:54:30 +00004398
Hans Wennborg0fd62072013-08-09 00:32:23 +00004399 if (Arg *A = Args.getLastArg(options::OPT_show_includes))
4400 A->render(Args, CmdArgs);
Hans Wennborg81f74482013-09-10 01:07:07 +00004401
Hans Wennborg7b0dcef2014-02-25 18:36:22 +00004402 // RTTI is currently not supported, so disable it by default.
4403 if (!Args.hasArg(options::OPT_frtti, options::OPT_fno_rtti))
4404 CmdArgs.push_back("-fno-rtti");
4405
Hans Wennborge50cec32014-06-13 20:59:54 +00004406 // /EP should expand to -E -P.
4407 if (Args.hasArg(options::OPT__SLASH_EP)) {
4408 CmdArgs.push_back("-E");
4409 CmdArgs.push_back("-P");
4410 }
4411
David Majnemer86c318f2014-02-11 21:05:00 +00004412 const Driver &D = getToolChain().getDriver();
4413 Arg *MostGeneralArg = Args.getLastArg(options::OPT__SLASH_vmg);
4414 Arg *BestCaseArg = Args.getLastArg(options::OPT__SLASH_vmb);
4415 if (MostGeneralArg && BestCaseArg)
4416 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4417 << MostGeneralArg->getAsString(Args) << BestCaseArg->getAsString(Args);
4418
4419 if (MostGeneralArg) {
4420 Arg *SingleArg = Args.getLastArg(options::OPT__SLASH_vms);
4421 Arg *MultipleArg = Args.getLastArg(options::OPT__SLASH_vmm);
4422 Arg *VirtualArg = Args.getLastArg(options::OPT__SLASH_vmv);
4423
4424 Arg *FirstConflict = SingleArg ? SingleArg : MultipleArg;
4425 Arg *SecondConflict = VirtualArg ? VirtualArg : MultipleArg;
4426 if (FirstConflict && SecondConflict && FirstConflict != SecondConflict)
4427 D.Diag(clang::diag::err_drv_argument_not_allowed_with)
4428 << FirstConflict->getAsString(Args)
4429 << SecondConflict->getAsString(Args);
4430
4431 if (SingleArg)
4432 CmdArgs.push_back("-fms-memptr-rep=single");
4433 else if (MultipleArg)
4434 CmdArgs.push_back("-fms-memptr-rep=multiple");
4435 else
4436 CmdArgs.push_back("-fms-memptr-rep=virtual");
4437 }
4438
Reid Klecknerc0dca6d2014-02-12 23:50:26 +00004439 if (Arg *A = Args.getLastArg(options::OPT_vtordisp_mode_EQ))
4440 A->render(Args, CmdArgs);
4441
Hans Wennborg81f74482013-09-10 01:07:07 +00004442 if (!Args.hasArg(options::OPT_fdiagnostics_format_EQ)) {
4443 CmdArgs.push_back("-fdiagnostics-format");
Hans Wennborgf4aee182013-09-24 00:08:55 +00004444 if (Args.hasArg(options::OPT__SLASH_fallback))
4445 CmdArgs.push_back("msvc-fallback");
4446 else
4447 CmdArgs.push_back("msvc");
Hans Wennborg81f74482013-09-10 01:07:07 +00004448 }
Hans Wennborg75958c42013-08-08 00:17:41 +00004449}
4450
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004451void ClangAs::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004452 const InputInfo &Output,
4453 const InputInfoList &Inputs,
4454 const ArgList &Args,
4455 const char *LinkingOutput) const {
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004456 ArgStringList CmdArgs;
4457
4458 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
4459 const InputInfo &Input = Inputs[0];
4460
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004461 // Don't warn about "clang -w -c foo.s"
4462 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad95a8122011-03-01 05:25:27 +00004463 // and "clang -emit-llvm -c foo.s"
4464 Args.ClaimAllArgs(options::OPT_emit_llvm);
Rafael Espindolacfaadda2010-11-17 22:13:25 +00004465
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004466 // Invoke ourselves in -cc1as mode.
4467 //
4468 // FIXME: Implement custom jobs for internal actions.
4469 CmdArgs.push_back("-cc1as");
4470
4471 // Add the "effective" target triple.
4472 CmdArgs.push_back("-triple");
Chad Rosierd3a0f952011-09-20 20:44:06 +00004473 std::string TripleStr =
4474 getToolChain().ComputeEffectiveClangTriple(Args, Input.getType());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004475 CmdArgs.push_back(Args.MakeArgString(TripleStr));
4476
4477 // Set the output mode, we currently only expect to be used as a real
4478 // assembler.
4479 CmdArgs.push_back("-filetype");
4480 CmdArgs.push_back("obj");
4481
Eric Christopher45f2e712012-12-18 00:31:10 +00004482 // Set the main file name, so that debug info works even with
4483 // -save-temps or preprocessed assembly.
4484 CmdArgs.push_back("-main-file-name");
4485 CmdArgs.push_back(Clang::getBaseInputName(Args, Inputs));
4486
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004487 // Add the target cpu
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004488 const llvm::Triple &Triple = getToolChain().getTriple();
4489 std::string CPU = getCPUName(Args, Triple);
Rafael Espindola22ce34a2013-08-20 22:12:08 +00004490 if (!CPU.empty()) {
4491 CmdArgs.push_back("-target-cpu");
4492 CmdArgs.push_back(Args.MakeArgString(CPU));
4493 }
4494
Rafael Espindola28e1f4b2013-08-21 16:39:20 +00004495 // Add the target features
4496 const Driver &D = getToolChain().getDriver();
Rafael Espindola9c6fb0f2013-11-23 14:36:40 +00004497 getTargetFeatures(D, Triple, Args, CmdArgs, true);
Jim Grosbach576452b2012-02-10 20:37:10 +00004498
Daniel Dunbar1d733e22011-03-17 17:37:29 +00004499 // Ignore explicit -force_cpusubtype_ALL option.
4500 (void) Args.hasArg(options::OPT_force__cpusubtype__ALL);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004501
Eric Christopherfc3ee562012-01-10 00:38:01 +00004502 // Determine the original source input.
4503 const Action *SourceAction = &JA;
4504 while (SourceAction->getKind() != Action::InputClass) {
4505 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
4506 SourceAction = SourceAction->getInputs()[0];
4507 }
4508
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004509 // Forward -g and handle debug info related flags, assuming we are dealing
4510 // with an actual assembly file.
Eric Christopherfc3ee562012-01-10 00:38:01 +00004511 if (SourceAction->getType() == types::TY_Asm ||
4512 SourceAction->getType() == types::TY_PP_Asm) {
4513 Args.ClaimAllArgs(options::OPT_g_Group);
4514 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
4515 if (!A->getOption().matches(options::OPT_g0))
4516 CmdArgs.push_back("-g");
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004517
Oliver Stannard9b2a7d42014-05-19 13:39:13 +00004518 if (Args.hasArg(options::OPT_gdwarf_2))
4519 CmdArgs.push_back("-gdwarf-2");
4520 if (Args.hasArg(options::OPT_gdwarf_3))
4521 CmdArgs.push_back("-gdwarf-3");
4522 if (Args.hasArg(options::OPT_gdwarf_4))
4523 CmdArgs.push_back("-gdwarf-4");
4524
Chandler Carruth4d5e1a92012-12-17 21:40:04 +00004525 // Add the -fdebug-compilation-dir flag if needed.
4526 addDebugCompDirArg(Args, CmdArgs);
Kevin Enderbyae2ec472013-01-17 21:38:06 +00004527
4528 // Set the AT_producer to the clang version when using the integrated
4529 // assembler on assembly source files.
4530 CmdArgs.push_back("-dwarf-debug-producer");
4531 CmdArgs.push_back(Args.MakeArgString(getClangFullVersion()));
Eric Christopherfc3ee562012-01-10 00:38:01 +00004532 }
Kevin Enderby292dc082011-12-22 19:31:58 +00004533
4534 // Optionally embed the -cc1as level arguments into the debug info, for build
4535 // analysis.
4536 if (getToolChain().UseDwarfDebugFlags()) {
4537 ArgStringList OriginalArgs;
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004538 for (const auto &Arg : Args)
4539 Arg->render(Args, OriginalArgs);
Kevin Enderby292dc082011-12-22 19:31:58 +00004540
Dylan Noblesmith2c1dd272012-02-05 02:13:05 +00004541 SmallString<256> Flags;
Kevin Enderby292dc082011-12-22 19:31:58 +00004542 const char *Exec = getToolChain().getDriver().getClangProgramPath();
4543 Flags += Exec;
4544 for (unsigned i = 0, e = OriginalArgs.size(); i != e; ++i) {
4545 Flags += " ";
4546 Flags += OriginalArgs[i];
4547 }
4548 CmdArgs.push_back("-dwarf-debug-flags");
4549 CmdArgs.push_back(Args.MakeArgString(Flags.str()));
4550 }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004551
4552 // FIXME: Add -static support, once we have it.
4553
David Blaikie372d9502014-01-17 03:17:40 +00004554 // Consume all the warning flags. Usually this would be handled more
4555 // gracefully by -cc1 (warning about unknown warning flags, etc) but -cc1as
4556 // doesn't handle that so rather than warning about unused flags that are
4557 // actually used, we'll lie by omission instead.
4558 // FIXME: Stop lying and consume only the appropriate driver flags
4559 for (arg_iterator it = Args.filtered_begin(options::OPT_W_Group),
4560 ie = Args.filtered_end();
4561 it != ie; ++it)
4562 (*it)->claim();
4563
David Blaikie9260ed62013-07-25 21:19:01 +00004564 CollectArgsForIntegratedAssembler(C, Args, CmdArgs,
4565 getToolChain().getDriver());
4566
Daniel Dunbar252e8f92011-04-29 17:53:18 +00004567 Args.AddAllArgs(CmdArgs, options::OPT_mllvm);
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004568
4569 assert(Output.isFilename() && "Unexpected lipo output.");
4570 CmdArgs.push_back("-o");
4571 CmdArgs.push_back(Output.getFilename());
4572
Daniel Dunbarb440f562010-08-02 02:38:21 +00004573 assert(Input.isFilename() && "Invalid input.");
4574 CmdArgs.push_back(Input.getFilename());
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004575
Daniel Dunbarb31b76f2010-07-18 21:16:15 +00004576 const char *Exec = getToolChain().getDriver().getClangProgramPath();
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004577 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christophera75018a2013-04-10 21:30:40 +00004578
4579 // Handle the debug info splitting at object creation time if we're
4580 // creating an object.
4581 // TODO: Currently only works on linux with newer objcopy.
4582 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00004583 getToolChain().getTriple().isOSLinux())
Eric Christophera75018a2013-04-10 21:30:40 +00004584 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
4585 SplitDebugName(Args, Inputs));
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +00004586}
4587
Daniel Dunbara3246a02009-03-18 08:07:30 +00004588void gcc::Common::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004589 const InputInfo &Output,
4590 const InputInfoList &Inputs,
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004591 const ArgList &Args,
Daniel Dunbara3246a02009-03-18 08:07:30 +00004592 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00004593 const Driver &D = getToolChain().getDriver();
Daniel Dunbara3246a02009-03-18 08:07:30 +00004594 ArgStringList CmdArgs;
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004595
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004596 for (const auto &A : Args) {
Michael J. Spencer66e2b202012-10-19 22:37:06 +00004597 if (forwardToGCC(A->getOption())) {
Daniel Dunbar939c1212010-08-03 16:14:14 +00004598 // Don't forward any -g arguments to assembly steps.
4599 if (isa<AssembleJobAction>(JA) &&
4600 A->getOption().matches(options::OPT_g_Group))
4601 continue;
4602
NAKAMURA Takumi053704f2013-08-19 11:51:51 +00004603 // Don't forward any -W arguments to assembly and link steps.
4604 if ((isa<AssembleJobAction>(JA) || isa<LinkJobAction>(JA)) &&
4605 A->getOption().matches(options::OPT_W_Group))
4606 continue;
4607
Daniel Dunbar2da02722009-03-19 07:55:12 +00004608 // It is unfortunate that we have to claim here, as this means
4609 // we will basically never report anything interesting for
Daniel Dunbar5716d872009-05-02 21:41:52 +00004610 // platforms using a generic gcc, even if we are just using gcc
4611 // to get to the assembler.
Daniel Dunbar2da02722009-03-19 07:55:12 +00004612 A->claim();
Daniel Dunbara2aedc62009-03-18 10:01:51 +00004613 A->render(Args, CmdArgs);
Daniel Dunbar2da02722009-03-19 07:55:12 +00004614 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004615 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004616
Daniel Dunbar4e295052010-01-25 22:35:08 +00004617 RenderExtraToolArgs(JA, CmdArgs);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004618
4619 // If using a driver driver, force the arch.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004620 llvm::Triple::ArchType Arch = getToolChain().getArch();
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00004621 if (getToolChain().getTriple().isOSDarwin()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004622 CmdArgs.push_back("-arch");
Daniel Dunbar0a05d932009-04-01 20:33:11 +00004623
4624 // FIXME: Remove these special cases.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004625 if (Arch == llvm::Triple::ppc)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004626 CmdArgs.push_back("ppc");
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004627 else if (Arch == llvm::Triple::ppc64)
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004628 CmdArgs.push_back("ppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00004629 else if (Arch == llvm::Triple::ppc64le)
4630 CmdArgs.push_back("ppc64le");
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004631 else
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004632 CmdArgs.push_back(Args.MakeArgString(getToolChain().getArchName()));
Daniel Dunbara3246a02009-03-18 08:07:30 +00004633 }
4634
Daniel Dunbar5716d872009-05-02 21:41:52 +00004635 // Try to force gcc to match the tool chain we want, if we recognize
4636 // the arch.
Daniel Dunbar5bbebfe2009-05-22 02:21:04 +00004637 //
4638 // FIXME: The triple class should directly provide the information we want
4639 // here.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00004640 if (Arch == llvm::Triple::x86 || Arch == llvm::Triple::ppc)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004641 CmdArgs.push_back("-m32");
Bill Schmidt778d3872013-07-26 01:36:11 +00004642 else if (Arch == llvm::Triple::x86_64 || Arch == llvm::Triple::ppc64 ||
4643 Arch == llvm::Triple::ppc64le)
Daniel Dunbar5716d872009-05-02 21:41:52 +00004644 CmdArgs.push_back("-m64");
4645
Daniel Dunbarb440f562010-08-02 02:38:21 +00004646 if (Output.isFilename()) {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004647 CmdArgs.push_back("-o");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004648 CmdArgs.push_back(Output.getFilename());
4649 } else {
4650 assert(Output.isNothing() && "Unexpected output");
Daniel Dunbara3246a02009-03-18 08:07:30 +00004651 CmdArgs.push_back("-fsyntax-only");
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004652 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004653
Tony Linthicum76329bf2011-12-12 21:14:55 +00004654 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4655 options::OPT_Xassembler);
Daniel Dunbara3246a02009-03-18 08:07:30 +00004656
4657 // Only pass -x if gcc will understand it; otherwise hope gcc
4658 // understands the suffix correctly. The main use case this would go
4659 // wrong in is for linker inputs if they happened to have an odd
4660 // suffix; really the only way to get this to happen is a command
4661 // like '-x foobar a.c' which will treat a.c like a linker input.
4662 //
4663 // FIXME: For the linker case specifically, can we safely convert
4664 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004665 for (const auto &II : Inputs) {
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004666 // Don't try to pass LLVM or AST inputs to a generic gcc.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004667 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4668 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004669 D.Diag(diag::err_drv_no_linker_llvm_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004670 << getToolChain().getTripleString();
Daniel Dunbar6cdf83c2009-09-01 16:57:46 +00004671 else if (II.getType() == types::TY_AST)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004672 D.Diag(diag::err_drv_no_ast_support)
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00004673 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004674 else if (II.getType() == types::TY_ModuleFile)
4675 D.Diag(diag::err_drv_no_module_support)
4676 << getToolChain().getTripleString();
Daniel Dunbare3e263f2009-05-02 20:14:53 +00004677
Daniel Dunbara3246a02009-03-18 08:07:30 +00004678 if (types::canTypeBeUserSpecified(II.getType())) {
4679 CmdArgs.push_back("-x");
4680 CmdArgs.push_back(types::getTypeName(II.getType()));
4681 }
4682
Daniel Dunbarb440f562010-08-02 02:38:21 +00004683 if (II.isFilename())
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004684 CmdArgs.push_back(II.getFilename());
Daniel Dunbarf2476752010-09-25 18:10:05 +00004685 else {
4686 const Arg &A = II.getInputArg();
4687
4688 // Reverse translate some rewritten options.
4689 if (A.getOption().matches(options::OPT_Z_reserved_lib_stdcxx)) {
4690 CmdArgs.push_back("-lstdc++");
4691 continue;
4692 }
4693
Daniel Dunbar5cdf3e02009-03-19 07:29:38 +00004694 // Don't render as input, we need gcc to do the translations.
Daniel Dunbarf2476752010-09-25 18:10:05 +00004695 A.render(Args, CmdArgs);
4696 }
Daniel Dunbara3246a02009-03-18 08:07:30 +00004697 }
4698
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004699 const std::string customGCCName = D.getCCCGenericGCCName();
4700 const char *GCCName;
4701 if (!customGCCName.empty())
4702 GCCName = customGCCName.c_str();
Hans Wennborg70850d82013-07-18 20:29:38 +00004703 else if (D.CCCIsCXX()) {
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004704 GCCName = "g++";
Dylan Noblesmith70e73a32011-04-09 13:31:59 +00004705 } else
4706 GCCName = "gcc";
4707
Daniel Dunbard067f7f2009-04-08 23:54:23 +00004708 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00004709 Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00004710 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004711}
4712
Daniel Dunbar4e295052010-01-25 22:35:08 +00004713void gcc::Preprocess::RenderExtraToolArgs(const JobAction &JA,
4714 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004715 CmdArgs.push_back("-E");
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004716}
4717
Daniel Dunbar4e295052010-01-25 22:35:08 +00004718void gcc::Compile::RenderExtraToolArgs(const JobAction &JA,
4719 ArgStringList &CmdArgs) const {
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004720 const Driver &D = getToolChain().getDriver();
4721
Daniel Dunbar4e295052010-01-25 22:35:08 +00004722 // If -flto, etc. are present then make sure not to force assembly output.
Daniel Dunbar24e52992010-06-07 23:28:45 +00004723 if (JA.getType() == types::TY_LLVM_IR || JA.getType() == types::TY_LTO_IR ||
4724 JA.getType() == types::TY_LLVM_BC || JA.getType() == types::TY_LTO_BC)
Daniel Dunbar4e295052010-01-25 22:35:08 +00004725 CmdArgs.push_back("-c");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004726 else {
4727 if (JA.getType() != types::TY_PP_Asm)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00004728 D.Diag(diag::err_drv_invalid_gcc_output_type)
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004729 << getTypeName(JA.getType());
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00004730
Daniel Dunbar4e295052010-01-25 22:35:08 +00004731 CmdArgs.push_back("-S");
Daniel Dunbaraeea8ac2010-02-11 03:16:21 +00004732 }
Daniel Dunbar1a093d22009-03-18 06:00:36 +00004733}
4734
Daniel Dunbar4e295052010-01-25 22:35:08 +00004735void gcc::Link::RenderExtraToolArgs(const JobAction &JA,
4736 ArgStringList &CmdArgs) const {
Daniel Dunbara3246a02009-03-18 08:07:30 +00004737 // The types are (hopefully) good enough.
4738}
4739
Tony Linthicum76329bf2011-12-12 21:14:55 +00004740// Hexagon tools start.
4741void hexagon::Assemble::RenderExtraToolArgs(const JobAction &JA,
4742 ArgStringList &CmdArgs) const {
4743
4744}
4745void hexagon::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
4746 const InputInfo &Output,
4747 const InputInfoList &Inputs,
4748 const ArgList &Args,
4749 const char *LinkingOutput) const {
4750
4751 const Driver &D = getToolChain().getDriver();
4752 ArgStringList CmdArgs;
4753
4754 std::string MarchString = "-march=";
Matthew Curtisf10a5952012-12-06 14:16:43 +00004755 MarchString += toolchains::Hexagon_TC::GetTargetCPU(Args);
Tony Linthicum76329bf2011-12-12 21:14:55 +00004756 CmdArgs.push_back(Args.MakeArgString(MarchString));
4757
4758 RenderExtraToolArgs(JA, CmdArgs);
4759
4760 if (Output.isFilename()) {
4761 CmdArgs.push_back("-o");
4762 CmdArgs.push_back(Output.getFilename());
4763 } else {
4764 assert(Output.isNothing() && "Unexpected output");
4765 CmdArgs.push_back("-fsyntax-only");
4766 }
4767
Matthew Curtise8f80a12012-12-06 17:49:03 +00004768 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4769 if (!SmallDataThreshold.empty())
4770 CmdArgs.push_back(
4771 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004772
Matthew Curtise5df3812012-12-07 17:23:04 +00004773 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
4774 options::OPT_Xassembler);
4775
Tony Linthicum76329bf2011-12-12 21:14:55 +00004776 // Only pass -x if gcc will understand it; otherwise hope gcc
4777 // understands the suffix correctly. The main use case this would go
4778 // wrong in is for linker inputs if they happened to have an odd
4779 // suffix; really the only way to get this to happen is a command
4780 // like '-x foobar a.c' which will treat a.c like a linker input.
4781 //
4782 // FIXME: For the linker case specifically, can we safely convert
4783 // inputs into '-Wl,' options?
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004784 for (const auto &II : Inputs) {
Tony Linthicum76329bf2011-12-12 21:14:55 +00004785 // Don't try to pass LLVM or AST inputs to a generic gcc.
4786 if (II.getType() == types::TY_LLVM_IR || II.getType() == types::TY_LTO_IR ||
4787 II.getType() == types::TY_LLVM_BC || II.getType() == types::TY_LTO_BC)
4788 D.Diag(clang::diag::err_drv_no_linker_llvm_support)
4789 << getToolChain().getTripleString();
4790 else if (II.getType() == types::TY_AST)
4791 D.Diag(clang::diag::err_drv_no_ast_support)
4792 << getToolChain().getTripleString();
Douglas Gregorbf7fc9c2013-03-27 16:47:18 +00004793 else if (II.getType() == types::TY_ModuleFile)
4794 D.Diag(diag::err_drv_no_module_support)
4795 << getToolChain().getTripleString();
Tony Linthicum76329bf2011-12-12 21:14:55 +00004796
4797 if (II.isFilename())
4798 CmdArgs.push_back(II.getFilename());
4799 else
4800 // Don't render as input, we need gcc to do the translations. FIXME: Pranav: What is this ?
4801 II.getInputArg().render(Args, CmdArgs);
4802 }
4803
4804 const char *GCCName = "hexagon-as";
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004805 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath(GCCName));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004806 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004807}
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004808
Tony Linthicum76329bf2011-12-12 21:14:55 +00004809void hexagon::Link::RenderExtraToolArgs(const JobAction &JA,
4810 ArgStringList &CmdArgs) const {
4811 // The types are (hopefully) good enough.
4812}
4813
4814void hexagon::Link::ConstructJob(Compilation &C, const JobAction &JA,
4815 const InputInfo &Output,
4816 const InputInfoList &Inputs,
4817 const ArgList &Args,
4818 const char *LinkingOutput) const {
4819
Matthew Curtise689b052012-12-06 15:46:07 +00004820 const toolchains::Hexagon_TC& ToolChain =
4821 static_cast<const toolchains::Hexagon_TC&>(getToolChain());
4822 const Driver &D = ToolChain.getDriver();
4823
Tony Linthicum76329bf2011-12-12 21:14:55 +00004824 ArgStringList CmdArgs;
4825
Matthew Curtise689b052012-12-06 15:46:07 +00004826 //----------------------------------------------------------------------------
4827 //
4828 //----------------------------------------------------------------------------
4829 bool hasStaticArg = Args.hasArg(options::OPT_static);
4830 bool buildingLib = Args.hasArg(options::OPT_shared);
Matthew Curtise8f80a12012-12-06 17:49:03 +00004831 bool buildPIE = Args.hasArg(options::OPT_pie);
Matthew Curtise689b052012-12-06 15:46:07 +00004832 bool incStdLib = !Args.hasArg(options::OPT_nostdlib);
4833 bool incStartFiles = !Args.hasArg(options::OPT_nostartfiles);
4834 bool incDefLibs = !Args.hasArg(options::OPT_nodefaultlibs);
4835 bool useShared = buildingLib && !hasStaticArg;
Tony Linthicum76329bf2011-12-12 21:14:55 +00004836
Matthew Curtise689b052012-12-06 15:46:07 +00004837 //----------------------------------------------------------------------------
4838 // Silence warnings for various options
4839 //----------------------------------------------------------------------------
Tony Linthicum76329bf2011-12-12 21:14:55 +00004840
Matthew Curtise689b052012-12-06 15:46:07 +00004841 Args.ClaimAllArgs(options::OPT_g_Group);
4842 Args.ClaimAllArgs(options::OPT_emit_llvm);
4843 Args.ClaimAllArgs(options::OPT_w); // Other warning options are already
4844 // handled somewhere else.
4845 Args.ClaimAllArgs(options::OPT_static_libgcc);
4846
4847 //----------------------------------------------------------------------------
4848 //
4849 //----------------------------------------------------------------------------
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004850 for (const auto &Opt : ToolChain.ExtraOpts)
4851 CmdArgs.push_back(Opt.c_str());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004852
Matthew Curtisf10a5952012-12-06 14:16:43 +00004853 std::string MarchString = toolchains::Hexagon_TC::GetTargetCPU(Args);
4854 CmdArgs.push_back(Args.MakeArgString("-m" + MarchString));
Sebastian Pop86500282012-01-13 20:37:10 +00004855
Matthew Curtise689b052012-12-06 15:46:07 +00004856 if (buildingLib) {
4857 CmdArgs.push_back("-shared");
4858 CmdArgs.push_back("-call_shared"); // should be the default, but doing as
4859 // hexagon-gcc does
Tony Linthicum76329bf2011-12-12 21:14:55 +00004860 }
4861
Matthew Curtise689b052012-12-06 15:46:07 +00004862 if (hasStaticArg)
4863 CmdArgs.push_back("-static");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004864
Matthew Curtise8f80a12012-12-06 17:49:03 +00004865 if (buildPIE && !buildingLib)
4866 CmdArgs.push_back("-pie");
4867
4868 std::string SmallDataThreshold = GetHexagonSmallDataThresholdValue(Args);
4869 if (!SmallDataThreshold.empty()) {
4870 CmdArgs.push_back(
4871 Args.MakeArgString(std::string("-G") + SmallDataThreshold));
4872 }
4873
Matthew Curtise689b052012-12-06 15:46:07 +00004874 //----------------------------------------------------------------------------
4875 //
4876 //----------------------------------------------------------------------------
4877 CmdArgs.push_back("-o");
4878 CmdArgs.push_back(Output.getFilename());
Tony Linthicum76329bf2011-12-12 21:14:55 +00004879
Matthew Curtise689b052012-12-06 15:46:07 +00004880 const std::string MarchSuffix = "/" + MarchString;
4881 const std::string G0Suffix = "/G0";
4882 const std::string MarchG0Suffix = MarchSuffix + G0Suffix;
4883 const std::string RootDir = toolchains::Hexagon_TC::GetGnuDir(D.InstalledDir)
4884 + "/";
4885 const std::string StartFilesDir = RootDir
4886 + "hexagon/lib"
4887 + (buildingLib
4888 ? MarchG0Suffix : MarchSuffix);
4889
4890 //----------------------------------------------------------------------------
4891 // moslib
4892 //----------------------------------------------------------------------------
4893 std::vector<std::string> oslibs;
4894 bool hasStandalone= false;
4895
4896 for (arg_iterator it = Args.filtered_begin(options::OPT_moslib_EQ),
4897 ie = Args.filtered_end(); it != ie; ++it) {
4898 (*it)->claim();
4899 oslibs.push_back((*it)->getValue());
4900 hasStandalone = hasStandalone || (oslibs.back() == "standalone");
Tony Linthicum76329bf2011-12-12 21:14:55 +00004901 }
Matthew Curtise689b052012-12-06 15:46:07 +00004902 if (oslibs.empty()) {
4903 oslibs.push_back("standalone");
4904 hasStandalone = true;
4905 }
Tony Linthicum76329bf2011-12-12 21:14:55 +00004906
Matthew Curtise689b052012-12-06 15:46:07 +00004907 //----------------------------------------------------------------------------
4908 // Start Files
4909 //----------------------------------------------------------------------------
4910 if (incStdLib && incStartFiles) {
4911
4912 if (!buildingLib) {
4913 if (hasStandalone) {
4914 CmdArgs.push_back(
4915 Args.MakeArgString(StartFilesDir + "/crt0_standalone.o"));
4916 }
4917 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + "/crt0.o"));
4918 }
4919 std::string initObj = useShared ? "/initS.o" : "/init.o";
4920 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + initObj));
4921 }
4922
4923 //----------------------------------------------------------------------------
4924 // Library Search Paths
4925 //----------------------------------------------------------------------------
4926 const ToolChain::path_list &LibPaths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00004927 for (const auto &LibPath : LibPaths)
4928 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + LibPath));
Matthew Curtise689b052012-12-06 15:46:07 +00004929
4930 //----------------------------------------------------------------------------
4931 //
4932 //----------------------------------------------------------------------------
4933 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
4934 Args.AddAllArgs(CmdArgs, options::OPT_e);
4935 Args.AddAllArgs(CmdArgs, options::OPT_s);
4936 Args.AddAllArgs(CmdArgs, options::OPT_t);
4937 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
4938
4939 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
4940
4941 //----------------------------------------------------------------------------
4942 // Libraries
4943 //----------------------------------------------------------------------------
4944 if (incStdLib && incDefLibs) {
Hans Wennborg70850d82013-07-18 20:29:38 +00004945 if (D.CCCIsCXX()) {
Matthew Curtise689b052012-12-06 15:46:07 +00004946 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
4947 CmdArgs.push_back("-lm");
4948 }
4949
4950 CmdArgs.push_back("--start-group");
4951
4952 if (!buildingLib) {
4953 for(std::vector<std::string>::iterator i = oslibs.begin(),
4954 e = oslibs.end(); i != e; ++i)
4955 CmdArgs.push_back(Args.MakeArgString("-l" + *i));
4956 CmdArgs.push_back("-lc");
4957 }
4958 CmdArgs.push_back("-lgcc");
4959
4960 CmdArgs.push_back("--end-group");
4961 }
4962
4963 //----------------------------------------------------------------------------
4964 // End files
4965 //----------------------------------------------------------------------------
4966 if (incStdLib && incStartFiles) {
4967 std::string finiObj = useShared ? "/finiS.o" : "/fini.o";
4968 CmdArgs.push_back(Args.MakeArgString(StartFilesDir + finiObj));
4969 }
4970
4971 std::string Linker = ToolChain.GetProgramPath("hexagon-ld");
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00004972 C.addCommand(new Command(JA, *this, Args.MakeArgString(Linker), CmdArgs));
Tony Linthicum76329bf2011-12-12 21:14:55 +00004973}
4974// Hexagon tools end.
4975
Bernard Ogden31561762013-12-12 13:27:11 +00004976/// getARMCPUForMArch - Get the (LLVM) name of the minimum ARM CPU for the arch we are targeting
4977//
4978// FIXME: tblgen this.
4979const char *arm::getARMCPUForMArch(const ArgList &Args,
4980 const llvm::Triple &Triple) {
4981 StringRef MArch;
4982 if (Arg *A = Args.getLastArg(options::OPT_march_EQ)) {
4983 // Otherwise, if we have -march= choose the base CPU for that arch.
4984 MArch = A->getValue();
4985 } else {
4986 // Otherwise, use the Arch from the triple.
4987 MArch = Triple.getArchName();
4988 }
4989
4990 // Handle -march=native.
Bernard Ogden31561762013-12-12 13:27:11 +00004991 if (MArch == "native") {
4992 std::string CPU = llvm::sys::getHostCPUName();
4993 if (CPU != "generic") {
4994 // Translate the native cpu into the architecture. The switch below will
4995 // then chose the minimum cpu for that arch.
Bernard Ogdenf6ba17d2013-12-12 13:27:15 +00004996 MArch = std::string("arm") + arm::getLLVMArchSuffixForARM(CPU);
Bernard Ogden31561762013-12-12 13:27:11 +00004997 }
4998 }
4999
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005000 switch (Triple.getOS()) {
5001 case llvm::Triple::NetBSD:
Bernard Ogden31561762013-12-12 13:27:11 +00005002 if (MArch == "armv6")
5003 return "arm1176jzf-s";
Saleem Abdulrasoolf4c9e492014-04-04 20:31:19 +00005004 break;
5005 case llvm::Triple::Win32:
5006 // FIXME: this is invalid for WindowsCE
5007 return "cortex-a9";
5008 default:
5009 break;
Bernard Ogden31561762013-12-12 13:27:11 +00005010 }
5011
Christian Pirker918d1092014-05-05 08:48:18 +00005012 const char *result = nullptr;
5013 size_t offset = StringRef::npos;
5014 if (MArch.startswith("arm"))
5015 offset = 3;
5016 if (MArch.startswith("thumb"))
5017 offset = 5;
5018 if (offset != StringRef::npos && MArch.substr(offset, 2) == "eb")
5019 offset += 2;
5020 if (offset != StringRef::npos)
5021 result = llvm::StringSwitch<const char *>(MArch.substr(offset))
5022 .Cases("v2", "v2a", "arm2")
5023 .Case("v3", "arm6")
5024 .Case("v3m", "arm7m")
5025 .Case("v4", "strongarm")
5026 .Case("v4t", "arm7tdmi")
5027 .Cases("v5", "v5t", "arm10tdmi")
5028 .Cases("v5e", "v5te", "arm1022e")
5029 .Case("v5tej", "arm926ej-s")
5030 .Cases("v6", "v6k", "arm1136jf-s")
5031 .Case("v6j", "arm1136j-s")
5032 .Cases("v6z", "v6zk", "arm1176jzf-s")
5033 .Case("v6t2", "arm1156t2-s")
5034 .Cases("v6m", "v6-m", "cortex-m0")
5035 .Cases("v7", "v7a", "v7-a", "v7l", "v7-l", "cortex-a8")
5036 .Cases("v7s", "v7-s", "swift")
5037 .Cases("v7r", "v7-r", "cortex-r4")
5038 .Cases("v7m", "v7-m", "cortex-m3")
5039 .Cases("v7em", "v7e-m", "cortex-m4")
5040 .Cases("v8", "v8a", "v8-a", "cortex-a53")
5041 .Default(nullptr);
5042 else
5043 result = llvm::StringSwitch<const char *>(MArch)
5044 .Case("ep9312", "ep9312")
5045 .Case("iwmmxt", "iwmmxt")
5046 .Case("xscale", "xscale")
5047 .Default(nullptr);
Bernard Ogden31561762013-12-12 13:27:11 +00005048
5049 if (result)
5050 return result;
5051
Christian Pirker918d1092014-05-05 08:48:18 +00005052 // If all else failed, return the most base CPU with thumb interworking
5053 // supported by LLVM.
5054 // FIXME: Should warn once that we're falling back.
Joerg Sonnenberger695fdb32014-02-21 21:53:33 +00005055 switch (Triple.getOS()) {
5056 case llvm::Triple::NetBSD:
5057 switch (Triple.getEnvironment()) {
5058 case llvm::Triple::GNUEABIHF:
5059 case llvm::Triple::GNUEABI:
5060 case llvm::Triple::EABIHF:
5061 case llvm::Triple::EABI:
5062 return "arm926ej-s";
5063 default:
5064 return "strongarm";
5065 }
5066 default:
5067 switch (Triple.getEnvironment()) {
5068 case llvm::Triple::EABIHF:
5069 case llvm::Triple::GNUEABIHF:
5070 return "arm1176jzf-s";
5071 default:
5072 return "arm7tdmi";
5073 }
5074 }
Bernard Ogden31561762013-12-12 13:27:11 +00005075}
5076
5077/// getARMTargetCPU - Get the (LLVM) name of the ARM cpu we are targeting.
Rafael Espindola80d333b2013-12-12 15:48:19 +00005078StringRef arm::getARMTargetCPU(const ArgList &Args,
5079 const llvm::Triple &Triple) {
Bernard Ogden31561762013-12-12 13:27:11 +00005080 // FIXME: Warn on inconsistent use of -mcpu and -march.
5081 // If we have -mcpu=, use that.
5082 if (Arg *A = Args.getLastArg(options::OPT_mcpu_EQ)) {
5083 StringRef MCPU = A->getValue();
5084 // Handle -mcpu=native.
5085 if (MCPU == "native")
Rafael Espindola9c5ef122013-12-12 15:39:05 +00005086 return llvm::sys::getHostCPUName();
Bernard Ogden31561762013-12-12 13:27:11 +00005087 else
Rafael Espindola80d333b2013-12-12 15:48:19 +00005088 return MCPU;
Bernard Ogden31561762013-12-12 13:27:11 +00005089 }
5090
5091 return getARMCPUForMArch(Args, Triple);
5092}
5093
5094/// getLLVMArchSuffixForARM - Get the LLVM arch name to use for a particular
5095/// CPU.
5096//
5097// FIXME: This is redundant with -mcpu, why does LLVM use this.
5098// FIXME: tblgen this, or kill it!
5099const char *arm::getLLVMArchSuffixForARM(StringRef CPU) {
5100 return llvm::StringSwitch<const char *>(CPU)
5101 .Case("strongarm", "v4")
5102 .Cases("arm7tdmi", "arm7tdmi-s", "arm710t", "v4t")
5103 .Cases("arm720t", "arm9", "arm9tdmi", "v4t")
5104 .Cases("arm920", "arm920t", "arm922t", "v4t")
5105 .Cases("arm940t", "ep9312","v4t")
5106 .Cases("arm10tdmi", "arm1020t", "v5")
5107 .Cases("arm9e", "arm926ej-s", "arm946e-s", "v5e")
5108 .Cases("arm966e-s", "arm968e-s", "arm10e", "v5e")
5109 .Cases("arm1020e", "arm1022e", "xscale", "iwmmxt", "v5e")
5110 .Cases("arm1136j-s", "arm1136jf-s", "arm1176jz-s", "v6")
5111 .Cases("arm1176jzf-s", "mpcorenovfp", "mpcore", "v6")
5112 .Cases("arm1156t2-s", "arm1156t2f-s", "v6t2")
Bob Wilsonb767d152014-01-15 21:43:40 +00005113 .Cases("cortex-a5", "cortex-a7", "cortex-a8", "cortex-a9-mp", "v7")
Bernard Ogden31561762013-12-12 13:27:11 +00005114 .Cases("cortex-a9", "cortex-a12", "cortex-a15", "krait", "v7")
5115 .Cases("cortex-r4", "cortex-r5", "v7r")
5116 .Case("cortex-m0", "v6m")
5117 .Case("cortex-m3", "v7m")
5118 .Case("cortex-m4", "v7em")
Bernard Ogden31561762013-12-12 13:27:11 +00005119 .Case("swift", "v7s")
Tim Northovera2ee4332014-03-29 15:09:45 +00005120 .Case("cyclone", "v8")
Bernard Ogden31561762013-12-12 13:27:11 +00005121 .Cases("cortex-a53", "cortex-a57", "v8")
5122 .Default("");
5123}
5124
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00005125bool mips::hasMipsAbiArg(const ArgList &Args, const char *Value) {
5126 Arg *A = Args.getLastArg(options::OPT_mabi_EQ);
5127 return A && (A->getValue() == StringRef(Value));
5128}
5129
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00005130bool mips::isNaN2008(const ArgList &Args) {
5131 if (Arg *NaNArg = Args.getLastArg(options::OPT_mnan_EQ))
5132 return llvm::StringSwitch<bool>(NaNArg->getValue())
5133 .Case("2008", true)
5134 .Case("legacy", false)
5135 .Default(false);
5136
5137 // NaN2008 is the default for MIPS32r6/MIPS64r6.
5138 if (Arg *CPUArg = Args.getLastArg(options::OPT_mcpu_EQ))
5139 return llvm::StringSwitch<bool>(CPUArg->getValue())
5140 .Cases("mips32r6", "mips64r6", true)
5141 .Default(false);
5142
5143 return false;
5144}
5145
Tim Northover157d9112014-01-16 08:48:16 +00005146llvm::Triple::ArchType darwin::getArchTypeForMachOArchName(StringRef Str) {
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005147 // See arch(3) and llvm-gcc's driver-driver.c. We don't implement support for
5148 // archs which Darwin doesn't use.
5149
5150 // The matching this routine does is fairly pointless, since it is neither the
5151 // complete architecture list, nor a reasonable subset. The problem is that
5152 // historically the driver driver accepts this and also ties its -march=
5153 // handling to the architecture name, so we need to be careful before removing
5154 // support for it.
5155
5156 // This code must be kept in sync with Clang's Darwin specific argument
5157 // translation.
5158
5159 return llvm::StringSwitch<llvm::Triple::ArchType>(Str)
5160 .Cases("ppc", "ppc601", "ppc603", "ppc604", "ppc604e", llvm::Triple::ppc)
5161 .Cases("ppc750", "ppc7400", "ppc7450", "ppc970", llvm::Triple::ppc)
5162 .Case("ppc64", llvm::Triple::ppc64)
5163 .Cases("i386", "i486", "i486SX", "i586", "i686", llvm::Triple::x86)
5164 .Cases("pentium", "pentpro", "pentIIm3", "pentIIm5", "pentium4",
5165 llvm::Triple::x86)
Jim Grosbach82eee262013-11-16 00:53:35 +00005166 .Cases("x86_64", "x86_64h", llvm::Triple::x86_64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005167 // This is derived from the driver driver.
Bob Wilson743bf672013-03-04 22:37:49 +00005168 .Cases("arm", "armv4t", "armv5", "armv6", "armv6m", llvm::Triple::arm)
Bob Wilsonb767d152014-01-15 21:43:40 +00005169 .Cases("armv7", "armv7em", "armv7k", "armv7m", llvm::Triple::arm)
Bob Wilson743bf672013-03-04 22:37:49 +00005170 .Cases("armv7s", "xscale", llvm::Triple::arm)
Tim Northovera2ee4332014-03-29 15:09:45 +00005171 .Case("arm64", llvm::Triple::arm64)
Rafael Espindoladcbf6982012-10-31 18:51:07 +00005172 .Case("r600", llvm::Triple::r600)
5173 .Case("nvptx", llvm::Triple::nvptx)
5174 .Case("nvptx64", llvm::Triple::nvptx64)
5175 .Case("amdil", llvm::Triple::amdil)
5176 .Case("spir", llvm::Triple::spir)
5177 .Default(llvm::Triple::UnknownArch);
5178}
Tony Linthicum76329bf2011-12-12 21:14:55 +00005179
Tim Northover157d9112014-01-16 08:48:16 +00005180void darwin::setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str) {
5181 llvm::Triple::ArchType Arch = getArchTypeForMachOArchName(Str);
5182 T.setArch(Arch);
5183
5184 if (Str == "x86_64h")
5185 T.setArchName(Str);
5186 else if (Str == "armv6m" || Str == "armv7m" || Str == "armv7em") {
5187 T.setOS(llvm::Triple::UnknownOS);
Saleem Abdulrasool29b82b62014-03-06 20:47:19 +00005188 T.setObjectFormat(llvm::Triple::MachO);
Tim Northover157d9112014-01-16 08:48:16 +00005189 }
5190}
5191
Bob Wilsondecc03e2012-11-23 06:14:39 +00005192const char *Clang::getBaseInputName(const ArgList &Args,
5193 const InputInfoList &Inputs) {
Michael J. Spencere1696752010-12-18 00:19:12 +00005194 return Args.MakeArgString(
5195 llvm::sys::path::filename(Inputs[0].getBaseInput()));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005196}
5197
Bob Wilsondecc03e2012-11-23 06:14:39 +00005198const char *Clang::getBaseInputStem(const ArgList &Args,
5199 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005200 const char *Str = getBaseInputName(Args, Inputs);
5201
Chris Lattner906bb902011-01-16 08:14:11 +00005202 if (const char *End = strrchr(Str, '.'))
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005203 return Args.MakeArgString(std::string(Str, End));
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005204
5205 return Str;
5206}
5207
Bob Wilsondecc03e2012-11-23 06:14:39 +00005208const char *Clang::getDependencyFileName(const ArgList &Args,
5209 const InputInfoList &Inputs) {
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005210 // FIXME: Think about this more.
5211 std::string Res;
5212
5213 if (Arg *OutputOpt = Args.getLastArg(options::OPT_o)) {
Richard Smithbd55daf2012-11-01 04:30:05 +00005214 std::string Str(OutputOpt->getValue());
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005215 Res = Str.substr(0, Str.rfind('.'));
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005216 } else {
Bob Wilsondecc03e2012-11-23 06:14:39 +00005217 Res = getBaseInputStem(Args, Inputs);
Chad Rosier6fdf38b2011-08-17 23:08:45 +00005218 }
Daniel Dunbar1c28f1e2009-09-09 22:32:48 +00005219 return Args.MakeArgString(Res + ".d");
Daniel Dunbarafec1f52009-03-29 18:40:18 +00005220}
5221
Daniel Dunbarbe220842009-03-20 16:06:39 +00005222void darwin::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005223 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005224 const InputInfoList &Inputs,
5225 const ArgList &Args,
Daniel Dunbarbe220842009-03-20 16:06:39 +00005226 const char *LinkingOutput) const {
5227 ArgStringList CmdArgs;
5228
5229 assert(Inputs.size() == 1 && "Unexpected number of inputs.");
5230 const InputInfo &Input = Inputs[0];
5231
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005232 // Determine the original source input.
5233 const Action *SourceAction = &JA;
5234 while (SourceAction->getKind() != Action::InputClass) {
5235 assert(!SourceAction->getInputs().empty() && "unexpected root action!");
5236 SourceAction = SourceAction->getInputs()[0];
5237 }
5238
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005239 // If -fno_integrated_as is used add -Q to the darwin assember driver to make
Kevin Enderby319baa42013-11-18 23:30:29 +00005240 // sure it runs its system assembler not clang's integrated assembler.
David Fang073a7c92013-12-10 22:51:25 +00005241 // Applicable to darwin11+ and Xcode 4+. darwin<10 lacked integrated-as.
5242 // FIXME: at run-time detect assembler capabilities or rely on version
5243 // information forwarded by -target-assembler-version (future)
Saleem Abdulrasoolcfeb90d2014-02-23 00:40:30 +00005244 if (Args.hasArg(options::OPT_fno_integrated_as)) {
David Fangadcdde02013-12-10 23:13:11 +00005245 const llvm::Triple &T(getToolChain().getTriple());
5246 if (!(T.isMacOSX() && T.isMacOSXVersionLT(10, 7)))
David Fang073a7c92013-12-10 22:51:25 +00005247 CmdArgs.push_back("-Q");
5248 }
Kevin Enderby319baa42013-11-18 23:30:29 +00005249
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005250 // Forward -g, assuming we are dealing with an actual assembly file.
Eric Christopher84fbdb42011-08-19 00:30:14 +00005251 if (SourceAction->getType() == types::TY_Asm ||
Daniel Dunbardc8355e2011-04-12 23:59:20 +00005252 SourceAction->getType() == types::TY_PP_Asm) {
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005253 if (Args.hasArg(options::OPT_gstabs))
5254 CmdArgs.push_back("--gstabs");
5255 else if (Args.hasArg(options::OPT_g_Group))
Bob Wilson126c4912011-11-02 05:10:45 +00005256 CmdArgs.push_back("-g");
Daniel Dunbar5c9c1182009-04-01 00:27:44 +00005257 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005258
Daniel Dunbarbe220842009-03-20 16:06:39 +00005259 // Derived from asm spec.
Tim Northover157d9112014-01-16 08:48:16 +00005260 AddMachOArch(Args, CmdArgs);
Daniel Dunbarbe220842009-03-20 16:06:39 +00005261
Daniel Dunbar6d484762010-07-22 01:47:22 +00005262 // Use -force_cpusubtype_ALL on x86 by default.
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005263 if (getToolChain().getArch() == llvm::Triple::x86 ||
5264 getToolChain().getArch() == llvm::Triple::x86_64 ||
Daniel Dunbar3571dd92009-09-09 18:36:27 +00005265 Args.hasArg(options::OPT_force__cpusubtype__ALL))
5266 CmdArgs.push_back("-force_cpusubtype_ALL");
5267
Eli Benderskyd4a6aec2013-07-24 22:20:49 +00005268 if (getToolChain().getArch() != llvm::Triple::x86_64 &&
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005269 (((Args.hasArg(options::OPT_mkernel) ||
Eric Christopher248357f2013-02-21 22:35:01 +00005270 Args.hasArg(options::OPT_fapple_kext)) &&
Tim Northover157d9112014-01-16 08:48:16 +00005271 getMachOToolChain().isKernelStatic()) ||
Daniel Dunbarbd847cc2012-10-15 22:23:53 +00005272 Args.hasArg(options::OPT_static)))
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005273 CmdArgs.push_back("-static");
5274
Daniel Dunbarbe220842009-03-20 16:06:39 +00005275 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5276 options::OPT_Xassembler);
5277
5278 assert(Output.isFilename() && "Unexpected lipo output.");
5279 CmdArgs.push_back("-o");
5280 CmdArgs.push_back(Output.getFilename());
5281
Daniel Dunbarb440f562010-08-02 02:38:21 +00005282 assert(Input.isFilename() && "Invalid input.");
5283 CmdArgs.push_back(Input.getFilename());
Daniel Dunbarbe220842009-03-20 16:06:39 +00005284
5285 // asm_final spec is empty.
5286
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005287 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005288 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005289 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarbe220842009-03-20 16:06:39 +00005290}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005291
Tim Northover157d9112014-01-16 08:48:16 +00005292void darwin::MachOTool::anchor() {}
David Blaikie68e081d2011-12-20 02:48:34 +00005293
Tim Northover157d9112014-01-16 08:48:16 +00005294void darwin::MachOTool::AddMachOArch(const ArgList &Args,
5295 ArgStringList &CmdArgs) const {
5296 StringRef ArchName = getMachOToolChain().getMachOArchName(Args);
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005297
Daniel Dunbarc1964212009-03-26 16:23:12 +00005298 // Derived from darwin_arch spec.
5299 CmdArgs.push_back("-arch");
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005300 CmdArgs.push_back(Args.MakeArgString(ArchName));
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005301
Daniel Dunbardcc3b652010-01-22 02:04:58 +00005302 // FIXME: Is this needed anymore?
5303 if (ArchName == "arm")
Daniel Dunbar91dbfd62009-09-04 18:35:31 +00005304 CmdArgs.push_back("-force_cpusubtype_ALL");
Daniel Dunbarc1964212009-03-26 16:23:12 +00005305}
5306
Bill Wendling3b2000f2012-10-02 18:02:50 +00005307bool darwin::Link::NeedsTempPath(const InputInfoList &Inputs) const {
5308 // We only need to generate a temp path for LTO if we aren't compiling object
5309 // files. When compiling source files, we run 'dsymutil' after linking. We
5310 // don't run 'dsymutil' when compiling object files.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005311 for (const auto &Input : Inputs)
5312 if (Input.getType() != types::TY_Object)
Bill Wendling3b2000f2012-10-02 18:02:50 +00005313 return true;
5314
5315 return false;
5316}
5317
Daniel Dunbarccbc4522010-09-09 21:51:05 +00005318void darwin::Link::AddLinkArgs(Compilation &C,
5319 const ArgList &Args,
Bill Wendling3b2000f2012-10-02 18:02:50 +00005320 ArgStringList &CmdArgs,
5321 const InputInfoList &Inputs) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005322 const Driver &D = getToolChain().getDriver();
Tim Northover157d9112014-01-16 08:48:16 +00005323 const toolchains::MachO &MachOTC = getMachOToolChain();
Daniel Dunbarc1964212009-03-26 16:23:12 +00005324
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005325 unsigned Version[3] = { 0, 0, 0 };
5326 if (Arg *A = Args.getLastArg(options::OPT_mlinker_version_EQ)) {
5327 bool HadExtra;
Richard Smithbd55daf2012-11-01 04:30:05 +00005328 if (!Driver::GetReleaseVersion(A->getValue(), Version[0],
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005329 Version[1], Version[2], HadExtra) ||
5330 HadExtra)
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005331 D.Diag(diag::err_drv_invalid_version_number)
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005332 << A->getAsString(Args);
5333 }
5334
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005335 // Newer linkers support -demangle. Pass it if supported and not disabled by
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005336 // the user.
Bob Wilson5a4f3ea2014-01-14 01:56:31 +00005337 if (Version[0] >= 100 && !Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
5338 CmdArgs.push_back("-demangle");
Daniel Dunbarcacb0e22010-08-11 23:07:50 +00005339
Bob Wilson3d27dad2013-08-02 22:25:34 +00005340 if (Args.hasArg(options::OPT_rdynamic) && Version[0] >= 137)
5341 CmdArgs.push_back("-export_dynamic");
5342
Bill Wendling313b6bf2012-11-16 23:03:00 +00005343 // If we are using LTO, then automatically create a temporary file path for
5344 // the linker to use, so that it's lifetime will extend past a possible
5345 // dsymutil step.
5346 if (Version[0] >= 116 && D.IsUsingLTO(Args) && NeedsTempPath(Inputs)) {
5347 const char *TmpPath = C.getArgs().MakeArgString(
5348 D.GetTemporaryPath("cc", types::getTypeTempSuffix(types::TY_Object)));
5349 C.addTempFile(TmpPath);
5350 CmdArgs.push_back("-object_path_lto");
5351 CmdArgs.push_back(TmpPath);
Daniel Dunbaref889c72011-06-21 20:55:11 +00005352 }
5353
Daniel Dunbarc1964212009-03-26 16:23:12 +00005354 // Derived from the "link" spec.
5355 Args.AddAllArgs(CmdArgs, options::OPT_static);
5356 if (!Args.hasArg(options::OPT_static))
5357 CmdArgs.push_back("-dynamic");
5358 if (Args.hasArg(options::OPT_fgnu_runtime)) {
5359 // FIXME: gcc replaces -lobjc in forward args with -lobjc-gnu
5360 // here. How do we wish to handle such things?
5361 }
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005362
Daniel Dunbarc1964212009-03-26 16:23:12 +00005363 if (!Args.hasArg(options::OPT_dynamiclib)) {
Tim Northover157d9112014-01-16 08:48:16 +00005364 AddMachOArch(Args, CmdArgs);
Daniel Dunbara48823f2010-01-22 02:04:52 +00005365 // FIXME: Why do this only on this path?
Daniel Dunbar93d7acf2010-01-22 03:37:33 +00005366 Args.AddLastArg(CmdArgs, options::OPT_force__cpusubtype__ALL);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005367
5368 Args.AddLastArg(CmdArgs, options::OPT_bundle);
5369 Args.AddAllArgs(CmdArgs, options::OPT_bundle__loader);
5370 Args.AddAllArgs(CmdArgs, options::OPT_client__name);
5371
5372 Arg *A;
5373 if ((A = Args.getLastArg(options::OPT_compatibility__version)) ||
5374 (A = Args.getLastArg(options::OPT_current__version)) ||
5375 (A = Args.getLastArg(options::OPT_install__name)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005376 D.Diag(diag::err_drv_argument_only_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005377 << A->getAsString(Args) << "-dynamiclib";
5378
5379 Args.AddLastArg(CmdArgs, options::OPT_force__flat__namespace);
5380 Args.AddLastArg(CmdArgs, options::OPT_keep__private__externs);
5381 Args.AddLastArg(CmdArgs, options::OPT_private__bundle);
5382 } else {
5383 CmdArgs.push_back("-dylib");
5384
5385 Arg *A;
5386 if ((A = Args.getLastArg(options::OPT_bundle)) ||
5387 (A = Args.getLastArg(options::OPT_bundle__loader)) ||
5388 (A = Args.getLastArg(options::OPT_client__name)) ||
5389 (A = Args.getLastArg(options::OPT_force__flat__namespace)) ||
5390 (A = Args.getLastArg(options::OPT_keep__private__externs)) ||
5391 (A = Args.getLastArg(options::OPT_private__bundle)))
Chris Lattner0e62c1c2011-07-23 10:55:15 +00005392 D.Diag(diag::err_drv_argument_not_allowed_with)
Daniel Dunbarc1964212009-03-26 16:23:12 +00005393 << A->getAsString(Args) << "-dynamiclib";
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005394
Daniel Dunbarc1964212009-03-26 16:23:12 +00005395 Args.AddAllArgsTranslated(CmdArgs, options::OPT_compatibility__version,
5396 "-dylib_compatibility_version");
5397 Args.AddAllArgsTranslated(CmdArgs, options::OPT_current__version,
5398 "-dylib_current_version");
5399
Tim Northover157d9112014-01-16 08:48:16 +00005400 AddMachOArch(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005401
5402 Args.AddAllArgsTranslated(CmdArgs, options::OPT_install__name,
5403 "-dylib_install_name");
5404 }
5405
5406 Args.AddLastArg(CmdArgs, options::OPT_all__load);
5407 Args.AddAllArgs(CmdArgs, options::OPT_allowable__client);
5408 Args.AddLastArg(CmdArgs, options::OPT_bind__at__load);
Tim Northover157d9112014-01-16 08:48:16 +00005409 if (MachOTC.isTargetIOSBased())
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005410 Args.AddLastArg(CmdArgs, options::OPT_arch__errors__fatal);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005411 Args.AddLastArg(CmdArgs, options::OPT_dead__strip);
5412 Args.AddLastArg(CmdArgs, options::OPT_no__dead__strip__inits__and__terms);
5413 Args.AddAllArgs(CmdArgs, options::OPT_dylib__file);
5414 Args.AddLastArg(CmdArgs, options::OPT_dynamic);
5415 Args.AddAllArgs(CmdArgs, options::OPT_exported__symbols__list);
5416 Args.AddLastArg(CmdArgs, options::OPT_flat__namespace);
Daniel Dunbar044a3902011-06-28 20:16:02 +00005417 Args.AddAllArgs(CmdArgs, options::OPT_force__load);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005418 Args.AddAllArgs(CmdArgs, options::OPT_headerpad__max__install__names);
5419 Args.AddAllArgs(CmdArgs, options::OPT_image__base);
5420 Args.AddAllArgs(CmdArgs, options::OPT_init);
5421
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005422 // Add the deployment target.
Tim Northover157d9112014-01-16 08:48:16 +00005423 MachOTC.addMinVersionArgs(Args, CmdArgs);
Daniel Dunbarc44d3132011-04-28 21:23:41 +00005424
Daniel Dunbarc1964212009-03-26 16:23:12 +00005425 Args.AddLastArg(CmdArgs, options::OPT_nomultidefs);
5426 Args.AddLastArg(CmdArgs, options::OPT_multi__module);
5427 Args.AddLastArg(CmdArgs, options::OPT_single__module);
5428 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined);
5429 Args.AddAllArgs(CmdArgs, options::OPT_multiply__defined__unused);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005430
Daniel Dunbaraf68a882010-07-13 23:31:40 +00005431 if (const Arg *A = Args.getLastArg(options::OPT_fpie, options::OPT_fPIE,
5432 options::OPT_fno_pie,
5433 options::OPT_fno_PIE)) {
5434 if (A->getOption().matches(options::OPT_fpie) ||
5435 A->getOption().matches(options::OPT_fPIE))
5436 CmdArgs.push_back("-pie");
5437 else
5438 CmdArgs.push_back("-no_pie");
5439 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005440
5441 Args.AddLastArg(CmdArgs, options::OPT_prebind);
5442 Args.AddLastArg(CmdArgs, options::OPT_noprebind);
5443 Args.AddLastArg(CmdArgs, options::OPT_nofixprebinding);
5444 Args.AddLastArg(CmdArgs, options::OPT_prebind__all__twolevel__modules);
5445 Args.AddLastArg(CmdArgs, options::OPT_read__only__relocs);
5446 Args.AddAllArgs(CmdArgs, options::OPT_sectcreate);
5447 Args.AddAllArgs(CmdArgs, options::OPT_sectorder);
5448 Args.AddAllArgs(CmdArgs, options::OPT_seg1addr);
5449 Args.AddAllArgs(CmdArgs, options::OPT_segprot);
5450 Args.AddAllArgs(CmdArgs, options::OPT_segaddr);
5451 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__only__addr);
5452 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__write__addr);
5453 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table);
5454 Args.AddAllArgs(CmdArgs, options::OPT_seg__addr__table__filename);
5455 Args.AddAllArgs(CmdArgs, options::OPT_sub__library);
5456 Args.AddAllArgs(CmdArgs, options::OPT_sub__umbrella);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005457
Daniel Dunbar84384642011-05-02 21:03:47 +00005458 // Give --sysroot= preference, over the Apple specific behavior to also use
5459 // --isysroot as the syslibroot.
Sebastian Pop980920a2012-04-16 04:16:43 +00005460 StringRef sysroot = C.getSysRoot();
5461 if (sysroot != "") {
Daniel Dunbar84384642011-05-02 21:03:47 +00005462 CmdArgs.push_back("-syslibroot");
Sebastian Pop980920a2012-04-16 04:16:43 +00005463 CmdArgs.push_back(C.getArgs().MakeArgString(sysroot));
Daniel Dunbar84384642011-05-02 21:03:47 +00005464 } else if (const Arg *A = Args.getLastArg(options::OPT_isysroot)) {
5465 CmdArgs.push_back("-syslibroot");
Richard Smithbd55daf2012-11-01 04:30:05 +00005466 CmdArgs.push_back(A->getValue());
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005467 }
5468
Daniel Dunbarc1964212009-03-26 16:23:12 +00005469 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace);
5470 Args.AddLastArg(CmdArgs, options::OPT_twolevel__namespace__hints);
5471 Args.AddAllArgs(CmdArgs, options::OPT_umbrella);
5472 Args.AddAllArgs(CmdArgs, options::OPT_undefined);
5473 Args.AddAllArgs(CmdArgs, options::OPT_unexported__symbols__list);
Daniel Dunbar2b5f6812009-09-04 18:35:41 +00005474 Args.AddAllArgs(CmdArgs, options::OPT_weak__reference__mismatches);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005475 Args.AddLastArg(CmdArgs, options::OPT_X_Flag);
5476 Args.AddAllArgs(CmdArgs, options::OPT_y);
5477 Args.AddLastArg(CmdArgs, options::OPT_w);
5478 Args.AddAllArgs(CmdArgs, options::OPT_pagezero__size);
5479 Args.AddAllArgs(CmdArgs, options::OPT_segs__read__);
5480 Args.AddLastArg(CmdArgs, options::OPT_seglinkedit);
5481 Args.AddLastArg(CmdArgs, options::OPT_noseglinkedit);
5482 Args.AddAllArgs(CmdArgs, options::OPT_sectalign);
5483 Args.AddAllArgs(CmdArgs, options::OPT_sectobjectsymbols);
5484 Args.AddAllArgs(CmdArgs, options::OPT_segcreate);
5485 Args.AddLastArg(CmdArgs, options::OPT_whyload);
5486 Args.AddLastArg(CmdArgs, options::OPT_whatsloaded);
5487 Args.AddAllArgs(CmdArgs, options::OPT_dylinker__install__name);
5488 Args.AddLastArg(CmdArgs, options::OPT_dylinker);
5489 Args.AddLastArg(CmdArgs, options::OPT_Mach);
5490}
5491
Alexey Bataev186b28a2014-03-06 05:43:53 +00005492enum LibOpenMP {
5493 LibUnknown,
5494 LibGOMP,
5495 LibIOMP5
5496};
5497
Daniel Dunbarc1964212009-03-26 16:23:12 +00005498void darwin::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005499 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005500 const InputInfoList &Inputs,
5501 const ArgList &Args,
Daniel Dunbarc1964212009-03-26 16:23:12 +00005502 const char *LinkingOutput) const {
5503 assert(Output.getType() == types::TY_Image && "Invalid linker output type.");
Daniel Dunbarc09988d2009-09-08 16:39:16 +00005504
Daniel Dunbarc1964212009-03-26 16:23:12 +00005505 // The logic here is derived from gcc's behavior; most of which
5506 // comes from specs (starting with link_command). Consult gcc for
5507 // more information.
Daniel Dunbarc1964212009-03-26 16:23:12 +00005508 ArgStringList CmdArgs;
5509
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005510 /// Hack(tm) to ignore linking errors when we are doing ARC migration.
5511 if (Args.hasArg(options::OPT_ccc_arcmt_check,
5512 options::OPT_ccc_arcmt_migrate)) {
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005513 for (const auto &Arg : Args)
5514 Arg->claim();
Argyrios Kyrtzidis741fab12011-10-07 22:58:08 +00005515 const char *Exec =
5516 Args.MakeArgString(getToolChain().GetProgramPath("touch"));
5517 CmdArgs.push_back(Output.getFilename());
5518 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5519 return;
5520 }
5521
Daniel Dunbarc1964212009-03-26 16:23:12 +00005522 // I'm not sure why this particular decomposition exists in gcc, but
5523 // we follow suite for ease of comparison.
Bill Wendling3b2000f2012-10-02 18:02:50 +00005524 AddLinkArgs(C, Args, CmdArgs, Inputs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005525
Daniel Dunbarc1964212009-03-26 16:23:12 +00005526 Args.AddAllArgs(CmdArgs, options::OPT_d_Flag);
5527 Args.AddAllArgs(CmdArgs, options::OPT_s);
5528 Args.AddAllArgs(CmdArgs, options::OPT_t);
5529 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
5530 Args.AddAllArgs(CmdArgs, options::OPT_u_Group);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005531 Args.AddLastArg(CmdArgs, options::OPT_e);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005532 Args.AddAllArgs(CmdArgs, options::OPT_r);
5533
Daniel Dunbar767bbab2010-10-18 22:08:36 +00005534 // Forward -ObjC when either -ObjC or -ObjC++ is used, to force loading
5535 // members of static archive libraries which implement Objective-C classes or
5536 // categories.
5537 if (Args.hasArg(options::OPT_ObjC) || Args.hasArg(options::OPT_ObjCXX))
5538 CmdArgs.push_back("-ObjC");
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00005539
Daniel Dunbarc1964212009-03-26 16:23:12 +00005540 CmdArgs.push_back("-o");
5541 CmdArgs.push_back(Output.getFilename());
5542
Chad Rosier06fd3c62012-05-16 23:45:12 +00005543 if (!Args.hasArg(options::OPT_nostdlib) &&
Tim Northover157d9112014-01-16 08:48:16 +00005544 !Args.hasArg(options::OPT_nostartfiles))
5545 getMachOToolChain().addStartObjectFileArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005546
5547 Args.AddAllArgs(CmdArgs, options::OPT_L);
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005548
Alexey Bataev186b28a2014-03-06 05:43:53 +00005549 LibOpenMP UsedOpenMPLib = LibUnknown;
5550 if (Args.hasArg(options::OPT_fopenmp)) {
5551 UsedOpenMPLib = LibGOMP;
5552 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
5553 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
5554 .Case("libgomp", LibGOMP)
5555 .Case("libiomp5", LibIOMP5)
5556 .Default(LibUnknown);
5557 if (UsedOpenMPLib == LibUnknown)
5558 getToolChain().getDriver().Diag(diag::err_drv_unsupported_option_argument)
5559 << A->getOption().getName() << A->getValue();
5560 }
5561 switch (UsedOpenMPLib) {
5562 case LibGOMP:
Daniel Dunbarc1964212009-03-26 16:23:12 +00005563 CmdArgs.push_back("-lgomp");
Alexey Bataev186b28a2014-03-06 05:43:53 +00005564 break;
5565 case LibIOMP5:
5566 CmdArgs.push_back("-liomp5");
5567 break;
5568 case LibUnknown:
5569 break;
5570 }
Daniel Dunbarc1964212009-03-26 16:23:12 +00005571
Douglas Gregor9295df02012-05-15 21:00:27 +00005572 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5573
Bob Wilson16d93952012-05-15 18:57:39 +00005574 if (isObjCRuntimeLinked(Args) &&
5575 !Args.hasArg(options::OPT_nostdlib) &&
5576 !Args.hasArg(options::OPT_nodefaultlibs)) {
Tim Northover157d9112014-01-16 08:48:16 +00005577 // We use arclite library for both ARC and subscripting support.
5578 getMachOToolChain().AddLinkARCArgs(Args, CmdArgs);
5579
Bob Wilson7dda0cd2012-04-21 00:21:42 +00005580 CmdArgs.push_back("-framework");
5581 CmdArgs.push_back("Foundation");
Ted Kremeneke65b0862012-03-06 20:05:56 +00005582 // Link libobj.
5583 CmdArgs.push_back("-lobjc");
John McCall24fc0de2011-07-06 00:26:06 +00005584 }
John McCall31168b02011-06-15 23:02:42 +00005585
Daniel Dunbarc1964212009-03-26 16:23:12 +00005586 if (LinkingOutput) {
5587 CmdArgs.push_back("-arch_multiple");
5588 CmdArgs.push_back("-final_output");
5589 CmdArgs.push_back(LinkingOutput);
5590 }
5591
Daniel Dunbarc1964212009-03-26 16:23:12 +00005592 if (Args.hasArg(options::OPT_fnested_functions))
5593 CmdArgs.push_back("-allow_stack_execute");
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005594
Daniel Dunbarc1964212009-03-26 16:23:12 +00005595 if (!Args.hasArg(options::OPT_nostdlib) &&
5596 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005597 if (getToolChain().getDriver().CCCIsCXX())
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00005598 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Daniel Dunbarad0f62b2009-04-08 06:06:21 +00005599
Daniel Dunbarc1964212009-03-26 16:23:12 +00005600 // link_ssp spec is empty.
5601
Daniel Dunbar26d482a2009-09-18 08:15:03 +00005602 // Let the tool chain choose which runtime library to link.
Tim Northover157d9112014-01-16 08:48:16 +00005603 getMachOToolChain().AddLinkRuntimeLibArgs(Args, CmdArgs);
Daniel Dunbarc1964212009-03-26 16:23:12 +00005604 }
5605
Chad Rosier06fd3c62012-05-16 23:45:12 +00005606 if (!Args.hasArg(options::OPT_nostdlib) &&
Daniel Dunbarc1964212009-03-26 16:23:12 +00005607 !Args.hasArg(options::OPT_nostartfiles)) {
5608 // endfile_spec is empty.
5609 }
5610
5611 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5612 Args.AddAllArgs(CmdArgs, options::OPT_F);
5613
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005614 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005615 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005616 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarc1964212009-03-26 16:23:12 +00005617}
5618
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005619void darwin::Lipo::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005620 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00005621 const InputInfoList &Inputs,
5622 const ArgList &Args,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005623 const char *LinkingOutput) const {
5624 ArgStringList CmdArgs;
5625
5626 CmdArgs.push_back("-create");
5627 assert(Output.isFilename() && "Unexpected lipo output.");
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005628
5629 CmdArgs.push_back("-output");
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005630 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar06686ab2009-03-24 00:24:37 +00005631
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005632 for (const auto &II : Inputs) {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005633 assert(II.isFilename() && "Unexpected lipo input.");
5634 CmdArgs.push_back(II.getFilename());
5635 }
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005636
5637 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("lipo"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005638 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar64ed5e32009-03-20 00:52:38 +00005639}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00005640
Daniel Dunbar88299622010-06-04 18:28:36 +00005641void darwin::Dsymutil::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005642 const InputInfo &Output,
Daniel Dunbar88299622010-06-04 18:28:36 +00005643 const InputInfoList &Inputs,
5644 const ArgList &Args,
5645 const char *LinkingOutput) const {
5646 ArgStringList CmdArgs;
5647
Daniel Dunbareb86b042011-05-09 17:23:16 +00005648 CmdArgs.push_back("-o");
5649 CmdArgs.push_back(Output.getFilename());
5650
Daniel Dunbar88299622010-06-04 18:28:36 +00005651 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5652 const InputInfo &Input = Inputs[0];
5653 assert(Input.isFilename() && "Unexpected dsymutil input.");
5654 CmdArgs.push_back(Input.getFilename());
5655
Daniel Dunbar88299622010-06-04 18:28:36 +00005656 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005657 Args.MakeArgString(getToolChain().GetProgramPath("dsymutil"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005658 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar88299622010-06-04 18:28:36 +00005659}
5660
Eric Christopher551ef452011-08-23 17:56:55 +00005661void darwin::VerifyDebug::ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +00005662 const InputInfo &Output,
5663 const InputInfoList &Inputs,
5664 const ArgList &Args,
5665 const char *LinkingOutput) const {
Eric Christopher551ef452011-08-23 17:56:55 +00005666 ArgStringList CmdArgs;
5667 CmdArgs.push_back("--verify");
Eric Christopher36222212012-02-06 19:13:09 +00005668 CmdArgs.push_back("--debug-info");
5669 CmdArgs.push_back("--eh-frame");
Eric Christopher65c05fa2012-02-06 19:43:51 +00005670 CmdArgs.push_back("--quiet");
Eric Christopher551ef452011-08-23 17:56:55 +00005671
5672 assert(Inputs.size() == 1 && "Unable to handle multiple inputs.");
5673 const InputInfo &Input = Inputs[0];
5674 assert(Input.isFilename() && "Unexpected verify input");
5675
5676 // Grabbing the output of the earlier dsymutil run.
5677 CmdArgs.push_back(Input.getFilename());
5678
5679 const char *Exec =
5680 Args.MakeArgString(getToolChain().GetProgramPath("dwarfdump"));
5681 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5682}
5683
David Chisnallf571cde2012-02-15 13:39:01 +00005684void solaris::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
5685 const InputInfo &Output,
5686 const InputInfoList &Inputs,
5687 const ArgList &Args,
5688 const char *LinkingOutput) const {
5689 ArgStringList CmdArgs;
5690
5691 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5692 options::OPT_Xassembler);
5693
5694 CmdArgs.push_back("-o");
5695 CmdArgs.push_back(Output.getFilename());
5696
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005697 for (const auto &II : Inputs)
David Chisnallf571cde2012-02-15 13:39:01 +00005698 CmdArgs.push_back(II.getFilename());
David Chisnallf571cde2012-02-15 13:39:01 +00005699
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005700 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
David Chisnallf571cde2012-02-15 13:39:01 +00005701 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5702}
5703
David Chisnallf571cde2012-02-15 13:39:01 +00005704void solaris::Link::ConstructJob(Compilation &C, const JobAction &JA,
5705 const InputInfo &Output,
5706 const InputInfoList &Inputs,
5707 const ArgList &Args,
5708 const char *LinkingOutput) const {
5709 // FIXME: Find a real GCC, don't hard-code versions here
5710 std::string GCCLibPath = "/usr/gcc/4.5/lib/gcc/";
5711 const llvm::Triple &T = getToolChain().getTriple();
5712 std::string LibPath = "/usr/lib/";
5713 llvm::Triple::ArchType Arch = T.getArch();
5714 switch (Arch) {
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00005715 case llvm::Triple::x86:
5716 GCCLibPath +=
5717 ("i386-" + T.getVendorName() + "-" + T.getOSName()).str() + "/4.5.2/";
5718 break;
5719 case llvm::Triple::x86_64:
5720 GCCLibPath += ("i386-" + T.getVendorName() + "-" + T.getOSName()).str();
5721 GCCLibPath += "/4.5.2/amd64/";
5722 LibPath += "amd64/";
5723 break;
5724 default:
5725 llvm_unreachable("Unsupported architecture");
David Chisnallf571cde2012-02-15 13:39:01 +00005726 }
5727
5728 ArgStringList CmdArgs;
5729
David Chisnall272a0712012-02-29 15:06:12 +00005730 // Demangle C++ names in errors
5731 CmdArgs.push_back("-C");
5732
David Chisnallf571cde2012-02-15 13:39:01 +00005733 if ((!Args.hasArg(options::OPT_nostdlib)) &&
5734 (!Args.hasArg(options::OPT_shared))) {
5735 CmdArgs.push_back("-e");
5736 CmdArgs.push_back("_start");
5737 }
5738
5739 if (Args.hasArg(options::OPT_static)) {
5740 CmdArgs.push_back("-Bstatic");
5741 CmdArgs.push_back("-dn");
5742 } else {
5743 CmdArgs.push_back("-Bdynamic");
5744 if (Args.hasArg(options::OPT_shared)) {
5745 CmdArgs.push_back("-shared");
5746 } else {
5747 CmdArgs.push_back("--dynamic-linker");
5748 CmdArgs.push_back(Args.MakeArgString(LibPath + "ld.so.1"));
5749 }
5750 }
5751
5752 if (Output.isFilename()) {
5753 CmdArgs.push_back("-o");
5754 CmdArgs.push_back(Output.getFilename());
5755 } else {
5756 assert(Output.isNothing() && "Invalid output.");
5757 }
5758
5759 if (!Args.hasArg(options::OPT_nostdlib) &&
5760 !Args.hasArg(options::OPT_nostartfiles)) {
5761 if (!Args.hasArg(options::OPT_shared)) {
5762 CmdArgs.push_back(Args.MakeArgString(LibPath + "crt1.o"));
5763 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005764 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005765 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
5766 } else {
5767 CmdArgs.push_back(Args.MakeArgString(LibPath + "crti.o"));
David Chisnall0c52c0f2012-02-28 17:10:04 +00005768 CmdArgs.push_back(Args.MakeArgString(LibPath + "values-Xa.o"));
5769 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtbegin.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005770 }
Hans Wennborg70850d82013-07-18 20:29:38 +00005771 if (getToolChain().getDriver().CCCIsCXX())
David Chisnallddc4c9d2012-03-13 14:14:54 +00005772 CmdArgs.push_back(Args.MakeArgString(LibPath + "cxa_finalize.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005773 }
5774
5775 CmdArgs.push_back(Args.MakeArgString("-L" + GCCLibPath));
5776
5777 Args.AddAllArgs(CmdArgs, options::OPT_L);
5778 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5779 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall0c52c0f2012-02-28 17:10:04 +00005780 Args.AddAllArgs(CmdArgs, options::OPT_r);
David Chisnallf571cde2012-02-15 13:39:01 +00005781
5782 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
5783
5784 if (!Args.hasArg(options::OPT_nostdlib) &&
5785 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00005786 if (getToolChain().getDriver().CCCIsCXX())
David Chisnall3d127c72012-04-10 11:49:50 +00005787 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
David Chisnall1026fb02012-02-15 18:24:31 +00005788 CmdArgs.push_back("-lgcc_s");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005789 if (!Args.hasArg(options::OPT_shared)) {
5790 CmdArgs.push_back("-lgcc");
David Chisnallf571cde2012-02-15 13:39:01 +00005791 CmdArgs.push_back("-lc");
David Chisnallc73fb892012-02-28 20:06:45 +00005792 CmdArgs.push_back("-lm");
David Chisnall0c52c0f2012-02-28 17:10:04 +00005793 }
David Chisnallf571cde2012-02-15 13:39:01 +00005794 }
5795
5796 if (!Args.hasArg(options::OPT_nostdlib) &&
5797 !Args.hasArg(options::OPT_nostartfiles)) {
David Chisnall0c52c0f2012-02-28 17:10:04 +00005798 CmdArgs.push_back(Args.MakeArgString(GCCLibPath + "crtend.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005799 }
David Chisnall96de9932012-02-16 16:00:47 +00005800 CmdArgs.push_back(Args.MakeArgString(LibPath + "crtn.o"));
David Chisnallf571cde2012-02-15 13:39:01 +00005801
Alexey Samsonov7811d192014-02-20 13:57:37 +00005802 addProfileRT(getToolChain(), Args, CmdArgs);
David Chisnallf571cde2012-02-15 13:39:01 +00005803
5804 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005805 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
David Chisnallf571cde2012-02-15 13:39:01 +00005806 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
5807}
5808
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005809void auroraux::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005810 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005811 const InputInfoList &Inputs,
5812 const ArgList &Args,
5813 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005814 ArgStringList CmdArgs;
5815
5816 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5817 options::OPT_Xassembler);
5818
5819 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005820 CmdArgs.push_back(Output.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005821
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005822 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00005823 CmdArgs.push_back(II.getFilename());
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005824
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005825 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("gas"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005826 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005827}
5828
5829void auroraux::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005830 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005831 const InputInfoList &Inputs,
5832 const ArgList &Args,
5833 const char *LinkingOutput) const {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005834 ArgStringList CmdArgs;
5835
5836 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005837 (!Args.hasArg(options::OPT_shared))) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005838 CmdArgs.push_back("-e");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005839 CmdArgs.push_back("_start");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005840 }
5841
5842 if (Args.hasArg(options::OPT_static)) {
5843 CmdArgs.push_back("-Bstatic");
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005844 CmdArgs.push_back("-dn");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005845 } else {
Edward O'Callaghand8712d92009-10-15 07:44:07 +00005846// CmdArgs.push_back("--eh-frame-hdr");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005847 CmdArgs.push_back("-Bdynamic");
5848 if (Args.hasArg(options::OPT_shared)) {
5849 CmdArgs.push_back("-shared");
5850 } else {
Edward O'Callaghan7d3c2752009-10-16 19:44:18 +00005851 CmdArgs.push_back("--dynamic-linker");
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005852 CmdArgs.push_back("/lib/ld.so.1"); // 64Bit Path /lib/amd64/ld.so.1
5853 }
5854 }
5855
Daniel Dunbarb440f562010-08-02 02:38:21 +00005856 if (Output.isFilename()) {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005857 CmdArgs.push_back("-o");
5858 CmdArgs.push_back(Output.getFilename());
5859 } else {
5860 assert(Output.isNothing() && "Invalid output.");
5861 }
5862
5863 if (!Args.hasArg(options::OPT_nostdlib) &&
5864 !Args.hasArg(options::OPT_nostartfiles)) {
5865 if (!Args.hasArg(options::OPT_shared)) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005866 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005867 getToolChain().GetFilePath("crt1.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005868 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005869 getToolChain().GetFilePath("crti.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00005870 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005871 getToolChain().GetFilePath("crtbegin.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005872 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00005873 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005874 getToolChain().GetFilePath("crti.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005875 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00005876 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005877 getToolChain().GetFilePath("crtn.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005878 }
5879
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00005880 CmdArgs.push_back(Args.MakeArgString("-L/opt/gcc4/lib/gcc/"
5881 + getToolChain().getTripleString()
Daniel Dunbarb0b18612009-10-29 02:24:37 +00005882 + "/4.2.4"));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005883
5884 Args.AddAllArgs(CmdArgs, options::OPT_L);
5885 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
5886 Args.AddAllArgs(CmdArgs, options::OPT_e);
5887
Daniel Dunbar54423b22010-09-17 00:24:54 +00005888 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005889
5890 if (!Args.hasArg(options::OPT_nostdlib) &&
5891 !Args.hasArg(options::OPT_nodefaultlibs)) {
5892 // FIXME: For some reason GCC passes -lgcc before adding
5893 // the default system libraries. Just mimic this for now.
5894 CmdArgs.push_back("-lgcc");
5895
5896 if (Args.hasArg(options::OPT_pthread))
5897 CmdArgs.push_back("-pthread");
5898 if (!Args.hasArg(options::OPT_shared))
5899 CmdArgs.push_back("-lc");
5900 CmdArgs.push_back("-lgcc");
5901 }
5902
5903 if (!Args.hasArg(options::OPT_nostdlib) &&
5904 !Args.hasArg(options::OPT_nostartfiles)) {
5905 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00005906 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005907 getToolChain().GetFilePath("crtend.o")));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005908 }
5909
Alexey Samsonov7811d192014-02-20 13:57:37 +00005910 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00005911
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005912 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00005913 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005914 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +00005915}
5916
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005917void openbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005918 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005919 const InputInfoList &Inputs,
5920 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00005921 const char *LinkingOutput) const {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005922 ArgStringList CmdArgs;
Rafael Espindolacc126272014-02-28 01:55:21 +00005923 bool NeedsKPIC = false;
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005924
Rafael Espindolacc126272014-02-28 01:55:21 +00005925 switch (getToolChain().getArch()) {
5926 case llvm::Triple::x86:
5927 // When building 32-bit code on OpenBSD/amd64, we have to explicitly
5928 // instruct as in the base system to assemble 32-bit code.
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005929 CmdArgs.push_back("--32");
Rafael Espindolacc126272014-02-28 01:55:21 +00005930 break;
5931
5932 case llvm::Triple::ppc:
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005933 CmdArgs.push_back("-mppc");
5934 CmdArgs.push_back("-many");
Rafael Espindolacc126272014-02-28 01:55:21 +00005935 break;
5936
5937 case llvm::Triple::sparc:
5938 CmdArgs.push_back("-32");
5939 NeedsKPIC = true;
5940 break;
5941
5942 case llvm::Triple::sparcv9:
5943 CmdArgs.push_back("-64");
5944 CmdArgs.push_back("-Av9a");
5945 NeedsKPIC = true;
5946 break;
5947
5948 case llvm::Triple::mips64:
5949 case llvm::Triple::mips64el: {
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005950 StringRef CPUName;
5951 StringRef ABIName;
5952 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
5953
5954 CmdArgs.push_back("-mabi");
5955 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
5956
5957 if (getToolChain().getArch() == llvm::Triple::mips64)
5958 CmdArgs.push_back("-EB");
5959 else
5960 CmdArgs.push_back("-EL");
5961
Rafael Espindolacc126272014-02-28 01:55:21 +00005962 NeedsKPIC = true;
5963 break;
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00005964 }
5965
Rafael Espindolacc126272014-02-28 01:55:21 +00005966 default:
5967 break;
5968 }
5969
5970 if (NeedsKPIC)
5971 addAssemblerKPIC(Args, CmdArgs);
5972
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005973 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
5974 options::OPT_Xassembler);
5975
5976 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00005977 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005978
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00005979 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00005980 CmdArgs.push_back(II.getFilename());
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005981
5982 const char *Exec =
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00005983 Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005984 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005985}
5986
5987void openbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00005988 const InputInfo &Output,
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005989 const InputInfoList &Inputs,
5990 const ArgList &Args,
5991 const char *LinkingOutput) const {
Daniel Dunbar083edf72009-12-21 18:54:17 +00005992 const Driver &D = getToolChain().getDriver();
Daniel Dunbar10de9e62009-06-29 20:52:51 +00005993 ArgStringList CmdArgs;
5994
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00005995 // Silence warning for "clang -g foo.o -o foo"
5996 Args.ClaimAllArgs(options::OPT_g_Group);
5997 // and "clang -emit-llvm foo.o -o foo"
5998 Args.ClaimAllArgs(options::OPT_emit_llvm);
5999 // and for "clang -w foo.o -o foo". Other warning options are already
6000 // handled somewhere else.
6001 Args.ClaimAllArgs(options::OPT_w);
6002
Joerg Sonnenbergeree3b2da2013-12-07 00:57:46 +00006003 if (getToolChain().getArch() == llvm::Triple::mips64)
6004 CmdArgs.push_back("-EB");
6005 else if (getToolChain().getArch() == llvm::Triple::mips64el)
6006 CmdArgs.push_back("-EL");
6007
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006008 if ((!Args.hasArg(options::OPT_nostdlib)) &&
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006009 (!Args.hasArg(options::OPT_shared))) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006010 CmdArgs.push_back("-e");
6011 CmdArgs.push_back("__start");
6012 }
6013
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006014 if (Args.hasArg(options::OPT_static)) {
6015 CmdArgs.push_back("-Bstatic");
6016 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006017 if (Args.hasArg(options::OPT_rdynamic))
6018 CmdArgs.push_back("-export-dynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006019 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006020 CmdArgs.push_back("-Bdynamic");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006021 if (Args.hasArg(options::OPT_shared)) {
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006022 CmdArgs.push_back("-shared");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006023 } else {
6024 CmdArgs.push_back("-dynamic-linker");
6025 CmdArgs.push_back("/usr/libexec/ld.so");
6026 }
6027 }
6028
Rafael Espindola044f7832013-06-05 04:28:55 +00006029 if (Args.hasArg(options::OPT_nopie))
6030 CmdArgs.push_back("-nopie");
6031
Daniel Dunbarb440f562010-08-02 02:38:21 +00006032 if (Output.isFilename()) {
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006033 CmdArgs.push_back("-o");
6034 CmdArgs.push_back(Output.getFilename());
6035 } else {
6036 assert(Output.isNothing() && "Invalid output.");
6037 }
6038
6039 if (!Args.hasArg(options::OPT_nostdlib) &&
6040 !Args.hasArg(options::OPT_nostartfiles)) {
6041 if (!Args.hasArg(options::OPT_shared)) {
Eli Friedman3715d1f2011-12-15 02:15:56 +00006042 if (Args.hasArg(options::OPT_pg))
6043 CmdArgs.push_back(Args.MakeArgString(
6044 getToolChain().GetFilePath("gcrt0.o")));
6045 else
6046 CmdArgs.push_back(Args.MakeArgString(
6047 getToolChain().GetFilePath("crt0.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00006048 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006049 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006050 } else {
Chris Lattner3e2ee142010-07-07 16:01:42 +00006051 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006052 getToolChain().GetFilePath("crtbeginS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006053 }
6054 }
6055
Edward O'Callaghan5c521462009-10-28 15:13:08 +00006056 std::string Triple = getToolChain().getTripleString();
6057 if (Triple.substr(0, 6) == "x86_64")
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00006058 Triple.replace(0, 6, "amd64");
Daniel Dunbarb0b18612009-10-29 02:24:37 +00006059 CmdArgs.push_back(Args.MakeArgString("-L/usr/lib/gcc-lib/" + Triple +
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006060 "/4.2.1"));
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006061
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006062 Args.AddAllArgs(CmdArgs, options::OPT_L);
6063 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6064 Args.AddAllArgs(CmdArgs, options::OPT_e);
Rafael Espindolaaadd30e2012-12-31 22:41:36 +00006065 Args.AddAllArgs(CmdArgs, options::OPT_s);
6066 Args.AddAllArgs(CmdArgs, options::OPT_t);
6067 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6068 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006069
Daniel Dunbar54423b22010-09-17 00:24:54 +00006070 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006071
6072 if (!Args.hasArg(options::OPT_nostdlib) &&
6073 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006074 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00006075 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Eli Friedman3715d1f2011-12-15 02:15:56 +00006076 if (Args.hasArg(options::OPT_pg))
6077 CmdArgs.push_back("-lm_p");
6078 else
6079 CmdArgs.push_back("-lm");
Daniel Dunbarea3813f2010-08-01 23:13:54 +00006080 }
6081
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006082 // FIXME: For some reason GCC passes -lgcc before adding
6083 // the default system libraries. Just mimic this for now.
6084 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006085
Eric Christopher17674ec2012-09-13 06:32:34 +00006086 if (Args.hasArg(options::OPT_pthread)) {
6087 if (!Args.hasArg(options::OPT_shared) &&
6088 Args.hasArg(options::OPT_pg))
6089 CmdArgs.push_back("-lpthread_p");
6090 else
6091 CmdArgs.push_back("-lpthread");
6092 }
6093
Chandler Carruth45661652011-12-17 22:32:42 +00006094 if (!Args.hasArg(options::OPT_shared)) {
Eric Christopher17674ec2012-09-13 06:32:34 +00006095 if (Args.hasArg(options::OPT_pg))
Eli Friedman3715d1f2011-12-15 02:15:56 +00006096 CmdArgs.push_back("-lc_p");
6097 else
6098 CmdArgs.push_back("-lc");
Chandler Carruth45661652011-12-17 22:32:42 +00006099 }
Eric Christopher17674ec2012-09-13 06:32:34 +00006100
Daniel Dunbara8888ac2009-08-03 01:28:59 +00006101 CmdArgs.push_back("-lgcc");
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006102 }
6103
6104 if (!Args.hasArg(options::OPT_nostdlib) &&
6105 !Args.hasArg(options::OPT_nostartfiles)) {
6106 if (!Args.hasArg(options::OPT_shared))
Chris Lattner3e2ee142010-07-07 16:01:42 +00006107 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006108 getToolChain().GetFilePath("crtend.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006109 else
Chris Lattner3e2ee142010-07-07 16:01:42 +00006110 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00006111 getToolChain().GetFilePath("crtendS.o")));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006112 }
6113
6114 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006115 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006116 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar10de9e62009-06-29 20:52:51 +00006117}
Ed Schoutene33194b2009-04-02 19:13:12 +00006118
Eli Friedman9fa28852012-08-08 23:57:20 +00006119void bitrig::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6120 const InputInfo &Output,
6121 const InputInfoList &Inputs,
6122 const ArgList &Args,
6123 const char *LinkingOutput) const {
6124 ArgStringList CmdArgs;
6125
6126 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6127 options::OPT_Xassembler);
6128
6129 CmdArgs.push_back("-o");
6130 CmdArgs.push_back(Output.getFilename());
6131
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006132 for (const auto &II : Inputs)
Eli Friedman9fa28852012-08-08 23:57:20 +00006133 CmdArgs.push_back(II.getFilename());
Eli Friedman9fa28852012-08-08 23:57:20 +00006134
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006135 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Eli Friedman9fa28852012-08-08 23:57:20 +00006136 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6137}
6138
6139void bitrig::Link::ConstructJob(Compilation &C, const JobAction &JA,
6140 const InputInfo &Output,
6141 const InputInfoList &Inputs,
6142 const ArgList &Args,
6143 const char *LinkingOutput) const {
6144 const Driver &D = getToolChain().getDriver();
6145 ArgStringList CmdArgs;
6146
6147 if ((!Args.hasArg(options::OPT_nostdlib)) &&
6148 (!Args.hasArg(options::OPT_shared))) {
6149 CmdArgs.push_back("-e");
6150 CmdArgs.push_back("__start");
6151 }
6152
6153 if (Args.hasArg(options::OPT_static)) {
6154 CmdArgs.push_back("-Bstatic");
6155 } else {
6156 if (Args.hasArg(options::OPT_rdynamic))
6157 CmdArgs.push_back("-export-dynamic");
6158 CmdArgs.push_back("--eh-frame-hdr");
6159 CmdArgs.push_back("-Bdynamic");
6160 if (Args.hasArg(options::OPT_shared)) {
6161 CmdArgs.push_back("-shared");
6162 } else {
6163 CmdArgs.push_back("-dynamic-linker");
6164 CmdArgs.push_back("/usr/libexec/ld.so");
6165 }
6166 }
6167
6168 if (Output.isFilename()) {
6169 CmdArgs.push_back("-o");
6170 CmdArgs.push_back(Output.getFilename());
6171 } else {
6172 assert(Output.isNothing() && "Invalid output.");
6173 }
6174
6175 if (!Args.hasArg(options::OPT_nostdlib) &&
6176 !Args.hasArg(options::OPT_nostartfiles)) {
6177 if (!Args.hasArg(options::OPT_shared)) {
6178 if (Args.hasArg(options::OPT_pg))
6179 CmdArgs.push_back(Args.MakeArgString(
6180 getToolChain().GetFilePath("gcrt0.o")));
6181 else
6182 CmdArgs.push_back(Args.MakeArgString(
6183 getToolChain().GetFilePath("crt0.o")));
6184 CmdArgs.push_back(Args.MakeArgString(
6185 getToolChain().GetFilePath("crtbegin.o")));
6186 } else {
6187 CmdArgs.push_back(Args.MakeArgString(
6188 getToolChain().GetFilePath("crtbeginS.o")));
6189 }
6190 }
6191
6192 Args.AddAllArgs(CmdArgs, options::OPT_L);
6193 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6194 Args.AddAllArgs(CmdArgs, options::OPT_e);
6195
6196 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6197
6198 if (!Args.hasArg(options::OPT_nostdlib) &&
6199 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006200 if (D.CCCIsCXX()) {
Eli Friedman9fa28852012-08-08 23:57:20 +00006201 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6202 if (Args.hasArg(options::OPT_pg))
6203 CmdArgs.push_back("-lm_p");
6204 else
6205 CmdArgs.push_back("-lm");
6206 }
6207
Rafael Espindola1ad26f02012-10-23 17:07:31 +00006208 if (Args.hasArg(options::OPT_pthread)) {
6209 if (!Args.hasArg(options::OPT_shared) &&
6210 Args.hasArg(options::OPT_pg))
6211 CmdArgs.push_back("-lpthread_p");
6212 else
6213 CmdArgs.push_back("-lpthread");
6214 }
6215
Eli Friedman9fa28852012-08-08 23:57:20 +00006216 if (!Args.hasArg(options::OPT_shared)) {
6217 if (Args.hasArg(options::OPT_pg))
6218 CmdArgs.push_back("-lc_p");
6219 else
6220 CmdArgs.push_back("-lc");
6221 }
6222
Benjamin Kramerb2ccade2013-10-21 12:33:55 +00006223 StringRef MyArch;
6224 switch (getToolChain().getTriple().getArch()) {
6225 case llvm::Triple::arm:
6226 MyArch = "arm";
6227 break;
6228 case llvm::Triple::x86:
6229 MyArch = "i386";
6230 break;
6231 case llvm::Triple::x86_64:
6232 MyArch = "amd64";
6233 break;
6234 default:
6235 llvm_unreachable("Unsupported architecture");
6236 }
6237 CmdArgs.push_back(Args.MakeArgString("-lclang_rt." + MyArch));
Eli Friedman9fa28852012-08-08 23:57:20 +00006238 }
6239
6240 if (!Args.hasArg(options::OPT_nostdlib) &&
6241 !Args.hasArg(options::OPT_nostartfiles)) {
6242 if (!Args.hasArg(options::OPT_shared))
6243 CmdArgs.push_back(Args.MakeArgString(
6244 getToolChain().GetFilePath("crtend.o")));
6245 else
6246 CmdArgs.push_back(Args.MakeArgString(
6247 getToolChain().GetFilePath("crtendS.o")));
6248 }
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006249
6250 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006251 Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Eli Friedman5bb2ba02012-08-09 22:42:04 +00006252 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eli Friedman9fa28852012-08-08 23:57:20 +00006253}
6254
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006255void freebsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006256 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006257 const InputInfoList &Inputs,
6258 const ArgList &Args,
Mike Stump11289f42009-09-09 15:08:12 +00006259 const char *LinkingOutput) const {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006260 ArgStringList CmdArgs;
6261
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006262 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6263 // instruct as in the base system to assemble 32-bit code.
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006264 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006265 CmdArgs.push_back("--32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006266 else if (getToolChain().getArch() == llvm::Triple::ppc)
Roman Divacky00859c22011-06-04 07:37:31 +00006267 CmdArgs.push_back("-a32");
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006268 else if (getToolChain().getArch() == llvm::Triple::mips ||
6269 getToolChain().getArch() == llvm::Triple::mipsel ||
6270 getToolChain().getArch() == llvm::Triple::mips64 ||
6271 getToolChain().getArch() == llvm::Triple::mips64el) {
6272 StringRef CPUName;
6273 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006274 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Michael J. Spencer4c0ffa82010-10-21 03:16:25 +00006275
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006276 CmdArgs.push_back("-march");
6277 CmdArgs.push_back(CPUName.data());
6278
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006279 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006280 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006281
6282 if (getToolChain().getArch() == llvm::Triple::mips ||
6283 getToolChain().getArch() == llvm::Triple::mips64)
6284 CmdArgs.push_back("-EB");
6285 else
6286 CmdArgs.push_back("-EL");
6287
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006288 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006289 } else if (getToolChain().getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006290 getToolChain().getArch() == llvm::Triple::armeb ||
6291 getToolChain().getArch() == llvm::Triple::thumb ||
6292 getToolChain().getArch() == llvm::Triple::thumbeb) {
Renato Golinf4421f72014-02-19 10:44:07 +00006293 const Driver &D = getToolChain().getDriver();
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006294 const llvm::Triple &Triple = getToolChain().getTriple();
Renato Golinf4421f72014-02-19 10:44:07 +00006295 StringRef FloatABI = arm::getARMFloatABI(D, Args, Triple);
6296
6297 if (FloatABI == "hard") {
6298 CmdArgs.push_back("-mfpu=vfp");
6299 } else {
6300 CmdArgs.push_back("-mfpu=softvfp");
6301 }
6302
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006303 switch(getToolChain().getTriple().getEnvironment()) {
Renato Golinf4421f72014-02-19 10:44:07 +00006304 case llvm::Triple::GNUEABIHF:
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006305 case llvm::Triple::GNUEABI:
6306 case llvm::Triple::EABI:
Anton Korobeynikov2bed8472013-03-18 07:59:20 +00006307 CmdArgs.push_back("-meabi=5");
Rafael Espindola0f207ed2012-12-13 04:17:14 +00006308 break;
6309
6310 default:
6311 CmdArgs.push_back("-matpcs");
6312 }
Roman Divacky47f4ff82014-01-02 15:13:18 +00006313 } else if (getToolChain().getArch() == llvm::Triple::sparc ||
Roman Divackyfeb5e632014-01-02 15:34:59 +00006314 getToolChain().getArch() == llvm::Triple::sparcv9) {
Roman Divacky9f779402014-02-25 18:45:49 +00006315 if (getToolChain().getArch() == llvm::Triple::sparc)
6316 CmdArgs.push_back("-Av8plusa");
6317 else
6318 CmdArgs.push_back("-Av9a");
6319
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006320 addAssemblerKPIC(Args, CmdArgs);
Eric Christopherc0f1a5e2012-09-05 21:32:44 +00006321 }
Eric Christopher0b26a612010-03-02 02:41:08 +00006322
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006323 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6324 options::OPT_Xassembler);
6325
6326 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00006327 CmdArgs.push_back(Output.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006328
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006329 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00006330 CmdArgs.push_back(II.getFilename());
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006331
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006332 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006333 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbar8eb473c2009-03-31 17:45:15 +00006334}
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006335
6336void freebsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006337 const InputInfo &Output,
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006338 const InputInfoList &Inputs,
6339 const ArgList &Args,
Daniel Dunbare3e263f2009-05-02 20:14:53 +00006340 const char *LinkingOutput) const {
Roman Divackyafe2f232012-08-28 15:09:03 +00006341 const toolchains::FreeBSD& ToolChain =
6342 static_cast<const toolchains::FreeBSD&>(getToolChain());
6343 const Driver &D = ToolChain.getDriver();
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006344 const bool IsPIE =
6345 !Args.hasArg(options::OPT_shared) &&
6346 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault());
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006347 ArgStringList CmdArgs;
David Chisnall5f99f482012-07-29 15:24:44 +00006348
6349 // Silence warning for "clang -g foo.o -o foo"
6350 Args.ClaimAllArgs(options::OPT_g_Group);
6351 // and "clang -emit-llvm foo.o -o foo"
6352 Args.ClaimAllArgs(options::OPT_emit_llvm);
6353 // and for "clang -w foo.o -o foo". Other warning options are already
6354 // handled somewhere else.
6355 Args.ClaimAllArgs(options::OPT_w);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006356
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006357 if (!D.SysRoot.empty())
6358 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6359
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006360 if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006361 CmdArgs.push_back("-pie");
6362
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006363 if (Args.hasArg(options::OPT_static)) {
6364 CmdArgs.push_back("-Bstatic");
6365 } else {
Rafael Espindola7ba97af2010-11-11 02:17:51 +00006366 if (Args.hasArg(options::OPT_rdynamic))
6367 CmdArgs.push_back("-export-dynamic");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006368 CmdArgs.push_back("--eh-frame-hdr");
6369 if (Args.hasArg(options::OPT_shared)) {
6370 CmdArgs.push_back("-Bshareable");
6371 } else {
6372 CmdArgs.push_back("-dynamic-linker");
6373 CmdArgs.push_back("/libexec/ld-elf.so.1");
6374 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006375 if (ToolChain.getTriple().getOSMajorVersion() >= 9) {
6376 llvm::Triple::ArchType Arch = ToolChain.getArch();
David Chisnall5f99f482012-07-29 15:24:44 +00006377 if (Arch == llvm::Triple::arm || Arch == llvm::Triple::sparc ||
6378 Arch == llvm::Triple::x86 || Arch == llvm::Triple::x86_64) {
6379 CmdArgs.push_back("--hash-style=both");
6380 }
6381 }
6382 CmdArgs.push_back("--enable-new-dtags");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006383 }
6384
6385 // When building 32-bit code on FreeBSD/amd64, we have to explicitly
6386 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006387 if (ToolChain.getArch() == llvm::Triple::x86) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006388 CmdArgs.push_back("-m");
6389 CmdArgs.push_back("elf_i386_fbsd");
6390 }
6391
Rafael Espindola35ca7d92012-10-07 04:44:33 +00006392 if (ToolChain.getArch() == llvm::Triple::ppc) {
Roman Divacky5e300b82011-06-04 07:40:24 +00006393 CmdArgs.push_back("-m");
Roman Divackyd150ad32011-11-21 16:50:32 +00006394 CmdArgs.push_back("elf32ppc_fbsd");
Roman Divacky5e300b82011-06-04 07:40:24 +00006395 }
6396
Daniel Dunbarb440f562010-08-02 02:38:21 +00006397 if (Output.isFilename()) {
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006398 CmdArgs.push_back("-o");
6399 CmdArgs.push_back(Output.getFilename());
6400 } else {
6401 assert(Output.isNothing() && "Invalid output.");
6402 }
6403
6404 if (!Args.hasArg(options::OPT_nostdlib) &&
6405 !Args.hasArg(options::OPT_nostartfiles)) {
Craig Topper92fc2df2014-05-17 16:56:41 +00006406 const char *crt1 = nullptr;
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006407 if (!Args.hasArg(options::OPT_shared)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006408 if (Args.hasArg(options::OPT_pg))
Roman Divackyafe2f232012-08-28 15:09:03 +00006409 crt1 = "gcrt1.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006410 else if (IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006411 crt1 = "Scrt1.o";
6412 else
6413 crt1 = "crt1.o";
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006414 }
Roman Divackyafe2f232012-08-28 15:09:03 +00006415 if (crt1)
6416 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
6417
6418 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
6419
Craig Topper92fc2df2014-05-17 16:56:41 +00006420 const char *crtbegin = nullptr;
Roman Divackyafe2f232012-08-28 15:09:03 +00006421 if (Args.hasArg(options::OPT_static))
6422 crtbegin = "crtbeginT.o";
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006423 else if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006424 crtbegin = "crtbeginS.o";
6425 else
6426 crtbegin = "crtbegin.o";
6427
6428 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006429 }
6430
6431 Args.AddAllArgs(CmdArgs, options::OPT_L);
Roman Divackyafe2f232012-08-28 15:09:03 +00006432 const ToolChain::path_list Paths = ToolChain.getFilePaths();
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006433 for (const auto &Path : Paths)
6434 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006435 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6436 Args.AddAllArgs(CmdArgs, options::OPT_e);
David Chisnall589a4942010-08-15 22:58:12 +00006437 Args.AddAllArgs(CmdArgs, options::OPT_s);
6438 Args.AddAllArgs(CmdArgs, options::OPT_t);
6439 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6440 Args.AddAllArgs(CmdArgs, options::OPT_r);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006441
Alp Tokerce365ca2013-12-02 12:43:03 +00006442 if (D.IsUsingLTO(Args))
6443 AddGoldPlugin(ToolChain, Args, CmdArgs);
Roman Divackyf0d7f942013-11-10 09:31:43 +00006444
Roman Divackyafe2f232012-08-28 15:09:03 +00006445 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006446
6447 if (!Args.hasArg(options::OPT_nostdlib) &&
6448 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006449 if (D.CCCIsCXX()) {
Roman Divackyafe2f232012-08-28 15:09:03 +00006450 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Roman Divacky66f22762011-02-10 16:59:40 +00006451 if (Args.hasArg(options::OPT_pg))
6452 CmdArgs.push_back("-lm_p");
6453 else
6454 CmdArgs.push_back("-lm");
Daniel Dunbar4b8ef282010-02-17 08:07:51 +00006455 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006456 // FIXME: For some reason GCC passes -lgcc and -lgcc_s before adding
6457 // the default system libraries. Just mimic this for now.
Roman Divacky66f22762011-02-10 16:59:40 +00006458 if (Args.hasArg(options::OPT_pg))
6459 CmdArgs.push_back("-lgcc_p");
6460 else
6461 CmdArgs.push_back("-lgcc");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006462 if (Args.hasArg(options::OPT_static)) {
6463 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006464 } else if (Args.hasArg(options::OPT_pg)) {
6465 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006466 } else {
6467 CmdArgs.push_back("--as-needed");
6468 CmdArgs.push_back("-lgcc_s");
6469 CmdArgs.push_back("--no-as-needed");
6470 }
6471
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006472 if (Args.hasArg(options::OPT_pthread)) {
Roman Divacky66f22762011-02-10 16:59:40 +00006473 if (Args.hasArg(options::OPT_pg))
6474 CmdArgs.push_back("-lpthread_p");
6475 else
6476 CmdArgs.push_back("-lpthread");
Matt Beaumont-Gay1fe49152011-02-10 20:35:01 +00006477 }
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006478
Roman Divacky66f22762011-02-10 16:59:40 +00006479 if (Args.hasArg(options::OPT_pg)) {
6480 if (Args.hasArg(options::OPT_shared))
6481 CmdArgs.push_back("-lc");
6482 else
6483 CmdArgs.push_back("-lc_p");
6484 CmdArgs.push_back("-lgcc_p");
6485 } else {
6486 CmdArgs.push_back("-lc");
6487 CmdArgs.push_back("-lgcc");
6488 }
6489
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006490 if (Args.hasArg(options::OPT_static)) {
6491 CmdArgs.push_back("-lgcc_eh");
Roman Divacky66f22762011-02-10 16:59:40 +00006492 } else if (Args.hasArg(options::OPT_pg)) {
6493 CmdArgs.push_back("-lgcc_eh_p");
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006494 } else {
6495 CmdArgs.push_back("--as-needed");
6496 CmdArgs.push_back("-lgcc_s");
6497 CmdArgs.push_back("--no-as-needed");
6498 }
6499 }
6500
6501 if (!Args.hasArg(options::OPT_nostdlib) &&
6502 !Args.hasArg(options::OPT_nostartfiles)) {
Alexey Samsonove65ceb92014-02-25 13:26:03 +00006503 if (Args.hasArg(options::OPT_shared) || IsPIE)
Roman Divackyafe2f232012-08-28 15:09:03 +00006504 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtendS.o")));
Roman Divackya3c50242012-09-07 13:36:21 +00006505 else
6506 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtend.o")));
Roman Divackyafe2f232012-08-28 15:09:03 +00006507 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006508 }
6509
Viktor Kutuzovaa5b5f72014-03-18 09:36:50 +00006510 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
6511
Alexey Samsonov7811d192014-02-20 13:57:37 +00006512 addProfileRT(ToolChain, Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006513
Daniel Dunbard067f7f2009-04-08 23:54:23 +00006514 const char *Exec =
Rafael Espindola236db462013-11-09 20:07:19 +00006515 Args.MakeArgString(ToolChain.GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00006516 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbard854c8d2009-04-01 19:36:32 +00006517}
Daniel Dunbarcc912342009-05-02 18:28:39 +00006518
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006519void netbsd::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6520 const InputInfo &Output,
6521 const InputInfoList &Inputs,
6522 const ArgList &Args,
6523 const char *LinkingOutput) const {
6524 ArgStringList CmdArgs;
6525
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006526 // GNU as needs different flags for creating the correct output format
6527 // on architectures with different ABIs or optional feature sets.
6528 switch (getToolChain().getArch()) {
6529 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006530 CmdArgs.push_back("--32");
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006531 break;
6532 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006533 case llvm::Triple::armeb:
6534 case llvm::Triple::thumb:
6535 case llvm::Triple::thumbeb: {
Bernard Ogden31561762013-12-12 13:27:11 +00006536 std::string MArch(arm::getARMTargetCPU(Args, getToolChain().getTriple()));
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006537 CmdArgs.push_back(Args.MakeArgString("-mcpu=" + MArch));
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006538 break;
Joerg Sonnenberger1f94da52013-12-05 21:07:29 +00006539 }
6540
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006541 case llvm::Triple::mips:
6542 case llvm::Triple::mipsel:
6543 case llvm::Triple::mips64:
6544 case llvm::Triple::mips64el: {
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006545 StringRef CPUName;
6546 StringRef ABIName;
6547 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
6548
6549 CmdArgs.push_back("-march");
6550 CmdArgs.push_back(CPUName.data());
6551
6552 CmdArgs.push_back("-mabi");
6553 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
6554
6555 if (getToolChain().getArch() == llvm::Triple::mips ||
6556 getToolChain().getArch() == llvm::Triple::mips64)
6557 CmdArgs.push_back("-EB");
6558 else
6559 CmdArgs.push_back("-EL");
6560
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006561 addAssemblerKPIC(Args, CmdArgs);
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006562 break;
6563 }
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006564
6565 case llvm::Triple::sparc:
6566 CmdArgs.push_back("-32");
6567 addAssemblerKPIC(Args, CmdArgs);
6568 break;
6569
6570 case llvm::Triple::sparcv9:
6571 CmdArgs.push_back("-64");
6572 CmdArgs.push_back("-Av9");
6573 addAssemblerKPIC(Args, CmdArgs);
6574 break;
6575
Joerg Sonnenberger25e18172014-02-19 22:16:19 +00006576 default:
6577 break;
Joerg Sonnenberger21baded2013-12-08 13:54:58 +00006578 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006579
6580 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6581 options::OPT_Xassembler);
6582
6583 CmdArgs.push_back("-o");
6584 CmdArgs.push_back(Output.getFilename());
6585
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006586 for (const auto &II : Inputs)
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006587 CmdArgs.push_back(II.getFilename());
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006588
David Chisnallddbd68f2011-09-27 22:03:18 +00006589 const char *Exec = Args.MakeArgString((getToolChain().GetProgramPath("as")));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006590 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6591}
6592
6593void netbsd::Link::ConstructJob(Compilation &C, const JobAction &JA,
6594 const InputInfo &Output,
6595 const InputInfoList &Inputs,
6596 const ArgList &Args,
6597 const char *LinkingOutput) const {
6598 const Driver &D = getToolChain().getDriver();
6599 ArgStringList CmdArgs;
6600
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00006601 if (!D.SysRoot.empty())
6602 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
6603
Joerg Sonnenberger52be0b42014-03-13 00:42:01 +00006604 CmdArgs.push_back("--eh-frame-hdr");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006605 if (Args.hasArg(options::OPT_static)) {
6606 CmdArgs.push_back("-Bstatic");
6607 } else {
6608 if (Args.hasArg(options::OPT_rdynamic))
6609 CmdArgs.push_back("-export-dynamic");
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006610 if (Args.hasArg(options::OPT_shared)) {
6611 CmdArgs.push_back("-Bshareable");
6612 } else {
6613 CmdArgs.push_back("-dynamic-linker");
6614 CmdArgs.push_back("/libexec/ld.elf_so");
6615 }
6616 }
6617
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006618 // Many NetBSD architectures support more than one ABI.
6619 // Determine the correct emulation for ld.
6620 switch (getToolChain().getArch()) {
6621 case llvm::Triple::x86:
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006622 CmdArgs.push_back("-m");
6623 CmdArgs.push_back("elf_i386");
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006624 break;
6625 case llvm::Triple::arm:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006626 case llvm::Triple::armeb:
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006627 case llvm::Triple::thumb:
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006628 case llvm::Triple::thumbeb:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006629 CmdArgs.push_back("-m");
6630 switch (getToolChain().getTriple().getEnvironment()) {
6631 case llvm::Triple::EABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006632 case llvm::Triple::GNUEABI:
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006633 CmdArgs.push_back("armelf_nbsd_eabi");
6634 break;
Joerg Sonnenberger83a33c02014-02-06 21:04:32 +00006635 case llvm::Triple::EABIHF:
6636 case llvm::Triple::GNUEABIHF:
6637 CmdArgs.push_back("armelf_nbsd_eabihf");
6638 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006639 default:
6640 CmdArgs.push_back("armelf_nbsd");
6641 break;
6642 }
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006643 break;
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006644 case llvm::Triple::mips64:
6645 case llvm::Triple::mips64el:
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006646 if (mips::hasMipsAbiArg(Args, "32")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006647 CmdArgs.push_back("-m");
6648 if (getToolChain().getArch() == llvm::Triple::mips64)
6649 CmdArgs.push_back("elf32btsmip");
6650 else
6651 CmdArgs.push_back("elf32ltsmip");
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006652 } else if (mips::hasMipsAbiArg(Args, "64")) {
Joerg Sonnenbergere7f97592014-02-02 22:59:16 +00006653 CmdArgs.push_back("-m");
6654 if (getToolChain().getArch() == llvm::Triple::mips64)
6655 CmdArgs.push_back("elf64btsmip");
6656 else
6657 CmdArgs.push_back("elf64ltsmip");
6658 }
6659 break;
Joerg Sonnenbergered3f0692014-02-19 22:40:18 +00006660
6661 case llvm::Triple::sparc:
6662 CmdArgs.push_back("-m");
6663 CmdArgs.push_back("elf32_sparc");
6664 break;
6665
6666 case llvm::Triple::sparcv9:
6667 CmdArgs.push_back("-m");
6668 CmdArgs.push_back("elf64_sparc");
6669 break;
6670
Joerg Sonnenberger6cd7deb2014-02-02 22:50:34 +00006671 default:
6672 break;
Joerg Sonnenberger25de31d2014-02-02 22:47:37 +00006673 }
6674
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006675 if (Output.isFilename()) {
6676 CmdArgs.push_back("-o");
6677 CmdArgs.push_back(Output.getFilename());
6678 } else {
6679 assert(Output.isNothing() && "Invalid output.");
6680 }
6681
6682 if (!Args.hasArg(options::OPT_nostdlib) &&
6683 !Args.hasArg(options::OPT_nostartfiles)) {
6684 if (!Args.hasArg(options::OPT_shared)) {
6685 CmdArgs.push_back(Args.MakeArgString(
6686 getToolChain().GetFilePath("crt0.o")));
6687 CmdArgs.push_back(Args.MakeArgString(
6688 getToolChain().GetFilePath("crti.o")));
6689 CmdArgs.push_back(Args.MakeArgString(
6690 getToolChain().GetFilePath("crtbegin.o")));
6691 } else {
6692 CmdArgs.push_back(Args.MakeArgString(
6693 getToolChain().GetFilePath("crti.o")));
6694 CmdArgs.push_back(Args.MakeArgString(
6695 getToolChain().GetFilePath("crtbeginS.o")));
6696 }
6697 }
6698
6699 Args.AddAllArgs(CmdArgs, options::OPT_L);
6700 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
6701 Args.AddAllArgs(CmdArgs, options::OPT_e);
6702 Args.AddAllArgs(CmdArgs, options::OPT_s);
6703 Args.AddAllArgs(CmdArgs, options::OPT_t);
6704 Args.AddAllArgs(CmdArgs, options::OPT_Z_Flag);
6705 Args.AddAllArgs(CmdArgs, options::OPT_r);
6706
6707 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
6708
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006709 unsigned Major, Minor, Micro;
6710 getToolChain().getTriple().getOSVersion(Major, Minor, Micro);
6711 bool useLibgcc = true;
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00006712 if (Major >= 7 || (Major == 6 && Minor == 99 && Micro >= 40) || Major == 0) {
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006713 switch(getToolChain().getArch()) {
Joerg Sonnenberger1ea66472014-05-07 08:45:26 +00006714 case llvm::Triple::arm:
6715 case llvm::Triple::armeb:
6716 case llvm::Triple::thumb:
6717 case llvm::Triple::thumbeb:
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006718 case llvm::Triple::x86:
6719 case llvm::Triple::x86_64:
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006720 useLibgcc = false;
Joerg Sonnenbergerd769a1e2014-01-18 00:50:49 +00006721 break;
6722 default:
6723 break;
6724 }
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006725 }
6726
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006727 if (!Args.hasArg(options::OPT_nostdlib) &&
6728 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006729 if (D.CCCIsCXX()) {
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006730 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
6731 CmdArgs.push_back("-lm");
6732 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006733 if (Args.hasArg(options::OPT_pthread))
6734 CmdArgs.push_back("-lpthread");
6735 CmdArgs.push_back("-lc");
6736
Joerg Sonnenbergera4435632013-10-14 20:13:05 +00006737 if (useLibgcc) {
6738 if (Args.hasArg(options::OPT_static)) {
6739 // libgcc_eh depends on libc, so resolve as much as possible,
6740 // pull in any new requirements from libc and then get the rest
6741 // of libgcc.
6742 CmdArgs.push_back("-lgcc_eh");
6743 CmdArgs.push_back("-lc");
6744 CmdArgs.push_back("-lgcc");
6745 } else {
6746 CmdArgs.push_back("-lgcc");
6747 CmdArgs.push_back("--as-needed");
6748 CmdArgs.push_back("-lgcc_s");
6749 CmdArgs.push_back("--no-as-needed");
6750 }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006751 }
6752 }
6753
6754 if (!Args.hasArg(options::OPT_nostdlib) &&
6755 !Args.hasArg(options::OPT_nostartfiles)) {
6756 if (!Args.hasArg(options::OPT_shared))
6757 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6758 "crtend.o")));
6759 else
6760 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6761 "crtendS.o")));
6762 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath(
6763 "crtn.o")));
6764 }
6765
Alexey Samsonov7811d192014-02-20 13:57:37 +00006766 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00006767
Rafael Espindola236db462013-11-09 20:07:19 +00006768 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +00006769 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
6770}
6771
Thomas Schwinge4e555262013-03-28 19:04:25 +00006772void gnutools::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
6773 const InputInfo &Output,
6774 const InputInfoList &Inputs,
6775 const ArgList &Args,
6776 const char *LinkingOutput) const {
Rafael Espindola92b00932010-08-10 00:25:48 +00006777 ArgStringList CmdArgs;
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006778 bool NeedsKPIC = false;
Rafael Espindola92b00932010-08-10 00:25:48 +00006779
6780 // Add --32/--64 to make sure we get the format we want.
6781 // This is incomplete
6782 if (getToolChain().getArch() == llvm::Triple::x86) {
6783 CmdArgs.push_back("--32");
6784 } else if (getToolChain().getArch() == llvm::Triple::x86_64) {
6785 CmdArgs.push_back("--64");
Eli Friedman4a4932c2011-11-28 23:46:52 +00006786 } else if (getToolChain().getArch() == llvm::Triple::ppc) {
6787 CmdArgs.push_back("-a32");
6788 CmdArgs.push_back("-mppc");
6789 CmdArgs.push_back("-many");
6790 } else if (getToolChain().getArch() == llvm::Triple::ppc64) {
6791 CmdArgs.push_back("-a64");
6792 CmdArgs.push_back("-mppc64");
6793 CmdArgs.push_back("-many");
Bill Schmidt778d3872013-07-26 01:36:11 +00006794 } else if (getToolChain().getArch() == llvm::Triple::ppc64le) {
6795 CmdArgs.push_back("-a64");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006796 CmdArgs.push_back("-mppc64");
Bill Schmidt778d3872013-07-26 01:36:11 +00006797 CmdArgs.push_back("-many");
Will Schmidtc1fc1902014-03-24 17:10:37 +00006798 CmdArgs.push_back("-mlittle-endian");
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006799 } else if (getToolChain().getArch() == llvm::Triple::sparc) {
6800 CmdArgs.push_back("-32");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006801 CmdArgs.push_back("-Av8plusa");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006802 NeedsKPIC = true;
Jakob Stoklund Olesen2490e552014-01-10 03:51:29 +00006803 } else if (getToolChain().getArch() == llvm::Triple::sparcv9) {
6804 CmdArgs.push_back("-64");
Jakob Stoklund Olesen58801bf2014-01-11 18:25:01 +00006805 CmdArgs.push_back("-Av9a");
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006806 NeedsKPIC = true;
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006807 } else if (getToolChain().getArch() == llvm::Triple::arm ||
6808 getToolChain().getArch() == llvm::Triple::armeb) {
Chris Lattner0e62c1c2011-07-23 10:55:15 +00006809 StringRef MArch = getToolChain().getArchName();
Rafael Espindola92b00932010-08-10 00:25:48 +00006810 if (MArch == "armv7" || MArch == "armv7a" || MArch == "armv7-a")
6811 CmdArgs.push_back("-mfpu=neon");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006812 if (MArch == "armv8" || MArch == "armv8a" || MArch == "armv8-a" ||
6813 MArch == "armebv8" || MArch == "armebv8a" || MArch == "armebv8-a")
Bernard Ogdena58ef052013-10-24 18:32:41 +00006814 CmdArgs.push_back("-mfpu=crypto-neon-fp-armv8");
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006815
Tim Northover9c7e0352013-12-12 11:55:52 +00006816 StringRef ARMFloatABI = tools::arm::getARMFloatABI(
6817 getToolChain().getDriver(), Args, getToolChain().getTriple());
Evgeniy Stepanoved943f62012-04-20 09:03:40 +00006818 CmdArgs.push_back(Args.MakeArgString("-mfloat-abi=" + ARMFloatABI));
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006819
6820 Args.AddLastArg(CmdArgs, options::OPT_march_EQ);
Ana Pazosdd6068d2013-12-06 22:43:17 +00006821
6822 // FIXME: remove krait check when GNU tools support krait cpu
6823 // for now replace it with -march=armv7-a to avoid a lower
6824 // march from being picked in the absence of a cpu flag.
6825 Arg *A;
6826 if ((A = Args.getLastArg(options::OPT_mcpu_EQ)) &&
6827 StringRef(A->getValue()) == "krait")
6828 CmdArgs.push_back("-march=armv7-a");
6829 else
6830 Args.AddLastArg(CmdArgs, options::OPT_mcpu_EQ);
Evgeniy Stepanov582911a2012-04-24 09:05:31 +00006831 Args.AddLastArg(CmdArgs, options::OPT_mfpu_EQ);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006832 } else if (getToolChain().getArch() == llvm::Triple::mips ||
6833 getToolChain().getArch() == llvm::Triple::mipsel ||
6834 getToolChain().getArch() == llvm::Triple::mips64 ||
6835 getToolChain().getArch() == llvm::Triple::mips64el) {
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006836 StringRef CPUName;
6837 StringRef ABIName;
Rafael Espindola22ce34a2013-08-20 22:12:08 +00006838 getMipsCPUAndABI(Args, getToolChain().getTriple(), CPUName, ABIName);
Akira Hatanaka5e9dde32011-11-30 19:31:38 +00006839
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006840 CmdArgs.push_back("-march");
6841 CmdArgs.push_back(CPUName.data());
6842
Simon Atanasyan571d7bd2012-04-07 22:31:29 +00006843 CmdArgs.push_back("-mabi");
Simon Atanasyan0da400c2013-02-27 14:55:49 +00006844 CmdArgs.push_back(getGnuCompatibleMipsABIName(ABIName).data());
Simon Atanasyan2390aa12012-04-06 19:15:24 +00006845
6846 if (getToolChain().getArch() == llvm::Triple::mips ||
6847 getToolChain().getArch() == llvm::Triple::mips64)
6848 CmdArgs.push_back("-EB");
6849 else
6850 CmdArgs.push_back("-EL");
Simon Atanasyan217dc2d2012-05-29 19:07:33 +00006851
Simon Atanasyan22127ce2013-09-24 09:09:16 +00006852 if (Arg *A = Args.getLastArg(options::OPT_mnan_EQ)) {
6853 if (StringRef(A->getValue()) == "2008")
6854 CmdArgs.push_back(Args.MakeArgString("-mnan=2008"));
6855 }
6856
Simon Atanasyan8cc7c122013-11-26 11:57:58 +00006857 Args.AddLastArg(CmdArgs, options::OPT_mfp32, options::OPT_mfp64);
Simon Atanasyan036d16d2013-04-30 07:47:13 +00006858 Args.AddLastArg(CmdArgs, options::OPT_mips16, options::OPT_mno_mips16);
6859 Args.AddLastArg(CmdArgs, options::OPT_mmicromips,
6860 options::OPT_mno_micromips);
6861 Args.AddLastArg(CmdArgs, options::OPT_mdsp, options::OPT_mno_dsp);
6862 Args.AddLastArg(CmdArgs, options::OPT_mdspr2, options::OPT_mno_dspr2);
6863
Simon Atanasyanbd986632013-11-26 11:58:04 +00006864 if (Arg *A = Args.getLastArg(options::OPT_mmsa, options::OPT_mno_msa)) {
6865 // Do not use AddLastArg because not all versions of MIPS assembler
6866 // support -mmsa / -mno-msa options.
6867 if (A->getOption().matches(options::OPT_mmsa))
6868 CmdArgs.push_back(Args.MakeArgString("-mmsa"));
6869 }
6870
Jakob Stoklund Olesen8d7f5062014-01-12 04:53:36 +00006871 NeedsKPIC = true;
6872 } else if (getToolChain().getArch() == llvm::Triple::systemz) {
6873 // Always pass an -march option, since our default of z10 is later
6874 // than the GNU assembler's default.
6875 StringRef CPUName = getSystemZTargetCPU(Args);
6876 CmdArgs.push_back(Args.MakeArgString("-march=" + CPUName));
6877 }
6878
Joerg Sonnenbergerc151b022014-02-19 21:58:52 +00006879 if (NeedsKPIC)
6880 addAssemblerKPIC(Args, CmdArgs);
Rafael Espindola92b00932010-08-10 00:25:48 +00006881
6882 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
6883 options::OPT_Xassembler);
6884
6885 CmdArgs.push_back("-o");
6886 CmdArgs.push_back(Output.getFilename());
6887
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006888 for (const auto &II : Inputs)
Rafael Espindola92b00932010-08-10 00:25:48 +00006889 CmdArgs.push_back(II.getFilename());
Rafael Espindola92b00932010-08-10 00:25:48 +00006890
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00006891 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Rafael Espindola92b00932010-08-10 00:25:48 +00006892 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Eric Christopher30aa6b62013-06-05 23:58:15 +00006893
6894 // Handle the debug info splitting at object creation time if we're
6895 // creating an object.
6896 // TODO: Currently only works on linux with newer objcopy.
6897 if (Args.hasArg(options::OPT_gsplit_dwarf) &&
Cameron Esfahani556d91e2013-09-14 01:09:11 +00006898 getToolChain().getTriple().isOSLinux())
Eric Christopher30aa6b62013-06-05 23:58:15 +00006899 SplitDebugInfo(getToolChain(), C, *this, JA, Args, Output,
6900 SplitDebugName(Args, Inputs));
Rafael Espindola92b00932010-08-10 00:25:48 +00006901}
6902
Benjamin Kramer9299637dc2014-03-04 19:31:42 +00006903static void AddLibgcc(const llvm::Triple &Triple, const Driver &D,
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006904 ArgStringList &CmdArgs, const ArgList &Args) {
Logan Chienc6fd8202012-09-02 09:30:11 +00006905 bool isAndroid = Triple.getEnvironment() == llvm::Triple::Android;
Chandler Carruth58d6eb62013-03-04 02:07:55 +00006906 bool StaticLibgcc = Args.hasArg(options::OPT_static_libgcc) ||
6907 Args.hasArg(options::OPT_static);
Hans Wennborg70850d82013-07-18 20:29:38 +00006908 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006909 CmdArgs.push_back("-lgcc");
6910
Logan Chien3d3373c2012-11-19 12:04:11 +00006911 if (StaticLibgcc || isAndroid) {
Hans Wennborg70850d82013-07-18 20:29:38 +00006912 if (D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006913 CmdArgs.push_back("-lgcc");
6914 } else {
Hans Wennborg70850d82013-07-18 20:29:38 +00006915 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006916 CmdArgs.push_back("--as-needed");
6917 CmdArgs.push_back("-lgcc_s");
Hans Wennborg70850d82013-07-18 20:29:38 +00006918 if (!D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006919 CmdArgs.push_back("--no-as-needed");
6920 }
6921
Evgeniy Stepanov77866712012-04-25 08:59:22 +00006922 if (StaticLibgcc && !isAndroid)
Rafael Espindolacc354322011-10-17 21:39:04 +00006923 CmdArgs.push_back("-lgcc_eh");
Hans Wennborg70850d82013-07-18 20:29:38 +00006924 else if (!Args.hasArg(options::OPT_shared) && D.CCCIsCXX())
Rafael Espindolacc354322011-10-17 21:39:04 +00006925 CmdArgs.push_back("-lgcc");
Logan Chien3d3373c2012-11-19 12:04:11 +00006926
6927 // According to Android ABI, we have to link with libdl if we are
6928 // linking with non-static libgcc.
6929 //
6930 // NOTE: This fixes a link error on Android MIPS as well. The non-static
6931 // libgcc for MIPS relies on _Unwind_Find_FDE and dl_iterate_phdr from libdl.
6932 if (isAndroid && !StaticLibgcc)
6933 CmdArgs.push_back("-ldl");
Rafael Espindolacc354322011-10-17 21:39:04 +00006934}
6935
Simon Atanasyan14ce18d2014-06-25 05:00:59 +00006936static StringRef getLinuxDynamicLinker(const ArgList &Args,
6937 const toolchains::Linux &ToolChain) {
Alexey Bataevcf7ae302014-01-23 09:08:32 +00006938 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::Android) {
6939 if (ToolChain.getTriple().isArch64Bit())
6940 return "/system/bin/linker64";
6941 else
6942 return "/system/bin/linker";
6943 } else if (ToolChain.getArch() == llvm::Triple::x86 ||
6944 ToolChain.getArch() == llvm::Triple::sparc)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006945 return "/lib/ld-linux.so.2";
Tim Northovera2ee4332014-03-29 15:09:45 +00006946 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
6947 ToolChain.getArch() == llvm::Triple::arm64)
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006948 return "/lib/ld-linux-aarch64.so.1";
James Molloy2b24fc42014-04-17 12:51:23 +00006949 else if (ToolChain.getArch() == llvm::Triple::aarch64_be ||
6950 ToolChain.getArch() == llvm::Triple::arm64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00006951 return "/lib/ld-linux-aarch64_be.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006952 else if (ToolChain.getArch() == llvm::Triple::arm ||
6953 ToolChain.getArch() == llvm::Triple::thumb) {
6954 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6955 return "/lib/ld-linux-armhf.so.3";
6956 else
6957 return "/lib/ld-linux.so.3";
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00006958 } else if (ToolChain.getArch() == llvm::Triple::armeb ||
6959 ToolChain.getArch() == llvm::Triple::thumbeb) {
6960 if (ToolChain.getTriple().getEnvironment() == llvm::Triple::GNUEABIHF)
6961 return "/lib/ld-linux-armhf.so.3"; /* TODO: check which dynamic linker name. */
6962 else
6963 return "/lib/ld-linux.so.3"; /* TODO: check which dynamic linker name. */
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006964 } else if (ToolChain.getArch() == llvm::Triple::mips ||
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006965 ToolChain.getArch() == llvm::Triple::mipsel) {
6966 if (mips::isNaN2008(Args))
6967 return "/lib/ld-linux-mipsn8.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006968 return "/lib/ld.so.1";
Daniel Sanders3b92c5b2014-06-24 15:04:16 +00006969 } else if (ToolChain.getArch() == llvm::Triple::mips64 ||
NAKAMURA Takumid3235e02014-06-25 04:34:00 +00006970 ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00006971 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan14ce18d2014-06-25 05:00:59 +00006972 return mips::isNaN2008(Args) ? "/lib32/ld-linux-mipsn8.so.1"
6973 : "/lib32/ld.so.1";
6974 return mips::isNaN2008(Args) ? "/lib64/ld-linux-mipsn8.so.1"
6975 : "/lib64/ld.so.1";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006976 } else if (ToolChain.getArch() == llvm::Triple::ppc)
6977 return "/lib/ld.so.1";
6978 else if (ToolChain.getArch() == llvm::Triple::ppc64 ||
6979 ToolChain.getArch() == llvm::Triple::systemz)
6980 return "/lib64/ld64.so.1";
Ulrich Weigand68e902c2014-06-20 14:19:02 +00006981 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
6982 return "/lib64/ld64.so.2";
Jakob Stoklund Olesen73cb84c2014-01-10 08:18:34 +00006983 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
6984 return "/lib64/ld-linux.so.2";
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00006985 else
6986 return "/lib64/ld-linux-x86-64.so.2";
6987}
6988
Renato Golinc4b49242014-02-13 10:01:16 +00006989static void AddRunTimeLibs(const ToolChain &TC, const Driver &D,
6990 ArgStringList &CmdArgs, const ArgList &Args) {
6991 // Make use of compiler-rt if --rtlib option is used
6992 ToolChain::RuntimeLibType RLT = TC.GetRuntimeLibType(Args);
6993
6994 switch(RLT) {
6995 case ToolChain::RLT_CompilerRT:
6996 addClangRTLinux(TC, Args, CmdArgs);
6997 break;
6998 case ToolChain::RLT_Libgcc:
6999 AddLibgcc(TC.getTriple(), D, CmdArgs, Args);
7000 break;
Renato Golinc4b49242014-02-13 10:01:16 +00007001 }
7002}
7003
Thomas Schwinge4e555262013-03-28 19:04:25 +00007004void gnutools::Link::ConstructJob(Compilation &C, const JobAction &JA,
7005 const InputInfo &Output,
7006 const InputInfoList &Inputs,
7007 const ArgList &Args,
7008 const char *LinkingOutput) const {
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007009 const toolchains::Linux& ToolChain =
7010 static_cast<const toolchains::Linux&>(getToolChain());
7011 const Driver &D = ToolChain.getDriver();
Rafael Espindola7df35012012-11-02 20:41:30 +00007012 const bool isAndroid =
7013 ToolChain.getTriple().getEnvironment() == llvm::Triple::Android;
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007014 const bool IsPIE =
7015 !Args.hasArg(options::OPT_shared) &&
Alexey Volkov06921032014-04-29 10:25:20 +00007016 !Args.hasArg(options::OPT_static) &&
7017 (Args.hasArg(options::OPT_pie) || ToolChain.isPIEDefault() ||
7018 // On Android every code is PIC so every executable is PIE
Alexey Volkov6468f5d2014-04-29 12:07:34 +00007019 // Cannot use isPIEDefault here since otherwise
7020 // PIE only logic will be enabled during compilation
Alexey Volkov06921032014-04-29 10:25:20 +00007021 isAndroid);
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007022
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007023 ArgStringList CmdArgs;
7024
Rafael Espindolad1002f62010-11-15 18:28:16 +00007025 // Silence warning for "clang -g foo.o -o foo"
7026 Args.ClaimAllArgs(options::OPT_g_Group);
Rafael Espindolad95a8122011-03-01 05:25:27 +00007027 // and "clang -emit-llvm foo.o -o foo"
7028 Args.ClaimAllArgs(options::OPT_emit_llvm);
David Chisnall5f99f482012-07-29 15:24:44 +00007029 // and for "clang -w foo.o -o foo". Other warning options are already
Rafael Espindolaf92614c2010-11-17 20:37:10 +00007030 // handled somewhere else.
7031 Args.ClaimAllArgs(options::OPT_w);
Rafael Espindolad1002f62010-11-15 18:28:16 +00007032
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007033 if (!D.SysRoot.empty())
7034 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007035
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007036 if (IsPIE)
Rafael Espindolad47ac232010-11-17 22:26:15 +00007037 CmdArgs.push_back("-pie");
7038
Rafael Espindola1c76c592010-11-07 22:57:16 +00007039 if (Args.hasArg(options::OPT_rdynamic))
7040 CmdArgs.push_back("-export-dynamic");
7041
Rafael Espindola34d77dc2010-11-11 19:34:42 +00007042 if (Args.hasArg(options::OPT_s))
7043 CmdArgs.push_back("-s");
7044
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007045 for (const auto &Opt : ToolChain.ExtraOpts)
7046 CmdArgs.push_back(Opt.c_str());
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007047
7048 if (!Args.hasArg(options::OPT_static)) {
7049 CmdArgs.push_back("--eh-frame-hdr");
7050 }
7051
7052 CmdArgs.push_back("-m");
7053 if (ToolChain.getArch() == llvm::Triple::x86)
7054 CmdArgs.push_back("elf_i386");
Tim Northovera2ee4332014-03-29 15:09:45 +00007055 else if (ToolChain.getArch() == llvm::Triple::aarch64 ||
7056 ToolChain.getArch() == llvm::Triple::arm64)
Tim Northover9bb857a2013-01-31 12:13:10 +00007057 CmdArgs.push_back("aarch64linux");
James Molloy2b24fc42014-04-17 12:51:23 +00007058 else if (ToolChain.getArch() == llvm::Triple::aarch64_be ||
7059 ToolChain.getArch() == llvm::Triple::arm64_be)
Christian Pirkera74c7912014-03-14 12:15:45 +00007060 CmdArgs.push_back("aarch64_be_linux");
Eric Christopher84fbdb42011-08-19 00:30:14 +00007061 else if (ToolChain.getArch() == llvm::Triple::arm
Douglas Gregord9bb1522011-03-06 19:11:49 +00007062 || ToolChain.getArch() == llvm::Triple::thumb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007063 CmdArgs.push_back("armelf_linux_eabi");
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007064 else if (ToolChain.getArch() == llvm::Triple::armeb
7065 || ToolChain.getArch() == llvm::Triple::thumbeb)
7066 CmdArgs.push_back("armebelf_linux_eabi"); /* TODO: check which NAME. */
Ted Kremenek43d47cc2011-04-05 22:04:27 +00007067 else if (ToolChain.getArch() == llvm::Triple::ppc)
7068 CmdArgs.push_back("elf32ppclinux");
7069 else if (ToolChain.getArch() == llvm::Triple::ppc64)
7070 CmdArgs.push_back("elf64ppc");
Will Schmidtc1fc1902014-03-24 17:10:37 +00007071 else if (ToolChain.getArch() == llvm::Triple::ppc64le)
7072 CmdArgs.push_back("elf64lppc");
Jakob Stoklund Olesen91a8e032014-01-10 03:51:33 +00007073 else if (ToolChain.getArch() == llvm::Triple::sparc)
7074 CmdArgs.push_back("elf32_sparc");
7075 else if (ToolChain.getArch() == llvm::Triple::sparcv9)
7076 CmdArgs.push_back("elf64_sparc");
Eli Friedman27b8c4f2011-11-08 19:43:37 +00007077 else if (ToolChain.getArch() == llvm::Triple::mips)
7078 CmdArgs.push_back("elf32btsmip");
7079 else if (ToolChain.getArch() == llvm::Triple::mipsel)
7080 CmdArgs.push_back("elf32ltsmip");
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007081 else if (ToolChain.getArch() == llvm::Triple::mips64) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007082 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007083 CmdArgs.push_back("elf32btsmipn32");
7084 else
7085 CmdArgs.push_back("elf64btsmip");
7086 }
7087 else if (ToolChain.getArch() == llvm::Triple::mips64el) {
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +00007088 if (mips::hasMipsAbiArg(Args, "n32"))
Simon Atanasyan2d1b1ad2012-10-21 11:44:57 +00007089 CmdArgs.push_back("elf32ltsmipn32");
7090 else
7091 CmdArgs.push_back("elf64ltsmip");
7092 }
Ulrich Weigand47445072013-05-06 16:26:41 +00007093 else if (ToolChain.getArch() == llvm::Triple::systemz)
7094 CmdArgs.push_back("elf64_s390");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007095 else
7096 CmdArgs.push_back("elf_x86_64");
7097
7098 if (Args.hasArg(options::OPT_static)) {
Joerg Sonnenberger1e205ef2014-02-02 22:36:13 +00007099 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007100 ToolChain.getArch() == llvm::Triple::armeb ||
7101 ToolChain.getArch() == llvm::Triple::thumb ||
7102 ToolChain.getArch() == llvm::Triple::thumbeb)
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007103 CmdArgs.push_back("-Bstatic");
7104 else
7105 CmdArgs.push_back("-static");
7106 } else if (Args.hasArg(options::OPT_shared)) {
7107 CmdArgs.push_back("-shared");
Rafael Espindola7df35012012-11-02 20:41:30 +00007108 if (isAndroid) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007109 CmdArgs.push_back("-Bsymbolic");
7110 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007111 }
7112
7113 if (ToolChain.getArch() == llvm::Triple::arm ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007114 ToolChain.getArch() == llvm::Triple::armeb ||
Douglas Gregord9bb1522011-03-06 19:11:49 +00007115 ToolChain.getArch() == llvm::Triple::thumb ||
Christian Pirkerf01cd6f2014-03-28 14:40:46 +00007116 ToolChain.getArch() == llvm::Triple::thumbeb ||
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007117 (!Args.hasArg(options::OPT_static) &&
7118 !Args.hasArg(options::OPT_shared))) {
7119 CmdArgs.push_back("-dynamic-linker");
Peter Collingbourne9d9e1fc2013-05-27 21:40:20 +00007120 CmdArgs.push_back(Args.MakeArgString(
7121 D.DyldPrefix + getLinuxDynamicLinker(Args, ToolChain)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007122 }
7123
7124 CmdArgs.push_back("-o");
7125 CmdArgs.push_back(Output.getFilename());
7126
Rafael Espindola81937ec2010-12-01 01:52:43 +00007127 if (!Args.hasArg(options::OPT_nostdlib) &&
7128 !Args.hasArg(options::OPT_nostartfiles)) {
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007129 if (!isAndroid) {
Craig Topper92fc2df2014-05-17 16:56:41 +00007130 const char *crt1 = nullptr;
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007131 if (!Args.hasArg(options::OPT_shared)){
Eric Christopherac021742013-06-07 23:25:01 +00007132 if (Args.hasArg(options::OPT_pg))
7133 crt1 = "gcrt1.o";
7134 else if (IsPIE)
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007135 crt1 = "Scrt1.o";
7136 else
7137 crt1 = "crt1.o";
7138 }
7139 if (crt1)
7140 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crt1)));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007141
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007142 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crti.o")));
7143 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007144
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007145 const char *crtbegin;
7146 if (Args.hasArg(options::OPT_static))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007147 crtbegin = isAndroid ? "crtbegin_static.o" : "crtbeginT.o";
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007148 else if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007149 crtbegin = isAndroid ? "crtbegin_so.o" : "crtbeginS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007150 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007151 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbeginS.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007152 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007153 crtbegin = isAndroid ? "crtbegin_dynamic.o" : "crtbegin.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007154 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtbegin)));
Benjamin Kramer058666a2012-10-04 19:42:20 +00007155
7156 // Add crtfastmath.o if available and fast math is enabled.
7157 ToolChain.AddFastMathRuntimeIfAvailable(Args, CmdArgs);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007158 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007159
7160 Args.AddAllArgs(CmdArgs, options::OPT_L);
7161
7162 const ToolChain::path_list Paths = ToolChain.getFilePaths();
7163
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007164 for (const auto &Path : Paths)
7165 CmdArgs.push_back(Args.MakeArgString(StringRef("-L") + Path));
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007166
Alp Tokerce365ca2013-12-02 12:43:03 +00007167 if (D.IsUsingLTO(Args))
7168 AddGoldPlugin(ToolChain, Args, CmdArgs);
Chandler Carruth953fb082013-01-13 11:46:33 +00007169
Nick Lewycky2fe6aab2012-08-17 03:39:16 +00007170 if (Args.hasArg(options::OPT_Z_Xlinker__no_demangle))
7171 CmdArgs.push_back("--no-demangle");
7172
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007173 AddLinkerInputs(ToolChain, Inputs, Args, CmdArgs);
7174
Alexey Samsonovce8ab102014-02-25 12:43:43 +00007175 addSanitizerRuntimes(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007176 // The profile runtime also needs access to system libraries.
Alexey Samsonov7811d192014-02-20 13:57:37 +00007177 addProfileRT(getToolChain(), Args, CmdArgs);
Chandler Carruthe4458b32013-06-24 09:38:45 +00007178
Hans Wennborg70850d82013-07-18 20:29:38 +00007179 if (D.CCCIsCXX() &&
Chandler Carruth94a32012012-05-14 18:31:18 +00007180 !Args.hasArg(options::OPT_nostdlib) &&
7181 !Args.hasArg(options::OPT_nodefaultlibs)) {
Rafael Espindola70b8d762011-10-17 22:14:51 +00007182 bool OnlyLibstdcxxStatic = Args.hasArg(options::OPT_static_libstdcxx) &&
7183 !Args.hasArg(options::OPT_static);
7184 if (OnlyLibstdcxxStatic)
7185 CmdArgs.push_back("-Bstatic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007186 ToolChain.AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola70b8d762011-10-17 22:14:51 +00007187 if (OnlyLibstdcxxStatic)
7188 CmdArgs.push_back("-Bdynamic");
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007189 CmdArgs.push_back("-lm");
7190 }
7191
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007192 if (!Args.hasArg(options::OPT_nostdlib)) {
Chandler Carruth94a32012012-05-14 18:31:18 +00007193 if (!Args.hasArg(options::OPT_nodefaultlibs)) {
7194 if (Args.hasArg(options::OPT_static))
7195 CmdArgs.push_back("--start-group");
Nick Lewycky97864da2011-06-04 06:27:06 +00007196
Alexey Bataev186b28a2014-03-06 05:43:53 +00007197 LibOpenMP UsedOpenMPLib = LibUnknown;
7198 if (Args.hasArg(options::OPT_fopenmp)) {
7199 UsedOpenMPLib = LibGOMP;
7200 } else if (const Arg *A = Args.getLastArg(options::OPT_fopenmp_EQ)) {
7201 UsedOpenMPLib = llvm::StringSwitch<LibOpenMP>(A->getValue())
7202 .Case("libgomp", LibGOMP)
7203 .Case("libiomp5", LibIOMP5)
7204 .Default(LibUnknown);
7205 if (UsedOpenMPLib == LibUnknown)
7206 D.Diag(diag::err_drv_unsupported_option_argument)
7207 << A->getOption().getName() << A->getValue();
7208 }
7209 switch (UsedOpenMPLib) {
7210 case LibGOMP:
Chandler Carruth01538002013-01-17 13:19:29 +00007211 CmdArgs.push_back("-lgomp");
7212
Alp Tokerf6a24ce2013-12-05 16:25:25 +00007213 // FIXME: Exclude this for platforms with libgomp that don't require
7214 // librt. Most modern Linux platforms require it, but some may not.
Chandler Carruth01538002013-01-17 13:19:29 +00007215 CmdArgs.push_back("-lrt");
Alexey Bataev186b28a2014-03-06 05:43:53 +00007216 break;
7217 case LibIOMP5:
7218 CmdArgs.push_back("-liomp5");
7219 break;
7220 case LibUnknown:
7221 break;
Chandler Carruth01538002013-01-17 13:19:29 +00007222 }
Renato Golinc4b49242014-02-13 10:01:16 +00007223 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007224
Evgeniy Stepanovdad92062014-06-05 11:41:39 +00007225 if ((Args.hasArg(options::OPT_pthread) ||
7226 Args.hasArg(options::OPT_pthreads) || UsedOpenMPLib != LibUnknown) &&
7227 !isAndroid)
Chandler Carruth94a32012012-05-14 18:31:18 +00007228 CmdArgs.push_back("-lpthread");
7229
7230 CmdArgs.push_back("-lc");
7231
7232 if (Args.hasArg(options::OPT_static))
7233 CmdArgs.push_back("--end-group");
7234 else
Renato Golinc4b49242014-02-13 10:01:16 +00007235 AddRunTimeLibs(ToolChain, D, CmdArgs, Args);
Chandler Carruth94a32012012-05-14 18:31:18 +00007236 }
Rafael Espindolad47ac232010-11-17 22:26:15 +00007237
Rafael Espindola81937ec2010-12-01 01:52:43 +00007238 if (!Args.hasArg(options::OPT_nostartfiles)) {
7239 const char *crtend;
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007240 if (Args.hasArg(options::OPT_shared))
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007241 crtend = isAndroid ? "crtend_so.o" : "crtendS.o";
Peter Collingbourne54d770c2013-04-09 04:35:11 +00007242 else if (IsPIE)
Evgeniy Stepanovc9cde482012-09-10 10:30:12 +00007243 crtend = isAndroid ? "crtend_android.o" : "crtendS.o";
Rafael Espindola81937ec2010-12-01 01:52:43 +00007244 else
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007245 crtend = isAndroid ? "crtend_android.o" : "crtend.o";
Rafael Espindola9aa60e92010-11-12 03:00:39 +00007246
Rafael Espindola81937ec2010-12-01 01:52:43 +00007247 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath(crtend)));
Evgeniy Stepanov77866712012-04-25 08:59:22 +00007248 if (!isAndroid)
7249 CmdArgs.push_back(Args.MakeArgString(ToolChain.GetFilePath("crtn.o")));
Rafael Espindola81937ec2010-12-01 01:52:43 +00007250 }
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007251 }
7252
Rafael Espindolac8f008f2010-11-07 20:14:31 +00007253 C.addCommand(new Command(JA, *this, ToolChain.Linker.c_str(), CmdArgs));
7254}
Rafael Espindola92b00932010-08-10 00:25:48 +00007255
Chris Lattner3e2ee142010-07-07 16:01:42 +00007256void minix::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007257 const InputInfo &Output,
7258 const InputInfoList &Inputs,
7259 const ArgList &Args,
7260 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007261 ArgStringList CmdArgs;
7262
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007263 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007264
7265 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007266 CmdArgs.push_back(Output.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007267
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007268 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007269 CmdArgs.push_back(II.getFilename());
Chris Lattner3e2ee142010-07-07 16:01:42 +00007270
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007271 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007272 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007273}
7274
7275void minix::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007276 const InputInfo &Output,
7277 const InputInfoList &Inputs,
7278 const ArgList &Args,
7279 const char *LinkingOutput) const {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007280 const Driver &D = getToolChain().getDriver();
7281 ArgStringList CmdArgs;
7282
Daniel Dunbarb440f562010-08-02 02:38:21 +00007283 if (Output.isFilename()) {
Chris Lattner3e2ee142010-07-07 16:01:42 +00007284 CmdArgs.push_back("-o");
7285 CmdArgs.push_back(Output.getFilename());
7286 } else {
7287 assert(Output.isNothing() && "Invalid output.");
7288 }
7289
7290 if (!Args.hasArg(options::OPT_nostdlib) &&
Eli Friedman83de5132011-12-08 23:54:21 +00007291 !Args.hasArg(options::OPT_nostartfiles)) {
7292 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crt1.o")));
7293 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crti.o")));
7294 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtbegin.o")));
7295 CmdArgs.push_back(Args.MakeArgString(getToolChain().GetFilePath("crtn.o")));
7296 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007297
7298 Args.AddAllArgs(CmdArgs, options::OPT_L);
7299 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7300 Args.AddAllArgs(CmdArgs, options::OPT_e);
7301
Daniel Dunbar54423b22010-09-17 00:24:54 +00007302 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007303
Alexey Samsonov7811d192014-02-20 13:57:37 +00007304 addProfileRT(getToolChain(), Args, CmdArgs);
Eli Friedman83de5132011-12-08 23:54:21 +00007305
Chris Lattner3e2ee142010-07-07 16:01:42 +00007306 if (!Args.hasArg(options::OPT_nostdlib) &&
7307 !Args.hasArg(options::OPT_nodefaultlibs)) {
Hans Wennborg70850d82013-07-18 20:29:38 +00007308 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007309 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Chris Lattner3e2ee142010-07-07 16:01:42 +00007310 CmdArgs.push_back("-lm");
7311 }
Chris Lattner3e2ee142010-07-07 16:01:42 +00007312 }
7313
7314 if (!Args.hasArg(options::OPT_nostdlib) &&
7315 !Args.hasArg(options::OPT_nostartfiles)) {
Eli Friedman83de5132011-12-08 23:54:21 +00007316 if (Args.hasArg(options::OPT_pthread))
7317 CmdArgs.push_back("-lpthread");
7318 CmdArgs.push_back("-lc");
7319 CmdArgs.push_back("-lCompilerRT-Generic");
7320 CmdArgs.push_back("-L/usr/pkg/compiler-rt/lib");
7321 CmdArgs.push_back(
Eric Christopher45f2e712012-12-18 00:31:10 +00007322 Args.MakeArgString(getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007323 }
7324
Rafael Espindola236db462013-11-09 20:07:19 +00007325 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007326 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007327}
7328
Daniel Dunbarcc912342009-05-02 18:28:39 +00007329/// DragonFly Tools
7330
7331// For now, DragonFly Assemble does just about the same as for
7332// FreeBSD, but this may change soon.
7333void dragonfly::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007334 const InputInfo &Output,
Daniel Dunbar1c7577c2009-11-04 06:24:38 +00007335 const InputInfoList &Inputs,
7336 const ArgList &Args,
7337 const char *LinkingOutput) const {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007338 ArgStringList CmdArgs;
7339
7340 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7341 // instruct as in the base system to assemble 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007342 if (getToolChain().getArch() == llvm::Triple::x86)
Daniel Dunbarcc912342009-05-02 18:28:39 +00007343 CmdArgs.push_back("--32");
7344
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007345 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA, options::OPT_Xassembler);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007346
7347 CmdArgs.push_back("-o");
Daniel Dunbarb440f562010-08-02 02:38:21 +00007348 CmdArgs.push_back(Output.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007349
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007350 for (const auto &II : Inputs)
Daniel Dunbarb440f562010-08-02 02:38:21 +00007351 CmdArgs.push_back(II.getFilename());
Daniel Dunbarcc912342009-05-02 18:28:39 +00007352
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007353 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("as"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007354 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007355}
7356
7357void dragonfly::Link::ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007358 const InputInfo &Output,
7359 const InputInfoList &Inputs,
7360 const ArgList &Args,
7361 const char *LinkingOutput) const {
John McCall65b8da02013-04-11 22:55:55 +00007362 bool UseGCC47 = false;
Daniel Dunbar083edf72009-12-21 18:54:17 +00007363 const Driver &D = getToolChain().getDriver();
Daniel Dunbarcc912342009-05-02 18:28:39 +00007364 ArgStringList CmdArgs;
7365
John McCall65b8da02013-04-11 22:55:55 +00007366 if (llvm::sys::fs::exists("/usr/lib/gcc47", UseGCC47))
7367 UseGCC47 = false;
7368
Joerg Sonnenberger6165ab12011-03-21 13:51:29 +00007369 if (!D.SysRoot.empty())
7370 CmdArgs.push_back(Args.MakeArgString("--sysroot=" + D.SysRoot));
7371
John McCall65b8da02013-04-11 22:55:55 +00007372 CmdArgs.push_back("--eh-frame-hdr");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007373 if (Args.hasArg(options::OPT_static)) {
7374 CmdArgs.push_back("-Bstatic");
7375 } else {
John McCall65b8da02013-04-11 22:55:55 +00007376 if (Args.hasArg(options::OPT_rdynamic))
7377 CmdArgs.push_back("-export-dynamic");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007378 if (Args.hasArg(options::OPT_shared))
7379 CmdArgs.push_back("-Bshareable");
7380 else {
7381 CmdArgs.push_back("-dynamic-linker");
7382 CmdArgs.push_back("/usr/libexec/ld-elf.so.2");
7383 }
John McCall65b8da02013-04-11 22:55:55 +00007384 CmdArgs.push_back("--hash-style=both");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007385 }
7386
7387 // When building 32-bit code on DragonFly/pc64, we have to explicitly
7388 // instruct ld in the base system to link 32-bit code.
Rafael Espindola35ca7d92012-10-07 04:44:33 +00007389 if (getToolChain().getArch() == llvm::Triple::x86) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007390 CmdArgs.push_back("-m");
7391 CmdArgs.push_back("elf_i386");
7392 }
7393
Daniel Dunbarb440f562010-08-02 02:38:21 +00007394 if (Output.isFilename()) {
Daniel Dunbarcc912342009-05-02 18:28:39 +00007395 CmdArgs.push_back("-o");
7396 CmdArgs.push_back(Output.getFilename());
7397 } else {
7398 assert(Output.isNothing() && "Invalid output.");
7399 }
7400
7401 if (!Args.hasArg(options::OPT_nostdlib) &&
7402 !Args.hasArg(options::OPT_nostartfiles)) {
7403 if (!Args.hasArg(options::OPT_shared)) {
John McCall65b8da02013-04-11 22:55:55 +00007404 if (Args.hasArg(options::OPT_pg))
7405 CmdArgs.push_back(Args.MakeArgString(
7406 getToolChain().GetFilePath("gcrt1.o")));
7407 else {
7408 if (Args.hasArg(options::OPT_pie))
7409 CmdArgs.push_back(Args.MakeArgString(
7410 getToolChain().GetFilePath("Scrt1.o")));
7411 else
7412 CmdArgs.push_back(Args.MakeArgString(
7413 getToolChain().GetFilePath("crt1.o")));
7414 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007415 }
John McCall65b8da02013-04-11 22:55:55 +00007416 CmdArgs.push_back(Args.MakeArgString(
7417 getToolChain().GetFilePath("crti.o")));
7418 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
7419 CmdArgs.push_back(Args.MakeArgString(
7420 getToolChain().GetFilePath("crtbeginS.o")));
7421 else
7422 CmdArgs.push_back(Args.MakeArgString(
7423 getToolChain().GetFilePath("crtbegin.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007424 }
7425
7426 Args.AddAllArgs(CmdArgs, options::OPT_L);
7427 Args.AddAllArgs(CmdArgs, options::OPT_T_Group);
7428 Args.AddAllArgs(CmdArgs, options::OPT_e);
7429
Daniel Dunbar54423b22010-09-17 00:24:54 +00007430 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
Daniel Dunbarcc912342009-05-02 18:28:39 +00007431
7432 if (!Args.hasArg(options::OPT_nostdlib) &&
7433 !Args.hasArg(options::OPT_nodefaultlibs)) {
7434 // FIXME: GCC passes on -lgcc, -lgcc_pic and a whole lot of
7435 // rpaths
John McCall65b8da02013-04-11 22:55:55 +00007436 if (UseGCC47)
7437 CmdArgs.push_back("-L/usr/lib/gcc47");
7438 else
7439 CmdArgs.push_back("-L/usr/lib/gcc44");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007440
7441 if (!Args.hasArg(options::OPT_static)) {
John McCall65b8da02013-04-11 22:55:55 +00007442 if (UseGCC47) {
7443 CmdArgs.push_back("-rpath");
7444 CmdArgs.push_back("/usr/lib/gcc47");
7445 } else {
7446 CmdArgs.push_back("-rpath");
7447 CmdArgs.push_back("/usr/lib/gcc44");
7448 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007449 }
7450
Hans Wennborg70850d82013-07-18 20:29:38 +00007451 if (D.CCCIsCXX()) {
Daniel Dunbar3f7796f2010-09-17 01:20:05 +00007452 getToolChain().AddCXXStdlibLibArgs(Args, CmdArgs);
Rafael Espindola38360b32010-07-20 12:59:03 +00007453 CmdArgs.push_back("-lm");
7454 }
7455
Daniel Dunbarcc912342009-05-02 18:28:39 +00007456 if (Args.hasArg(options::OPT_pthread))
Mike Stump0a65b632009-10-31 20:11:46 +00007457 CmdArgs.push_back("-lpthread");
Daniel Dunbarcc912342009-05-02 18:28:39 +00007458
7459 if (!Args.hasArg(options::OPT_nolibc)) {
7460 CmdArgs.push_back("-lc");
7461 }
7462
John McCall65b8da02013-04-11 22:55:55 +00007463 if (UseGCC47) {
7464 if (Args.hasArg(options::OPT_static) ||
7465 Args.hasArg(options::OPT_static_libgcc)) {
7466 CmdArgs.push_back("-lgcc");
7467 CmdArgs.push_back("-lgcc_eh");
7468 } else {
7469 if (Args.hasArg(options::OPT_shared_libgcc)) {
7470 CmdArgs.push_back("-lgcc_pic");
7471 if (!Args.hasArg(options::OPT_shared))
7472 CmdArgs.push_back("-lgcc");
7473 } else {
7474 CmdArgs.push_back("-lgcc");
7475 CmdArgs.push_back("--as-needed");
7476 CmdArgs.push_back("-lgcc_pic");
7477 CmdArgs.push_back("--no-as-needed");
7478 }
7479 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007480 } else {
John McCall65b8da02013-04-11 22:55:55 +00007481 if (Args.hasArg(options::OPT_shared)) {
7482 CmdArgs.push_back("-lgcc_pic");
7483 } else {
7484 CmdArgs.push_back("-lgcc");
7485 }
Daniel Dunbarcc912342009-05-02 18:28:39 +00007486 }
7487 }
7488
7489 if (!Args.hasArg(options::OPT_nostdlib) &&
7490 !Args.hasArg(options::OPT_nostartfiles)) {
John McCall65b8da02013-04-11 22:55:55 +00007491 if (Args.hasArg(options::OPT_shared) || Args.hasArg(options::OPT_pie))
Chris Lattner3e2ee142010-07-07 16:01:42 +00007492 CmdArgs.push_back(Args.MakeArgString(
Daniel Dunbar9c3ed5f2010-07-14 18:46:23 +00007493 getToolChain().GetFilePath("crtendS.o")));
John McCall65b8da02013-04-11 22:55:55 +00007494 else
7495 CmdArgs.push_back(Args.MakeArgString(
7496 getToolChain().GetFilePath("crtend.o")));
Chris Lattner3e2ee142010-07-07 16:01:42 +00007497 CmdArgs.push_back(Args.MakeArgString(
John McCall65b8da02013-04-11 22:55:55 +00007498 getToolChain().GetFilePath("crtn.o")));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007499 }
7500
Alexey Samsonov7811d192014-02-20 13:57:37 +00007501 addProfileRT(getToolChain(), Args, CmdArgs);
Nick Lewycky82fe5f42011-05-24 21:54:59 +00007502
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007503 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("ld"));
Daniel Dunbar7fbaf532010-08-02 02:38:28 +00007504 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
Daniel Dunbarcc912342009-05-02 18:28:39 +00007505}
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007506
Alexey Samsonov6424e022014-05-12 20:20:20 +00007507static void addSanitizerRTWindows(const ToolChain &TC, const ArgList &Args,
7508 ArgStringList &CmdArgs,
7509 const StringRef RTName) {
7510 SmallString<128> LibSanitizer(getCompilerRTLibDir(TC));
7511 llvm::sys::path::append(LibSanitizer,
7512 Twine("clang_rt.") + RTName + ".lib");
7513 CmdArgs.push_back(Args.MakeArgString(LibSanitizer));
7514}
7515
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007516void visualstudio::Link::ConstructJob(Compilation &C, const JobAction &JA,
7517 const InputInfo &Output,
7518 const InputInfoList &Inputs,
7519 const ArgList &Args,
7520 const char *LinkingOutput) const {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007521 ArgStringList CmdArgs;
7522
7523 if (Output.isFilename()) {
Daniel Dunbar2cc3f172010-09-17 00:45:02 +00007524 CmdArgs.push_back(Args.MakeArgString(std::string("-out:") +
7525 Output.getFilename()));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007526 } else {
7527 assert(Output.isNothing() && "Invalid output.");
7528 }
7529
7530 if (!Args.hasArg(options::OPT_nostdlib) &&
Hans Wennborg32e3b722013-08-09 17:38:42 +00007531 !Args.hasArg(options::OPT_nostartfiles) &&
7532 !C.getDriver().IsCLMode()) {
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007533 CmdArgs.push_back("-defaultlib:libcmt");
7534 }
7535
7536 CmdArgs.push_back("-nologo");
7537
Hans Wennborgbbb5f072014-04-25 16:24:19 +00007538 if (Args.hasArg(options::OPT_g_Group)) {
7539 CmdArgs.push_back("-debug");
7540 }
7541
Hans Wennborgf1a74252013-09-10 20:18:04 +00007542 bool DLL = Args.hasArg(options::OPT__SLASH_LD, options::OPT__SLASH_LDd);
7543
7544 if (DLL) {
7545 CmdArgs.push_back(Args.MakeArgString("-dll"));
7546
7547 SmallString<128> ImplibName(Output.getFilename());
7548 llvm::sys::path::replace_extension(ImplibName, "lib");
7549 CmdArgs.push_back(Args.MakeArgString(std::string("-implib:") +
7550 ImplibName.str()));
7551 }
7552
Peter Collingbourne32701642013-11-01 18:16:25 +00007553 if (getToolChain().getSanitizerArgs().needsAsanRt()) {
Hans Wennborg0517e752013-08-28 17:36:07 +00007554 CmdArgs.push_back(Args.MakeArgString("-debug"));
Hans Wennborgd024c1c2013-08-30 10:50:52 +00007555 CmdArgs.push_back(Args.MakeArgString("-incremental:no"));
Hans Wennborgf1a74252013-09-10 20:18:04 +00007556 // FIXME: Handle 64-bit.
Alexey Samsonov6424e022014-05-12 20:20:20 +00007557 if (DLL) {
7558 addSanitizerRTWindows(getToolChain(), Args, CmdArgs,
7559 "asan_dll_thunk-i386");
7560 } else {
7561 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan-i386");
7562 addSanitizerRTWindows(getToolChain(), Args, CmdArgs, "asan_cxx-i386");
7563 }
Hans Wennborg65f17522013-08-27 18:10:21 +00007564 }
7565
Michael J. Spencere2f49362012-06-18 16:56:04 +00007566 Args.AddAllArgValues(CmdArgs, options::OPT_l);
Hans Wennborg2e274592013-08-13 23:38:57 +00007567 Args.AddAllArgValues(CmdArgs, options::OPT__SLASH_link);
Michael J. Spencere2f49362012-06-18 16:56:04 +00007568
7569 // Add filenames immediately.
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007570 for (const auto &Input : Inputs)
7571 if (Input.isFilename())
7572 CmdArgs.push_back(Input.getFilename());
Hans Wennborgbe4a6762013-08-14 01:24:35 +00007573 else
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007574 Input.getInputArg().renderAsInput(Args, CmdArgs);
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007575
7576 const char *Exec =
Daniel Dunbar54423b22010-09-17 00:24:54 +00007577 Args.MakeArgString(getToolChain().GetProgramPath("link.exe"));
Michael J. Spencerb186bc32010-08-21 21:55:07 +00007578 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7579}
Hans Wennborg87cfa712013-09-19 20:32:16 +00007580
7581void visualstudio::Compile::ConstructJob(Compilation &C, const JobAction &JA,
7582 const InputInfo &Output,
7583 const InputInfoList &Inputs,
7584 const ArgList &Args,
7585 const char *LinkingOutput) const {
7586 C.addCommand(GetCommand(C, JA, Output, Inputs, Args, LinkingOutput));
7587}
7588
Hans Wennborg188382e2013-09-20 18:16:35 +00007589// Try to find FallbackName on PATH that is not identical to ClangProgramPath.
7590// If one cannot be found, return FallbackName.
7591// We do this special search to prevent clang-cl from falling back onto itself
7592// if it's available as cl.exe on the path.
7593static std::string FindFallback(const char *FallbackName,
7594 const char *ClangProgramPath) {
7595 llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("PATH");
7596 if (!OptPath.hasValue())
7597 return FallbackName;
7598
7599#ifdef LLVM_ON_WIN32
7600 const StringRef PathSeparators = ";";
7601#else
7602 const StringRef PathSeparators = ":";
7603#endif
7604
7605 SmallVector<StringRef, 8> PathSegments;
7606 llvm::SplitString(OptPath.getValue(), PathSegments, PathSeparators);
7607
7608 for (size_t i = 0, e = PathSegments.size(); i != e; ++i) {
7609 const StringRef &PathSegment = PathSegments[i];
7610 if (PathSegment.empty())
7611 continue;
7612
7613 SmallString<128> FilePath(PathSegment);
7614 llvm::sys::path::append(FilePath, FallbackName);
7615 if (llvm::sys::fs::can_execute(Twine(FilePath)) &&
7616 !llvm::sys::fs::equivalent(Twine(FilePath), ClangProgramPath))
7617 return FilePath.str();
7618 }
7619
7620 return FallbackName;
7621}
7622
Hans Wennborg87cfa712013-09-19 20:32:16 +00007623Command *visualstudio::Compile::GetCommand(Compilation &C, const JobAction &JA,
7624 const InputInfo &Output,
7625 const InputInfoList &Inputs,
7626 const ArgList &Args,
7627 const char *LinkingOutput) const {
7628 ArgStringList CmdArgs;
Hans Wennborg263c2132013-09-24 17:36:21 +00007629 CmdArgs.push_back("/nologo");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007630 CmdArgs.push_back("/c"); // Compile only.
7631 CmdArgs.push_back("/W0"); // No warnings.
7632
7633 // The goal is to be able to invoke this tool correctly based on
7634 // any flag accepted by clang-cl.
7635
7636 // These are spelled the same way in clang and cl.exe,.
7637 Args.AddAllArgs(CmdArgs, options::OPT_D, options::OPT_U);
7638 Args.AddAllArgs(CmdArgs, options::OPT_I);
Hans Wennborgb6331dc2013-09-24 18:17:21 +00007639
7640 // Optimization level.
7641 if (Arg *A = Args.getLastArg(options::OPT_O, options::OPT_O0)) {
7642 if (A->getOption().getID() == options::OPT_O0) {
7643 CmdArgs.push_back("/Od");
7644 } else {
7645 StringRef OptLevel = A->getValue();
7646 if (OptLevel == "1" || OptLevel == "2" || OptLevel == "s")
7647 A->render(Args, CmdArgs);
7648 else if (OptLevel == "3")
7649 CmdArgs.push_back("/Ox");
7650 }
7651 }
Hans Wennborg87cfa712013-09-19 20:32:16 +00007652
7653 // Flags for which clang-cl have an alias.
7654 // FIXME: How can we ensure this stays in sync with relevant clang-cl options?
7655
7656 if (Arg *A = Args.getLastArg(options::OPT_frtti, options::OPT_fno_rtti))
7657 CmdArgs.push_back(A->getOption().getID() == options::OPT_frtti ? "/GR"
7658 : "/GR-");
Hans Wennborg5149a3b2014-03-25 14:48:54 +00007659 if (Arg *A = Args.getLastArg(options::OPT_ffunction_sections,
7660 options::OPT_fno_function_sections))
7661 CmdArgs.push_back(A->getOption().getID() == options::OPT_ffunction_sections
7662 ? "/Gy"
7663 : "/Gy-");
David Majnemerdc7a47c2014-04-07 16:14:38 +00007664 if (Arg *A = Args.getLastArg(options::OPT_fdata_sections,
7665 options::OPT_fno_data_sections))
David Majnemer6c684a72014-04-07 16:19:27 +00007666 CmdArgs.push_back(
7667 A->getOption().getID() == options::OPT_fdata_sections ? "/Gw" : "/Gw-");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007668 if (Args.hasArg(options::OPT_fsyntax_only))
7669 CmdArgs.push_back("/Zs");
Reid Klecknerc688daf2014-02-19 22:05:59 +00007670 if (Args.hasArg(options::OPT_g_Flag, options::OPT_gline_tables_only))
7671 CmdArgs.push_back("/Z7");
Hans Wennborg87cfa712013-09-19 20:32:16 +00007672
Hans Wennborg260ff402013-09-27 17:54:18 +00007673 std::vector<std::string> Includes = Args.getAllArgValues(options::OPT_include);
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007674 for (const auto &Include : Includes)
7675 CmdArgs.push_back(Args.MakeArgString(std::string("/FI") + Include));
Hans Wennborg260ff402013-09-27 17:54:18 +00007676
Hans Wennborg87cfa712013-09-19 20:32:16 +00007677 // Flags that can simply be passed through.
7678 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LD);
7679 Args.AddAllArgs(CmdArgs, options::OPT__SLASH_LDd);
7680
7681 // The order of these flags is relevant, so pick the last one.
7682 if (Arg *A = Args.getLastArg(options::OPT__SLASH_MD, options::OPT__SLASH_MDd,
7683 options::OPT__SLASH_MT, options::OPT__SLASH_MTd))
7684 A->render(Args, CmdArgs);
7685
7686
7687 // Input filename.
7688 assert(Inputs.size() == 1);
7689 const InputInfo &II = Inputs[0];
7690 assert(II.getType() == types::TY_C || II.getType() == types::TY_CXX);
7691 CmdArgs.push_back(II.getType() == types::TY_C ? "/Tc" : "/Tp");
7692 if (II.isFilename())
7693 CmdArgs.push_back(II.getFilename());
7694 else
7695 II.getInputArg().renderAsInput(Args, CmdArgs);
7696
7697 // Output filename.
7698 assert(Output.getType() == types::TY_Object);
7699 const char *Fo = Args.MakeArgString(std::string("/Fo") +
7700 Output.getFilename());
7701 CmdArgs.push_back(Fo);
7702
Hans Wennborg188382e2013-09-20 18:16:35 +00007703 const Driver &D = getToolChain().getDriver();
7704 std::string Exec = FindFallback("cl.exe", D.getClangProgramPath());
Hans Wennborg188382e2013-09-20 18:16:35 +00007705 return new Command(JA, *this, Args.MakeArgString(Exec), CmdArgs);
Hans Wennborg87cfa712013-09-19 20:32:16 +00007706}
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007707
7708
7709/// XCore Tools
7710// We pass assemble and link construction to the xcc tool.
7711
7712void XCore::Assemble::ConstructJob(Compilation &C, const JobAction &JA,
7713 const InputInfo &Output,
7714 const InputInfoList &Inputs,
7715 const ArgList &Args,
7716 const char *LinkingOutput) const {
7717 ArgStringList CmdArgs;
7718
7719 CmdArgs.push_back("-o");
7720 CmdArgs.push_back(Output.getFilename());
7721
7722 CmdArgs.push_back("-c");
7723
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007724 if (Args.hasArg(options::OPT_v))
7725 CmdArgs.push_back("-v");
7726
Robert Lytton894d25c2014-05-02 09:33:25 +00007727 if (Arg *A = Args.getLastArg(options::OPT_g_Group))
7728 if (!A->getOption().matches(options::OPT_g0))
7729 CmdArgs.push_back("-g");
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007730
Robert Lytton8e95d4e2014-02-11 10:34:45 +00007731 if (Args.hasFlag(options::OPT_fverbose_asm, options::OPT_fno_verbose_asm,
7732 false))
7733 CmdArgs.push_back("-fverbose-asm");
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007734
7735 Args.AddAllArgValues(CmdArgs, options::OPT_Wa_COMMA,
7736 options::OPT_Xassembler);
7737
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007738 for (const auto &II : Inputs)
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007739 CmdArgs.push_back(II.getFilename());
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007740
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007741 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007742 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7743}
7744
7745void XCore::Link::ConstructJob(Compilation &C, const JobAction &JA,
7746 const InputInfo &Output,
7747 const InputInfoList &Inputs,
7748 const ArgList &Args,
7749 const char *LinkingOutput) const {
7750 ArgStringList CmdArgs;
7751
7752 if (Output.isFilename()) {
7753 CmdArgs.push_back("-o");
7754 CmdArgs.push_back(Output.getFilename());
7755 } else {
7756 assert(Output.isNothing() && "Invalid output.");
7757 }
7758
Robert Lytton9e8c1a42014-02-13 10:40:12 +00007759 if (Args.hasArg(options::OPT_v))
7760 CmdArgs.push_back("-v");
7761
Robert Lyttonf7e03c12014-02-13 10:34:44 +00007762 ExceptionSettings EH = exceptionSettings(Args, getToolChain().getTriple());
7763 if (EH.ShouldUseExceptionTables)
7764 CmdArgs.push_back("-fexceptions");
7765
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007766 AddLinkerInputs(getToolChain(), Inputs, Args, CmdArgs);
7767
Saleem Abdulrasool2456cea2014-06-12 02:08:04 +00007768 const char *Exec = Args.MakeArgString(getToolChain().GetProgramPath("xcc"));
Robert Lyttoncf1dd692013-10-11 10:29:40 +00007769 C.addCommand(new Command(JA, *this, Exec, CmdArgs));
7770}