blob: 8c1e695aa201145bd6a373074b3f99a17eed3866 [file] [log] [blame]
Daniel Dunbar9c073ff2009-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 Dunbar40f12652009-03-29 17:08:39 +000014#include "clang/Driver/Types.h"
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000015#include "clang/Driver/Util.h"
Joerg Sonnenberger182564c2011-05-16 13:35:02 +000016#include "llvm/ADT/Triple.h"
Reid Klecknerb1e25a12013-06-14 17:17:23 +000017#include "llvm/Option/Option.h"
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000018#include "llvm/Support/Compiler.h"
19
20namespace clang {
John McCall260611a2012-06-20 06:18:46 +000021 class ObjCRuntime;
22
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000023namespace driver {
Douglas Gregordf91ef32009-04-18 00:34:01 +000024 class Driver;
25
Daniel Dunbar02633b52009-03-26 16:23:12 +000026namespace toolchains {
Daniel Dunbarf3955282009-09-04 18:34:51 +000027 class Darwin;
Daniel Dunbar02633b52009-03-26 16:23:12 +000028}
29
Daniel Dunbar985b8252009-03-17 22:18:43 +000030namespace tools {
Reid Klecknerb1e25a12013-06-14 17:17:23 +000031using llvm::opt::ArgStringList;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000032
Daniel Dunbar20a9aa52010-05-20 21:30:13 +000033 /// \brief Clang compiler tool.
Duncan Sands92dd1912010-05-11 20:16:05 +000034 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
Eric Christopher27e2b982012-12-18 00:31:10 +000035 public:
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000036 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
Bob Wilson66b8a662012-11-23 06:14:39 +000037 const InputInfoList &Inputs);
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000038 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
Bob Wilson66b8a662012-11-23 06:14:39 +000039 const InputInfoList &Inputs);
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000040 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
Bob Wilson66b8a662012-11-23 06:14:39 +000041 const InputInfoList &Inputs);
42
Eric Christopher27e2b982012-12-18 00:31:10 +000043 private:
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000044 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
Peter Collingbourne54db68b2011-11-06 00:40:05 +000045 const Driver &D,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000046 const llvm::opt::ArgList &Args,
47 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbarc21c4852009-04-08 23:54:23 +000048 const InputInfo &Output,
49 const InputInfoList &Inputs) const;
50
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000051 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
52 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbarfa41d692011-03-17 17:10:06 +000053 bool KernelOrKext) const;
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000054 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
55 llvm::opt::ArgStringList &CmdArgs) const;
56 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
57 llvm::opt::ArgStringList &CmdArgs) const;
58 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
59 llvm::opt::ArgStringList &CmdArgs) const;
60 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
61 llvm::opt::ArgStringList &CmdArgs) const;
Richard Sandiford5c92b9a2013-07-19 16:51:51 +000062 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
63 llvm::opt::ArgStringList &CmdArgs) const;
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000064 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
65 llvm::opt::ArgStringList &CmdArgs) const;
66 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
67 llvm::opt::ArgStringList &CmdArgs) const;
Tim Northoverb793f0d2013-08-01 09:23:19 +000068 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
69 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar6acda162009-09-09 22:33:08 +000070
John McCall260611a2012-06-20 06:18:46 +000071 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
72
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000073 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
74 llvm::opt::ArgStringList &cmdArgs,
John McCall260611a2012-06-20 06:18:46 +000075 RewriteKind rewrite) const;
76
Hans Wennborgb3574792013-08-08 00:17:41 +000077 void AddClangCLArgs(const llvm::opt::ArgList &Args,
78 llvm::opt::ArgStringList &CmdArgs) const;
79
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000080 public:
Daniel Dunbar30382042010-05-22 00:37:18 +000081 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000082
Daniel Dunbar60a53f22010-04-06 17:07:49 +000083 virtual bool hasGoodDiagnostics() const { return true; }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +000084 virtual bool hasIntegratedAssembler() const { return true; }
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000085 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000086
87 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +000088 const InputInfo &Output,
89 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000090 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000091 const char *LinkingOutput) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000092 };
93
Daniel Dunbar20a9aa52010-05-20 21:30:13 +000094 /// \brief Clang integrated assembler tool.
95 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
Reid Klecknerdd0b3c42013-06-17 13:59:19 +000096 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
97 llvm::opt::ArgStringList &CmdArgs) const;
98 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
99 llvm::opt::ArgStringList &CmdArgs) const;
100
Daniel Dunbar20a9aa52010-05-20 21:30:13 +0000101 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000102 ClangAs(const ToolChain &TC) : Tool("clang::as",
103 "clang integrated assembler", TC) {}
Daniel Dunbar20a9aa52010-05-20 21:30:13 +0000104
Daniel Dunbar20a9aa52010-05-20 21:30:13 +0000105 virtual bool hasGoodDiagnostics() const { return true; }
106 virtual bool hasIntegratedAssembler() const { return false; }
107 virtual bool hasIntegratedCPP() const { return false; }
108
109 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +0000110 const InputInfo &Output,
111 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000112 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar20a9aa52010-05-20 21:30:13 +0000113 const char *LinkingOutput) const;
114 };
115
Daniel Dunbar31b1e542009-03-17 22:45:24 +0000116 /// gcc - Generic GCC tool implementations.
117namespace gcc {
Duncan Sands92dd1912010-05-11 20:16:05 +0000118 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000119 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000120 Common(const char *Name, const char *ShortName,
121 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000122
123 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000124 const InputInfo &Output,
125 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000126 const llvm::opt::ArgList &TCArgs,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000127 const char *LinkingOutput) const;
128
129 /// RenderExtraToolArgs - Render any arguments necessary to force
130 /// the particular tool mode.
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000131 virtual void
132 RenderExtraToolArgs(const JobAction &JA,
133 llvm::opt::ArgStringList &CmdArgs) const = 0;
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000134 };
135
Duncan Sands92dd1912010-05-11 20:16:05 +0000136 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000137 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000138 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
139 "gcc preprocessor", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000140
Daniel Dunbar60a53f22010-04-06 17:07:49 +0000141 virtual bool hasGoodDiagnostics() const { return true; }
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000142 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000143
Daniel Dunbar82b51cc2010-01-25 22:35:08 +0000144 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000145 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000146 };
147
Duncan Sands92dd1912010-05-11 20:16:05 +0000148 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000149 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000150 Precompile(const ToolChain &TC) : Common("gcc::Precompile",
151 "gcc precompile", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000152
Daniel Dunbar60a53f22010-04-06 17:07:49 +0000153 virtual bool hasGoodDiagnostics() const { return true; }
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000154 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000155
Daniel Dunbar82b51cc2010-01-25 22:35:08 +0000156 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000157 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000158 };
159
Duncan Sands92dd1912010-05-11 20:16:05 +0000160 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000161 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000162 Compile(const ToolChain &TC) : Common("gcc::Compile",
163 "gcc frontend", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000164
Daniel Dunbar60a53f22010-04-06 17:07:49 +0000165 virtual bool hasGoodDiagnostics() const { return true; }
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000166 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000167
Daniel Dunbar82b51cc2010-01-25 22:35:08 +0000168 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000169 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000170 };
171
Duncan Sands92dd1912010-05-11 20:16:05 +0000172 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000173 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000174 Assemble(const ToolChain &TC) : Common("gcc::Assemble",
175 "assembler (via gcc)", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000176
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000177 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000178
Daniel Dunbar82b51cc2010-01-25 22:35:08 +0000179 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000180 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000181 };
182
Duncan Sands92dd1912010-05-11 20:16:05 +0000183 class LLVM_LIBRARY_VISIBILITY Link : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000184 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000185 Link(const ToolChain &TC) : Common("gcc::Link",
186 "linker (via gcc)", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000187
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000188 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000189 virtual bool isLinkJob() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000190
Daniel Dunbar82b51cc2010-01-25 22:35:08 +0000191 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000192 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000193 };
Daniel Dunbar31b1e542009-03-17 22:45:24 +0000194} // end namespace gcc
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000195
Tony Linthicum96319392011-12-12 21:14:55 +0000196namespace hexagon {
197 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
198 // We simply use "clang -cc1" for those actions.
199 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
200 public:
201 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
202 "hexagon-as", TC) {}
203
204 virtual bool hasIntegratedCPP() const { return false; }
205
206 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000207 llvm::opt::ArgStringList &CmdArgs) const;
Tony Linthicum96319392011-12-12 21:14:55 +0000208 virtual void ConstructJob(Compilation &C, const JobAction &JA,
209 const InputInfo &Output,
210 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000211 const llvm::opt::ArgList &TCArgs,
Tony Linthicum96319392011-12-12 21:14:55 +0000212 const char *LinkingOutput) const;
213 };
214
215 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
216 public:
217 Link(const ToolChain &TC) : Tool("hexagon::Link",
218 "hexagon-ld", TC) {}
219
220 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000221 virtual bool isLinkJob() const { return true; }
Tony Linthicum96319392011-12-12 21:14:55 +0000222
223 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000224 llvm::opt::ArgStringList &CmdArgs) const;
Tony Linthicum96319392011-12-12 21:14:55 +0000225 virtual void ConstructJob(Compilation &C, const JobAction &JA,
226 const InputInfo &Output,
227 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000228 const llvm::opt::ArgList &TCArgs,
Tony Linthicum96319392011-12-12 21:14:55 +0000229 const char *LinkingOutput) const;
230 };
231} // end namespace hexagon.
232
233
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000234namespace darwin {
Rafael Espindolacfed8282012-10-31 18:51:07 +0000235 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
236
Duncan Sands92dd1912010-05-11 20:16:05 +0000237 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
David Blaikie99ba9e32011-12-20 02:48:34 +0000238 virtual void anchor();
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000239 protected:
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000240 void AddDarwinArch(const llvm::opt::ArgList &Args,
241 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000242
243 const toolchains::Darwin &getDarwinToolChain() const {
244 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
245 }
246
247 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000248 DarwinTool(const char *Name, const char *ShortName,
249 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000250 };
251
Duncan Sands92dd1912010-05-11 20:16:05 +0000252 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000253 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000254 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
255 "assembler", TC) {}
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000256
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000257 virtual bool hasIntegratedCPP() const { return false; }
258
259 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000260 const InputInfo &Output,
261 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000262 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000263 const char *LinkingOutput) const;
264 };
265
Duncan Sands92dd1912010-05-11 20:16:05 +0000266 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
Bill Wendling6acf8b42012-10-02 18:02:50 +0000267 bool NeedsTempPath(const InputInfoList &Inputs) const;
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000268 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
269 llvm::opt::ArgStringList &CmdArgs,
270 const InputInfoList &Inputs) const;
Daniel Dunbar02633b52009-03-26 16:23:12 +0000271
Daniel Dunbar02633b52009-03-26 16:23:12 +0000272 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000273 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
Daniel Dunbar02633b52009-03-26 16:23:12 +0000274
Daniel Dunbar02633b52009-03-26 16:23:12 +0000275 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000276 virtual bool isLinkJob() const { return true; }
Daniel Dunbar02633b52009-03-26 16:23:12 +0000277
278 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000279 const InputInfo &Output,
280 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000281 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar02633b52009-03-26 16:23:12 +0000282 const char *LinkingOutput) const;
283 };
284
Duncan Sands92dd1912010-05-11 20:16:05 +0000285 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000286 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000287 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000288
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000289 virtual bool hasIntegratedCPP() const { return false; }
290
291 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000292 const InputInfo &Output,
293 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000294 const llvm::opt::ArgList &TCArgs,
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000295 const char *LinkingOutput) const;
296 };
Daniel Dunbar6e0f2542010-06-04 18:28:36 +0000297
298 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
299 public:
300 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
301 "dsymutil", TC) {}
302
Daniel Dunbar6e0f2542010-06-04 18:28:36 +0000303 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier75dbc712013-02-01 18:30:26 +0000304 virtual bool isDsymutilJob() const { return true; }
Daniel Dunbar6e0f2542010-06-04 18:28:36 +0000305
306 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +0000307 const InputInfo &Output,
308 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000309 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar6e0f2542010-06-04 18:28:36 +0000310 const char *LinkingOutput) const;
311 };
Eric Christopherf8571862011-08-23 17:56:55 +0000312
313 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
314 public:
315 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
Eric Christopher27e2b982012-12-18 00:31:10 +0000316 "dwarfdump", TC) {}
Eric Christopherf8571862011-08-23 17:56:55 +0000317
318 virtual bool hasIntegratedCPP() const { return false; }
319
320 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher27e2b982012-12-18 00:31:10 +0000321 const InputInfo &Output,
322 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000323 const llvm::opt::ArgList &TCArgs,
Eric Christopher27e2b982012-12-18 00:31:10 +0000324 const char *LinkingOutput) const;
Eric Christopherf8571862011-08-23 17:56:55 +0000325 };
326
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000327}
328
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000329 /// openbsd -- Directly call GNU Binutils assembler and linker
330namespace openbsd {
Duncan Sands92dd1912010-05-11 20:16:05 +0000331 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000332 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000333 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
334 TC) {}
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000335
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000336 virtual bool hasIntegratedCPP() const { return false; }
337
338 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000339 const InputInfo &Output,
340 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000341 const llvm::opt::ArgList &TCArgs,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000342 const char *LinkingOutput) const;
343 };
Duncan Sands92dd1912010-05-11 20:16:05 +0000344 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000345 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000346 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000347
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000348 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000349 virtual bool isLinkJob() const { return true; }
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000350
351 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000352 const InputInfo &Output,
353 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000354 const llvm::opt::ArgList &TCArgs,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000355 const char *LinkingOutput) const;
356 };
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000357} // end namespace openbsd
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000358
Eli Friedman42f74f22012-08-08 23:57:20 +0000359 /// bitrig -- Directly call GNU Binutils assembler and linker
360namespace bitrig {
361 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
362 public:
363 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
364 TC) {}
365
366 virtual bool hasIntegratedCPP() const { return false; }
367
368 virtual void ConstructJob(Compilation &C, const JobAction &JA,
369 const InputInfo &Output,
370 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000371 const llvm::opt::ArgList &TCArgs,
Eli Friedman42f74f22012-08-08 23:57:20 +0000372 const char *LinkingOutput) const;
373 };
374 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
375 public:
376 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
377
378 virtual bool hasIntegratedCPP() const { return false; }
379 virtual bool isLinkJob() const { return true; }
380
381 virtual void ConstructJob(Compilation &C, const JobAction &JA,
382 const InputInfo &Output,
383 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000384 const llvm::opt::ArgList &TCArgs,
Eli Friedman42f74f22012-08-08 23:57:20 +0000385 const char *LinkingOutput) const;
386 };
387} // end namespace bitrig
388
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000389 /// freebsd -- Directly call GNU Binutils assembler and linker
390namespace freebsd {
Duncan Sands92dd1912010-05-11 20:16:05 +0000391 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000392 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000393 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
394 TC) {}
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000395
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000396 virtual bool hasIntegratedCPP() const { return false; }
397
398 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000399 const InputInfo &Output,
400 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000401 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000402 const char *LinkingOutput) const;
403 };
Duncan Sands92dd1912010-05-11 20:16:05 +0000404 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Daniel Dunbar008f54a2009-04-01 19:36:32 +0000405 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000406 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
Daniel Dunbar008f54a2009-04-01 19:36:32 +0000407
Daniel Dunbar008f54a2009-04-01 19:36:32 +0000408 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000409 virtual bool isLinkJob() const { return true; }
Daniel Dunbar008f54a2009-04-01 19:36:32 +0000410
411 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000412 const InputInfo &Output,
413 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000414 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar008f54a2009-04-01 19:36:32 +0000415 const char *LinkingOutput) const;
416 };
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000417} // end namespace freebsd
418
Benjamin Kramer8e50a962011-02-02 18:59:27 +0000419 /// netbsd -- Directly call GNU Binutils assembler and linker
420namespace netbsd {
421 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Joerg Sonnenberger182564c2011-05-16 13:35:02 +0000422
Benjamin Kramer8e50a962011-02-02 18:59:27 +0000423 public:
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +0000424 Assemble(const ToolChain &TC)
425 : Tool("netbsd::Assemble", "assembler", TC) {}
Benjamin Kramer8e50a962011-02-02 18:59:27 +0000426
427 virtual bool hasIntegratedCPP() const { return false; }
428
429 virtual void ConstructJob(Compilation &C, const JobAction &JA,
430 const InputInfo &Output,
431 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000432 const llvm::opt::ArgList &TCArgs,
Benjamin Kramer8e50a962011-02-02 18:59:27 +0000433 const char *LinkingOutput) const;
434 };
435 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Joerg Sonnenberger182564c2011-05-16 13:35:02 +0000436
Benjamin Kramer8e50a962011-02-02 18:59:27 +0000437 public:
Joerg Sonnenberger1bd91372012-01-26 22:27:52 +0000438 Link(const ToolChain &TC)
439 : Tool("netbsd::Link", "linker", TC) {}
Benjamin Kramer8e50a962011-02-02 18:59:27 +0000440
441 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000442 virtual bool isLinkJob() const { return true; }
Benjamin Kramer8e50a962011-02-02 18:59:27 +0000443
444 virtual void ConstructJob(Compilation &C, const JobAction &JA,
445 const InputInfo &Output,
446 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000447 const llvm::opt::ArgList &TCArgs,
Benjamin Kramer8e50a962011-02-02 18:59:27 +0000448 const char *LinkingOutput) const;
449 };
450} // end namespace netbsd
451
Thomas Schwinge577bb0a2013-03-28 19:04:25 +0000452 /// Directly call GNU Binutils' assembler and linker.
453namespace gnutools {
Rafael Espindolaba30bbe2010-08-10 00:25:48 +0000454 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
455 public:
Thomas Schwinge577bb0a2013-03-28 19:04:25 +0000456 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
Rafael Espindolaba30bbe2010-08-10 00:25:48 +0000457
458 virtual bool hasIntegratedCPP() const { return false; }
459
460 virtual void ConstructJob(Compilation &C, const JobAction &JA,
461 const InputInfo &Output,
462 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000463 const llvm::opt::ArgList &TCArgs,
Rafael Espindolaba30bbe2010-08-10 00:25:48 +0000464 const char *LinkingOutput) const;
465 };
Rafael Espindolac1da9812010-11-07 20:14:31 +0000466 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
467 public:
Thomas Schwinge577bb0a2013-03-28 19:04:25 +0000468 Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
Rafael Espindolac1da9812010-11-07 20:14:31 +0000469
470 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000471 virtual bool isLinkJob() const { return true; }
Rafael Espindolac1da9812010-11-07 20:14:31 +0000472
473 virtual void ConstructJob(Compilation &C, const JobAction &JA,
474 const InputInfo &Output,
475 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000476 const llvm::opt::ArgList &TCArgs,
Rafael Espindolac1da9812010-11-07 20:14:31 +0000477 const char *LinkingOutput) const;
478 };
Rafael Espindolaba30bbe2010-08-10 00:25:48 +0000479}
Chris Lattner38e317d2010-07-07 16:01:42 +0000480 /// minix -- Directly call GNU Binutils assembler and linker
481namespace minix {
482 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
483 public:
484 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
485 TC) {}
486
Chris Lattner38e317d2010-07-07 16:01:42 +0000487 virtual bool hasIntegratedCPP() const { return false; }
488
489 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Chris Lattner38e317d2010-07-07 16:01:42 +0000490 const InputInfo &Output,
491 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000492 const llvm::opt::ArgList &TCArgs,
Chris Lattner38e317d2010-07-07 16:01:42 +0000493 const char *LinkingOutput) const;
494 };
495 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
496 public:
497 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
498
Chris Lattner38e317d2010-07-07 16:01:42 +0000499 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000500 virtual bool isLinkJob() const { return true; }
Chris Lattner38e317d2010-07-07 16:01:42 +0000501
502 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Chris Lattner38e317d2010-07-07 16:01:42 +0000503 const InputInfo &Output,
504 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000505 const llvm::opt::ArgList &TCArgs,
Chris Lattner38e317d2010-07-07 16:01:42 +0000506 const char *LinkingOutput) const;
507 };
508} // end namespace minix
509
David Chisnall31c46902012-02-15 13:39:01 +0000510 /// solaris -- Directly call Solaris assembler and linker
511namespace solaris {
512 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
513 public:
514 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
515 TC) {}
516
517 virtual bool hasIntegratedCPP() const { return false; }
518
519 virtual void ConstructJob(Compilation &C, const JobAction &JA,
520 const InputInfo &Output,
521 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000522 const llvm::opt::ArgList &TCArgs,
David Chisnall31c46902012-02-15 13:39:01 +0000523 const char *LinkingOutput) const;
524 };
525 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
526 public:
527 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
528
529 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000530 virtual bool isLinkJob() const { return true; }
David Chisnall31c46902012-02-15 13:39:01 +0000531
532 virtual void ConstructJob(Compilation &C, const JobAction &JA,
533 const InputInfo &Output,
534 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000535 const llvm::opt::ArgList &TCArgs,
David Chisnall31c46902012-02-15 13:39:01 +0000536 const char *LinkingOutput) const;
537 };
David Chisnallbadb6cd2012-02-15 16:25:46 +0000538} // end namespace solaris
David Chisnall31c46902012-02-15 13:39:01 +0000539
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000540 /// auroraux -- Directly call GNU Binutils assembler and linker
541namespace auroraux {
Duncan Sands92dd1912010-05-11 20:16:05 +0000542 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000543 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000544 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
545 TC) {}
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000546
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000547 virtual bool hasIntegratedCPP() const { return false; }
548
549 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000550 const InputInfo &Output,
551 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000552 const llvm::opt::ArgList &TCArgs,
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000553 const char *LinkingOutput) const;
554 };
Duncan Sands92dd1912010-05-11 20:16:05 +0000555 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000556 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000557 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000558
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000559 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000560 virtual bool isLinkJob() const { return true; }
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000561
562 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000563 const InputInfo &Output,
564 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000565 const llvm::opt::ArgList &TCArgs,
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000566 const char *LinkingOutput) const;
567 };
568} // end namespace auroraux
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000569
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000570 /// dragonfly -- Directly call GNU Binutils assembler and linker
571namespace dragonfly {
Duncan Sands92dd1912010-05-11 20:16:05 +0000572 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000573 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000574 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
575 TC) {}
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000576
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000577 virtual bool hasIntegratedCPP() const { return false; }
578
579 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000580 const InputInfo &Output,
581 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000582 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000583 const char *LinkingOutput) const;
584 };
Duncan Sands92dd1912010-05-11 20:16:05 +0000585 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000586 public:
Daniel Dunbar30382042010-05-22 00:37:18 +0000587 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000588
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000589 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000590 virtual bool isLinkJob() const { return true; }
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000591
592 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump1eb44332009-09-09 15:08:12 +0000593 const InputInfo &Output,
594 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000595 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000596 const char *LinkingOutput) const;
597 };
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000598} // end namespace dragonfly
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000599
Michael J. Spencerff58e362010-08-21 21:55:07 +0000600 /// Visual studio tools.
601namespace visualstudio {
602 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
603 public:
604 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
605
606 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosier8ba9a622012-03-07 00:30:40 +0000607 virtual bool isLinkJob() const { return true; }
Michael J. Spencerff58e362010-08-21 21:55:07 +0000608
609 virtual void ConstructJob(Compilation &C, const JobAction &JA,
610 const InputInfo &Output,
611 const InputInfoList &Inputs,
Reid Klecknerdd0b3c42013-06-17 13:59:19 +0000612 const llvm::opt::ArgList &TCArgs,
Michael J. Spencerff58e362010-08-21 21:55:07 +0000613 const char *LinkingOutput) const;
614 };
615} // end namespace visualstudio
616
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000617} // end namespace toolchains
618} // end namespace driver
619} // end namespace clang
620
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000621#endif // CLANG_LIB_DRIVER_TOOLS_H_