blob: 4c89676e0e195897bddd929fc3b378c439b89ca6 [file] [log] [blame]
Daniel Dunbar5903d8c2009-03-17 22:07:58 +00001//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
2//
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#ifndef CLANG_LIB_DRIVER_TOOLS_H_
11#define CLANG_LIB_DRIVER_TOOLS_H_
12
13#include "clang/Driver/Tool.h"
Daniel Dunbare6adeee2009-03-29 17:08:39 +000014#include "clang/Driver/Types.h"
Daniel Dunbara3246a02009-03-18 08:07:30 +000015#include "clang/Driver/Util.h"
Joerg Sonnenberger637603a2011-05-16 13:35:02 +000016#include "llvm/ADT/Triple.h"
Reid Kleckner898229a2013-06-14 17:17:23 +000017#include "llvm/Option/Option.h"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000018#include "llvm/Support/Compiler.h"
19
20namespace clang {
John McCall5fb5df92012-06-20 06:18:46 +000021 class ObjCRuntime;
22
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000023namespace driver {
Hans Wennborg87cfa712013-09-19 20:32:16 +000024 class Command;
Douglas Gregor111af7d2009-04-18 00:34:01 +000025 class Driver;
26
Daniel Dunbarc1964212009-03-26 16:23:12 +000027namespace toolchains {
Tim Northover157d9112014-01-16 08:48:16 +000028 class MachO;
Daniel Dunbarc1964212009-03-26 16:23:12 +000029}
30
Daniel Dunbar15abb2e2009-03-17 22:18:43 +000031namespace tools {
Hans Wennborg1da044a2014-06-26 19:59:02 +000032
33namespace visualstudio {
34 class Compile;
35}
36
Reid Kleckner898229a2013-06-14 17:17:23 +000037using llvm::opt::ArgStringList;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000038
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +000039 /// \brief Clang compiler tool.
Duncan Sandsaf260b92010-05-11 20:16:05 +000040 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
Eric Christopher45f2e712012-12-18 00:31:10 +000041 public:
Reid Kleckner724c21c2013-06-17 13:59:19 +000042 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000043 const InputInfoList &Inputs);
Reid Kleckner724c21c2013-06-17 13:59:19 +000044 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000045 const InputInfoList &Inputs);
Reid Kleckner724c21c2013-06-17 13:59:19 +000046 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000047 const InputInfoList &Inputs);
48
Eric Christopher45f2e712012-12-18 00:31:10 +000049 private:
Reid Kleckner724c21c2013-06-17 13:59:19 +000050 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +000051 const Driver &D,
Reid Kleckner724c21c2013-06-17 13:59:19 +000052 const llvm::opt::ArgList &Args,
53 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbard067f7f2009-04-08 23:54:23 +000054 const InputInfo &Output,
55 const InputInfoList &Inputs) const;
56
Amara Emerson703da2e2013-10-31 09:32:33 +000057 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000059 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
60 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbarc9388c12011-03-17 17:10:06 +000061 bool KernelOrKext) const;
Tim Northovera2ee4332014-03-29 15:09:45 +000062 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
63 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000064 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
65 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000066 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
67 llvm::opt::ArgStringList &CmdArgs) const;
68 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
69 llvm::opt::ArgStringList &CmdArgs) const;
Richard Sandiford4652d892013-07-19 16:51:51 +000070 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
71 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000072 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
73 llvm::opt::ArgStringList &CmdArgs) const;
74 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
75 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +000076
John McCall5fb5df92012-06-20 06:18:46 +000077 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
78
Reid Kleckner724c21c2013-06-17 13:59:19 +000079 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
80 llvm::opt::ArgStringList &cmdArgs,
John McCall5fb5df92012-06-20 06:18:46 +000081 RewriteKind rewrite) const;
82
Hans Wennborg75958c42013-08-08 00:17:41 +000083 void AddClangCLArgs(const llvm::opt::ArgList &Args,
84 llvm::opt::ArgStringList &CmdArgs) const;
85
Hans Wennborg1da044a2014-06-26 19:59:02 +000086 visualstudio::Compile *getCLFallback() const;
87
88 mutable std::unique_ptr<visualstudio::Compile> CLFallback;
89
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000090 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +000091 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000092
Craig Topperb45acb82014-03-14 06:02:07 +000093 bool hasGoodDiagnostics() const override { return true; }
94 bool hasIntegratedAssembler() const override { return true; }
95 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +000096
Craig Topperb45acb82014-03-14 06:02:07 +000097 void ConstructJob(Compilation &C, const JobAction &JA,
98 const InputInfo &Output, const InputInfoList &Inputs,
99 const llvm::opt::ArgList &TCArgs,
100 const char *LinkingOutput) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000101 };
102
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000103 /// \brief Clang integrated assembler tool.
104 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
105 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000106 ClangAs(const ToolChain &TC) : Tool("clang::as",
107 "clang integrated assembler", TC) {}
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000108
Craig Topperb45acb82014-03-14 06:02:07 +0000109 bool hasGoodDiagnostics() const override { return true; }
110 bool hasIntegratedAssembler() const override { return false; }
111 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000112
Craig Topperb45acb82014-03-14 06:02:07 +0000113 void ConstructJob(Compilation &C, const JobAction &JA,
114 const InputInfo &Output, const InputInfoList &Inputs,
115 const llvm::opt::ArgList &TCArgs,
116 const char *LinkingOutput) const override;
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000117 };
118
Daniel Dunbar82116f82009-03-17 22:45:24 +0000119 /// gcc - Generic GCC tool implementations.
120namespace gcc {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000121 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000122 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000123 Common(const char *Name, const char *ShortName,
124 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000125
Craig Topperb45acb82014-03-14 06:02:07 +0000126 void ConstructJob(Compilation &C, const JobAction &JA,
127 const InputInfo &Output,
128 const InputInfoList &Inputs,
129 const llvm::opt::ArgList &TCArgs,
130 const char *LinkingOutput) const override;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000131
132 /// RenderExtraToolArgs - Render any arguments necessary to force
133 /// the particular tool mode.
Reid Kleckner724c21c2013-06-17 13:59:19 +0000134 virtual void
135 RenderExtraToolArgs(const JobAction &JA,
136 llvm::opt::ArgStringList &CmdArgs) const = 0;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000137 };
138
Duncan Sandsaf260b92010-05-11 20:16:05 +0000139 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
Daniel Dunbara3246a02009-03-18 08:07:30 +0000140 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000141 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
142 "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000143
Craig Topperb45acb82014-03-14 06:02:07 +0000144 bool hasGoodDiagnostics() const override { return true; }
145 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000146
Craig Topperb45acb82014-03-14 06:02:07 +0000147 void RenderExtraToolArgs(const JobAction &JA,
148 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000149 };
150
Duncan Sandsaf260b92010-05-11 20:16:05 +0000151 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000152 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000153 Compile(const ToolChain &TC) : Common("gcc::Compile",
154 "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000155
Craig Topperb45acb82014-03-14 06:02:07 +0000156 bool hasGoodDiagnostics() const override { return true; }
157 bool hasIntegratedCPP() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000158
Craig Topperb45acb82014-03-14 06:02:07 +0000159 void RenderExtraToolArgs(const JobAction &JA,
160 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000161 };
162
Duncan Sandsaf260b92010-05-11 20:16:05 +0000163 class LLVM_LIBRARY_VISIBILITY Link : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000164 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000165 Link(const ToolChain &TC) : Common("gcc::Link",
166 "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000167
Craig Topperb45acb82014-03-14 06:02:07 +0000168 bool hasIntegratedCPP() const override { return false; }
169 bool isLinkJob() const override { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000170
Craig Topperb45acb82014-03-14 06:02:07 +0000171 void RenderExtraToolArgs(const JobAction &JA,
172 llvm::opt::ArgStringList &CmdArgs) const override;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000173 };
Daniel Dunbar82116f82009-03-17 22:45:24 +0000174} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000175
Tony Linthicum76329bf2011-12-12 21:14:55 +0000176namespace hexagon {
177 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
178 // We simply use "clang -cc1" for those actions.
179 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
180 public:
181 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
182 "hexagon-as", TC) {}
183
Craig Topperb45acb82014-03-14 06:02:07 +0000184 bool hasIntegratedCPP() const override { return false; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000185
Craig Topperf85c6ce2014-03-14 06:06:19 +0000186 void RenderExtraToolArgs(const JobAction &JA,
187 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000188 void ConstructJob(Compilation &C, const JobAction &JA,
189 const InputInfo &Output, const InputInfoList &Inputs,
190 const llvm::opt::ArgList &TCArgs,
191 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000192 };
193
194 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
195 public:
196 Link(const ToolChain &TC) : Tool("hexagon::Link",
197 "hexagon-ld", TC) {}
198
Craig Topperb45acb82014-03-14 06:02:07 +0000199 bool hasIntegratedCPP() const override { return false; }
200 bool isLinkJob() const override { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000201
202 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000203 llvm::opt::ArgStringList &CmdArgs) const;
Craig Topperb45acb82014-03-14 06:02:07 +0000204 void ConstructJob(Compilation &C, const JobAction &JA,
205 const InputInfo &Output, const InputInfoList &Inputs,
206 const llvm::opt::ArgList &TCArgs,
207 const char *LinkingOutput) const override;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000208 };
209} // end namespace hexagon.
210
Bernard Ogden31561762013-12-12 13:27:11 +0000211namespace arm {
Rafael Espindola80d333b2013-12-12 15:48:19 +0000212 StringRef getARMTargetCPU(const llvm::opt::ArgList &Args,
213 const llvm::Triple &Triple);
Bernard Ogden31561762013-12-12 13:27:11 +0000214 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
215 const llvm::Triple &Triple);
216 const char* getLLVMArchSuffixForARM(StringRef CPU);
217}
Tony Linthicum76329bf2011-12-12 21:14:55 +0000218
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000219namespace mips {
Simon Atanasyan7018e1d2014-07-16 12:29:22 +0000220 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
221 const llvm::Triple &Triple, StringRef &CPUName,
222 StringRef &ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000223 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
Daniel Sanders2bf13662014-07-10 14:40:57 +0000224 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
Daniel Sanders379d44b2014-07-16 11:52:23 +0000225 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
226 StringRef ABIName);
Jonathan Roelofs2cea1be2014-02-12 03:21:20 +0000227}
228
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000229namespace darwin {
Tim Northover157d9112014-01-16 08:48:16 +0000230 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
231 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000232
Tim Northover157d9112014-01-16 08:48:16 +0000233 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
David Blaikie68e081d2011-12-20 02:48:34 +0000234 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000235 protected:
Tim Northover157d9112014-01-16 08:48:16 +0000236 void AddMachOArch(const llvm::opt::ArgList &Args,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000237 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000238
Tim Northover157d9112014-01-16 08:48:16 +0000239 const toolchains::MachO &getMachOToolChain() const {
240 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
Daniel Dunbare9ded432009-09-09 18:36:20 +0000241 }
242
243 public:
Tim Northover157d9112014-01-16 08:48:16 +0000244 MachOTool(const char *Name, const char *ShortName,
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000245 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
Daniel Dunbare9ded432009-09-09 18:36:20 +0000246 };
247
Tim Northover157d9112014-01-16 08:48:16 +0000248 class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool {
Daniel Dunbarbe220842009-03-20 16:06:39 +0000249 public:
Tim Northover157d9112014-01-16 08:48:16 +0000250 Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
251 "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000252
Craig Topperb45acb82014-03-14 06:02:07 +0000253 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarbe220842009-03-20 16:06:39 +0000254
Craig Topperb45acb82014-03-14 06:02:07 +0000255 void ConstructJob(Compilation &C, const JobAction &JA,
256 const InputInfo &Output, const InputInfoList &Inputs,
257 const llvm::opt::ArgList &TCArgs,
258 const char *LinkingOutput) const override;
Daniel Dunbarbe220842009-03-20 16:06:39 +0000259 };
260
Tim Northover157d9112014-01-16 08:48:16 +0000261 class LLVM_LIBRARY_VISIBILITY Link : public MachOTool {
Bill Wendling3b2000f2012-10-02 18:02:50 +0000262 bool NeedsTempPath(const InputInfoList &Inputs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +0000263 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
264 llvm::opt::ArgStringList &CmdArgs,
265 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000266
Daniel Dunbarc1964212009-03-26 16:23:12 +0000267 public:
Tim Northover157d9112014-01-16 08:48:16 +0000268 Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC) {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000269
Craig Topperb45acb82014-03-14 06:02:07 +0000270 bool hasIntegratedCPP() const override { return false; }
271 bool isLinkJob() const override { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000272
Craig Topperb45acb82014-03-14 06:02:07 +0000273 void ConstructJob(Compilation &C, const JobAction &JA,
274 const InputInfo &Output, const InputInfoList &Inputs,
275 const llvm::opt::ArgList &TCArgs,
276 const char *LinkingOutput) const override;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000277 };
278
Tim Northover157d9112014-01-16 08:48:16 +0000279 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000280 public:
Tim Northover157d9112014-01-16 08:48:16 +0000281 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000282
Craig Topperb45acb82014-03-14 06:02:07 +0000283 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000284
Craig Topperb45acb82014-03-14 06:02:07 +0000285 void ConstructJob(Compilation &C, const JobAction &JA,
286 const InputInfo &Output, const InputInfoList &Inputs,
287 const llvm::opt::ArgList &TCArgs,
288 const char *LinkingOutput) const override;
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000289 };
Daniel Dunbar88299622010-06-04 18:28:36 +0000290
Tim Northover157d9112014-01-16 08:48:16 +0000291 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
Daniel Dunbar88299622010-06-04 18:28:36 +0000292 public:
Tim Northover157d9112014-01-16 08:48:16 +0000293 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
294 "dsymutil", TC) {}
Daniel Dunbar88299622010-06-04 18:28:36 +0000295
Craig Topperb45acb82014-03-14 06:02:07 +0000296 bool hasIntegratedCPP() const override { return false; }
297 bool isDsymutilJob() const override { return true; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000298
Craig Topperb45acb82014-03-14 06:02:07 +0000299 void ConstructJob(Compilation &C, const JobAction &JA,
300 const InputInfo &Output,
301 const InputInfoList &Inputs,
302 const llvm::opt::ArgList &TCArgs,
303 const char *LinkingOutput) const override;
Daniel Dunbar88299622010-06-04 18:28:36 +0000304 };
Eric Christopher551ef452011-08-23 17:56:55 +0000305
Tim Northover157d9112014-01-16 08:48:16 +0000306 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
Eric Christopher551ef452011-08-23 17:56:55 +0000307 public:
Tim Northover157d9112014-01-16 08:48:16 +0000308 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
309 "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000310
Craig Topperb45acb82014-03-14 06:02:07 +0000311 bool hasIntegratedCPP() const override { return false; }
Eric Christopher551ef452011-08-23 17:56:55 +0000312
Craig Topperb45acb82014-03-14 06:02:07 +0000313 void ConstructJob(Compilation &C, const JobAction &JA,
314 const InputInfo &Output, const InputInfoList &Inputs,
315 const llvm::opt::ArgList &TCArgs,
316 const char *LinkingOutput) const override;
Eric Christopher551ef452011-08-23 17:56:55 +0000317 };
318
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000319}
320
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000321 /// openbsd -- Directly call GNU Binutils assembler and linker
322namespace openbsd {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000323 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000324 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000325 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
326 TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000327
Craig Topperb45acb82014-03-14 06:02:07 +0000328 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000329
Craig Topperb45acb82014-03-14 06:02:07 +0000330 void ConstructJob(Compilation &C, const JobAction &JA,
331 const InputInfo &Output,
332 const InputInfoList &Inputs,
333 const llvm::opt::ArgList &TCArgs,
334 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000335 };
Duncan Sandsaf260b92010-05-11 20:16:05 +0000336 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000337 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000338 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000339
Craig Topperb45acb82014-03-14 06:02:07 +0000340 bool hasIntegratedCPP() const override { return false; }
341 bool isLinkJob() const override { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000342
Craig Topperb45acb82014-03-14 06:02:07 +0000343 void ConstructJob(Compilation &C, const JobAction &JA,
344 const InputInfo &Output, const InputInfoList &Inputs,
345 const llvm::opt::ArgList &TCArgs,
346 const char *LinkingOutput) const override;
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000347 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000348} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000349
Eli Friedman9fa28852012-08-08 23:57:20 +0000350 /// bitrig -- Directly call GNU Binutils assembler and linker
351namespace bitrig {
352 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
353 public:
354 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
355 TC) {}
356
Craig Topperb45acb82014-03-14 06:02:07 +0000357 bool hasIntegratedCPP() const override { return false; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000358
Craig Topperb45acb82014-03-14 06:02:07 +0000359 void ConstructJob(Compilation &C, const JobAction &JA,
360 const InputInfo &Output, const InputInfoList &Inputs,
361 const llvm::opt::ArgList &TCArgs,
362 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000363 };
364 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
365 public:
366 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
367
Craig Topperb45acb82014-03-14 06:02:07 +0000368 bool hasIntegratedCPP() const override { return false; }
369 bool isLinkJob() const override { return true; }
Eli Friedman9fa28852012-08-08 23:57:20 +0000370
Craig Topperb45acb82014-03-14 06:02:07 +0000371 void ConstructJob(Compilation &C, const JobAction &JA,
372 const InputInfo &Output, const InputInfoList &Inputs,
373 const llvm::opt::ArgList &TCArgs,
374 const char *LinkingOutput) const override;
Eli Friedman9fa28852012-08-08 23:57:20 +0000375 };
376} // end namespace bitrig
377
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000378 /// freebsd -- Directly call GNU Binutils assembler and linker
379namespace freebsd {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000380 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000381 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000382 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
383 TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000384
Craig Topperb45acb82014-03-14 06:02:07 +0000385 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000386
Craig Topperb45acb82014-03-14 06:02:07 +0000387 void ConstructJob(Compilation &C, const JobAction &JA,
388 const InputInfo &Output, const InputInfoList &Inputs,
389 const llvm::opt::ArgList &TCArgs,
390 const char *LinkingOutput) const override;
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000391 };
Duncan Sandsaf260b92010-05-11 20:16:05 +0000392 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000393 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000394 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000395
Craig Topperb45acb82014-03-14 06:02:07 +0000396 bool hasIntegratedCPP() const override { return false; }
397 bool isLinkJob() const override { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000398
Craig Topperb45acb82014-03-14 06:02:07 +0000399 void ConstructJob(Compilation &C, const JobAction &JA,
400 const InputInfo &Output, const InputInfoList &Inputs,
401 const llvm::opt::ArgList &TCArgs,
402 const char *LinkingOutput) const override;
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000403 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000404} // end namespace freebsd
405
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000406 /// netbsd -- Directly call GNU Binutils assembler and linker
407namespace netbsd {
408 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000409
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000410 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000411 Assemble(const ToolChain &TC)
412 : Tool("netbsd::Assemble", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000413
Craig Topperb45acb82014-03-14 06:02:07 +0000414 bool hasIntegratedCPP() const override { return false; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000415
Craig Topperb45acb82014-03-14 06:02:07 +0000416 void ConstructJob(Compilation &C, const JobAction &JA,
417 const InputInfo &Output, const InputInfoList &Inputs,
418 const llvm::opt::ArgList &TCArgs,
419 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000420 };
421 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000422
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000423 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000424 Link(const ToolChain &TC)
425 : Tool("netbsd::Link", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000426
Craig Topperb45acb82014-03-14 06:02:07 +0000427 bool hasIntegratedCPP() const override { return false; }
428 bool isLinkJob() const override { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000429
Craig Topperb45acb82014-03-14 06:02:07 +0000430 void ConstructJob(Compilation &C, const JobAction &JA,
431 const InputInfo &Output, const InputInfoList &Inputs,
432 const llvm::opt::ArgList &TCArgs,
433 const char *LinkingOutput) const override;
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000434 };
435} // end namespace netbsd
436
Thomas Schwinge4e555262013-03-28 19:04:25 +0000437 /// Directly call GNU Binutils' assembler and linker.
438namespace gnutools {
Rafael Espindola92b00932010-08-10 00:25:48 +0000439 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
440 public:
Thomas Schwinge4e555262013-03-28 19:04:25 +0000441 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000442
Craig Topperb45acb82014-03-14 06:02:07 +0000443 bool hasIntegratedCPP() const override { return false; }
Rafael Espindola92b00932010-08-10 00:25:48 +0000444
Craig Topperb45acb82014-03-14 06:02:07 +0000445 void ConstructJob(Compilation &C, const JobAction &JA,
446 const InputInfo &Output,
447 const InputInfoList &Inputs,
448 const llvm::opt::ArgList &TCArgs,
449 const char *LinkingOutput) const override;
Rafael Espindola92b00932010-08-10 00:25:48 +0000450 };
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000451 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
452 public:
Thomas Schwinge4e555262013-03-28 19:04:25 +0000453 Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000454
Craig Topperb45acb82014-03-14 06:02:07 +0000455 bool hasIntegratedCPP() const override { return false; }
456 bool isLinkJob() const override { return true; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000457
Craig Topperb45acb82014-03-14 06:02:07 +0000458 void ConstructJob(Compilation &C, const JobAction &JA,
459 const InputInfo &Output,
460 const InputInfoList &Inputs,
461 const llvm::opt::ArgList &TCArgs,
462 const char *LinkingOutput) const override;
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000463 };
Rafael Espindola92b00932010-08-10 00:25:48 +0000464}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000465 /// minix -- Directly call GNU Binutils assembler and linker
466namespace minix {
467 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
468 public:
469 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
470 TC) {}
471
Craig Topperb45acb82014-03-14 06:02:07 +0000472 bool hasIntegratedCPP() const override { return false; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000473
Craig Topperb45acb82014-03-14 06:02:07 +0000474 void ConstructJob(Compilation &C, const JobAction &JA,
475 const InputInfo &Output,
476 const InputInfoList &Inputs,
477 const llvm::opt::ArgList &TCArgs,
478 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000479 };
480 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
481 public:
482 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
483
Craig Topperb45acb82014-03-14 06:02:07 +0000484 bool hasIntegratedCPP() const override { return false; }
485 bool isLinkJob() const override { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000486
Craig Topperb45acb82014-03-14 06:02:07 +0000487 void ConstructJob(Compilation &C, const JobAction &JA,
488 const InputInfo &Output,
489 const InputInfoList &Inputs,
490 const llvm::opt::ArgList &TCArgs,
491 const char *LinkingOutput) const override;
Chris Lattner3e2ee142010-07-07 16:01:42 +0000492 };
493} // end namespace minix
494
David Chisnallf571cde2012-02-15 13:39:01 +0000495 /// solaris -- Directly call Solaris assembler and linker
496namespace solaris {
497 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
498 public:
499 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
500 TC) {}
501
Craig Topperb45acb82014-03-14 06:02:07 +0000502 bool hasIntegratedCPP() const override { return false; }
David Chisnallf571cde2012-02-15 13:39:01 +0000503
Craig Topperb45acb82014-03-14 06:02:07 +0000504 void ConstructJob(Compilation &C, const JobAction &JA,
505 const InputInfo &Output, const InputInfoList &Inputs,
506 const llvm::opt::ArgList &TCArgs,
507 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000508 };
509 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
510 public:
511 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
512
Craig Topperb45acb82014-03-14 06:02:07 +0000513 bool hasIntegratedCPP() const override { return false; }
514 bool isLinkJob() const override { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000515
Craig Topperb45acb82014-03-14 06:02:07 +0000516 void ConstructJob(Compilation &C, const JobAction &JA,
517 const InputInfo &Output, const InputInfoList &Inputs,
518 const llvm::opt::ArgList &TCArgs,
519 const char *LinkingOutput) const override;
David Chisnallf571cde2012-02-15 13:39:01 +0000520 };
David Chisnalla9ed5d72012-02-15 16:25:46 +0000521} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000522
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000523 /// auroraux -- Directly call GNU Binutils assembler and linker
524namespace auroraux {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000525 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000526 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000527 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
528 TC) {}
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000529
Craig Topperb45acb82014-03-14 06:02:07 +0000530 bool hasIntegratedCPP() const override { return false; }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000531
Craig Topperb45acb82014-03-14 06:02:07 +0000532 void ConstructJob(Compilation &C, const JobAction &JA,
533 const InputInfo &Output, const InputInfoList &Inputs,
534 const llvm::opt::ArgList &TCArgs,
535 const char *LinkingOutput) const override;
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000536 };
Duncan Sandsaf260b92010-05-11 20:16:05 +0000537 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000538 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000539 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000540
Craig Topperb45acb82014-03-14 06:02:07 +0000541 bool hasIntegratedCPP() const override { return false; }
542 bool isLinkJob() const override { return true; }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000543
Craig Topperb45acb82014-03-14 06:02:07 +0000544 void ConstructJob(Compilation &C, const JobAction &JA,
545 const InputInfo &Output, const InputInfoList &Inputs,
546 const llvm::opt::ArgList &TCArgs,
547 const char *LinkingOutput) const override;
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000548 };
549} // end namespace auroraux
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000550
Daniel Dunbarcc912342009-05-02 18:28:39 +0000551 /// dragonfly -- Directly call GNU Binutils assembler and linker
552namespace dragonfly {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000553 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000554 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000555 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
556 TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000557
Craig Topperb45acb82014-03-14 06:02:07 +0000558 bool hasIntegratedCPP() const override { return false; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000559
Craig Topperb45acb82014-03-14 06:02:07 +0000560 void ConstructJob(Compilation &C, const JobAction &JA,
561 const InputInfo &Output, const InputInfoList &Inputs,
562 const llvm::opt::ArgList &TCArgs,
563 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000564 };
Duncan Sandsaf260b92010-05-11 20:16:05 +0000565 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000566 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000567 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000568
Craig Topperb45acb82014-03-14 06:02:07 +0000569 bool hasIntegratedCPP() const override { return false; }
570 bool isLinkJob() const override { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000571
Craig Topperb45acb82014-03-14 06:02:07 +0000572 void ConstructJob(Compilation &C, const JobAction &JA,
573 const InputInfo &Output,
574 const InputInfoList &Inputs,
575 const llvm::opt::ArgList &TCArgs,
576 const char *LinkingOutput) const override;
Daniel Dunbarcc912342009-05-02 18:28:39 +0000577 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000578} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000579
Hans Wennborg1da044a2014-06-26 19:59:02 +0000580/// Visual studio tools.
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000581namespace visualstudio {
Hans Wennborg87cfa712013-09-19 20:32:16 +0000582 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000583 public:
584 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
585
Craig Topperb45acb82014-03-14 06:02:07 +0000586 bool hasIntegratedCPP() const override { return false; }
587 bool isLinkJob() const override { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000588
Craig Topperb45acb82014-03-14 06:02:07 +0000589 void ConstructJob(Compilation &C, const JobAction &JA,
590 const InputInfo &Output, const InputInfoList &Inputs,
591 const llvm::opt::ArgList &TCArgs,
592 const char *LinkingOutput) const override;
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000593 };
Hans Wennborg87cfa712013-09-19 20:32:16 +0000594
595 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
596 public:
597 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
598
Craig Topperb45acb82014-03-14 06:02:07 +0000599 bool hasIntegratedAssembler() const override { return true; }
600 bool hasIntegratedCPP() const override { return true; }
601 bool isLinkJob() const override { return false; }
Hans Wennborg87cfa712013-09-19 20:32:16 +0000602
Craig Topperb45acb82014-03-14 06:02:07 +0000603 void ConstructJob(Compilation &C, const JobAction &JA,
604 const InputInfo &Output, const InputInfoList &Inputs,
605 const llvm::opt::ArgList &TCArgs,
606 const char *LinkingOutput) const override;
Hans Wennborg87cfa712013-09-19 20:32:16 +0000607
608 Command *GetCommand(Compilation &C, const JobAction &JA,
609 const InputInfo &Output,
610 const InputInfoList &Inputs,
611 const llvm::opt::ArgList &TCArgs,
612 const char *LinkingOutput) const;
613 };
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000614} // end namespace visualstudio
615
Tim Northover9c7e0352013-12-12 11:55:52 +0000616namespace arm {
617 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
618 const llvm::Triple &Triple);
619}
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000620namespace XCore {
621 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
622 // We simply use "clang -cc1" for those actions.
623 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
624 public:
625 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
626 "XCore-as", TC) {}
627
Craig Topperb45acb82014-03-14 06:02:07 +0000628 bool hasIntegratedCPP() const override { return false; }
629 void ConstructJob(Compilation &C, const JobAction &JA,
630 const InputInfo &Output, const InputInfoList &Inputs,
631 const llvm::opt::ArgList &TCArgs,
632 const char *LinkingOutput) const override;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000633 };
634
635 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
636 public:
637 Link(const ToolChain &TC) : Tool("XCore::Link",
638 "XCore-ld", TC) {}
639
Craig Topperb45acb82014-03-14 06:02:07 +0000640 bool hasIntegratedCPP() const override { return false; }
641 bool isLinkJob() const override { return true; }
642 void ConstructJob(Compilation &C, const JobAction &JA,
643 const InputInfo &Output, const InputInfoList &Inputs,
644 const llvm::opt::ArgList &TCArgs,
645 const char *LinkingOutput) const override;
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000646 };
647} // end namespace XCore.
648
649
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000650} // end namespace toolchains
651} // end namespace driver
652} // end namespace clang
653
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000654#endif // CLANG_LIB_DRIVER_TOOLS_H_