blob: d5b2848c9b01cd2976f4aa1df1ccc4530b621664 [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 {
Daniel Dunbarf0a5b9b2009-09-04 18:34:51 +000028 class Darwin;
Daniel Dunbarc1964212009-03-26 16:23:12 +000029}
30
Daniel Dunbar15abb2e2009-03-17 22:18:43 +000031namespace tools {
Reid Kleckner898229a2013-06-14 17:17:23 +000032using llvm::opt::ArgStringList;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000033
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +000034 /// \brief Clang compiler tool.
Duncan Sandsaf260b92010-05-11 20:16:05 +000035 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
Eric Christopher45f2e712012-12-18 00:31:10 +000036 public:
Reid Kleckner724c21c2013-06-17 13:59:19 +000037 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000038 const InputInfoList &Inputs);
Reid Kleckner724c21c2013-06-17 13:59:19 +000039 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000040 const InputInfoList &Inputs);
Reid Kleckner724c21c2013-06-17 13:59:19 +000041 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
Bob Wilsondecc03e2012-11-23 06:14:39 +000042 const InputInfoList &Inputs);
43
Eric Christopher45f2e712012-12-18 00:31:10 +000044 private:
Reid Kleckner724c21c2013-06-17 13:59:19 +000045 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
Peter Collingbourne9b515cb2011-11-06 00:40:05 +000046 const Driver &D,
Reid Kleckner724c21c2013-06-17 13:59:19 +000047 const llvm::opt::ArgList &Args,
48 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbard067f7f2009-04-08 23:54:23 +000049 const InputInfo &Output,
50 const InputInfoList &Inputs) const;
51
Amara Emerson703da2e2013-10-31 09:32:33 +000052 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
53 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000054 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
55 llvm::opt::ArgStringList &CmdArgs,
Daniel Dunbarc9388c12011-03-17 17:10:06 +000056 bool KernelOrKext) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000057 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000059 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
60 llvm::opt::ArgStringList &CmdArgs) const;
61 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
62 llvm::opt::ArgStringList &CmdArgs) const;
Richard Sandiford4652d892013-07-19 16:51:51 +000063 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
64 llvm::opt::ArgStringList &CmdArgs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +000065 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
66 llvm::opt::ArgStringList &CmdArgs) const;
67 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
68 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +000069
John McCall5fb5df92012-06-20 06:18:46 +000070 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
71
Reid Kleckner724c21c2013-06-17 13:59:19 +000072 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
73 llvm::opt::ArgStringList &cmdArgs,
John McCall5fb5df92012-06-20 06:18:46 +000074 RewriteKind rewrite) const;
75
Hans Wennborg75958c42013-08-08 00:17:41 +000076 void AddClangCLArgs(const llvm::opt::ArgList &Args,
77 llvm::opt::ArgStringList &CmdArgs) const;
78
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000079 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +000080 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000081
Daniel Dunbar3d45e172010-04-06 17:07:49 +000082 virtual bool hasGoodDiagnostics() const { return true; }
Daniel Dunbarc4343942010-02-03 03:07:56 +000083 virtual bool hasIntegratedAssembler() const { return true; }
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000084 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +000085
86 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +000087 const InputInfo &Output,
88 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +000089 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar1a093d22009-03-18 06:00:36 +000090 const char *LinkingOutput) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000091 };
92
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +000093 /// \brief Clang integrated assembler tool.
94 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
95 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +000096 ClangAs(const ToolChain &TC) : Tool("clang::as",
97 "clang integrated assembler", TC) {}
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +000098
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +000099 virtual bool hasGoodDiagnostics() const { return true; }
100 virtual bool hasIntegratedAssembler() const { return false; }
101 virtual bool hasIntegratedCPP() const { return false; }
102
103 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000104 const InputInfo &Output,
105 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000106 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar4f5e79c2010-05-20 21:30:13 +0000107 const char *LinkingOutput) const;
108 };
109
Daniel Dunbar82116f82009-03-17 22:45:24 +0000110 /// gcc - Generic GCC tool implementations.
111namespace gcc {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000112 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000113 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000114 Common(const char *Name, const char *ShortName,
115 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
Daniel Dunbara3246a02009-03-18 08:07:30 +0000116
117 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000118 const InputInfo &Output,
119 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000120 const llvm::opt::ArgList &TCArgs,
Daniel Dunbara3246a02009-03-18 08:07:30 +0000121 const char *LinkingOutput) const;
122
123 /// RenderExtraToolArgs - Render any arguments necessary to force
124 /// the particular tool mode.
Reid Kleckner724c21c2013-06-17 13:59:19 +0000125 virtual void
126 RenderExtraToolArgs(const JobAction &JA,
127 llvm::opt::ArgStringList &CmdArgs) const = 0;
Daniel Dunbara3246a02009-03-18 08:07:30 +0000128 };
129
Duncan Sandsaf260b92010-05-11 20:16:05 +0000130 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
Daniel Dunbara3246a02009-03-18 08:07:30 +0000131 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000132 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
133 "gcc preprocessor", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000134
Daniel Dunbar3d45e172010-04-06 17:07:49 +0000135 virtual bool hasGoodDiagnostics() const { return true; }
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000136 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000137
Daniel Dunbar4e295052010-01-25 22:35:08 +0000138 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000139 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000140 };
141
Duncan Sandsaf260b92010-05-11 20:16:05 +0000142 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000143 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000144 Precompile(const ToolChain &TC) : Common("gcc::Precompile",
145 "gcc precompile", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000146
Daniel Dunbar3d45e172010-04-06 17:07:49 +0000147 virtual bool hasGoodDiagnostics() const { return true; }
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000148 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000149
Daniel Dunbar4e295052010-01-25 22:35:08 +0000150 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000151 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000152 };
153
Duncan Sandsaf260b92010-05-11 20:16:05 +0000154 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000155 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000156 Compile(const ToolChain &TC) : Common("gcc::Compile",
157 "gcc frontend", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000158
Daniel Dunbar3d45e172010-04-06 17:07:49 +0000159 virtual bool hasGoodDiagnostics() const { return true; }
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000160 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000161
Daniel Dunbar4e295052010-01-25 22:35:08 +0000162 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000163 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000164 };
165
Duncan Sandsaf260b92010-05-11 20:16:05 +0000166 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000167 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000168 Assemble(const ToolChain &TC) : Common("gcc::Assemble",
169 "assembler (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000170
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000171 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000172
Daniel Dunbar4e295052010-01-25 22:35:08 +0000173 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000174 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000175 };
176
Duncan Sandsaf260b92010-05-11 20:16:05 +0000177 class LLVM_LIBRARY_VISIBILITY Link : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000178 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000179 Link(const ToolChain &TC) : Common("gcc::Link",
180 "linker (via gcc)", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000181
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000182 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000183 virtual bool isLinkJob() const { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000184
Daniel Dunbar4e295052010-01-25 22:35:08 +0000185 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000186 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000187 };
Daniel Dunbar82116f82009-03-17 22:45:24 +0000188} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000189
Tony Linthicum76329bf2011-12-12 21:14:55 +0000190namespace hexagon {
191 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
192 // We simply use "clang -cc1" for those actions.
193 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
194 public:
195 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
196 "hexagon-as", TC) {}
197
198 virtual bool hasIntegratedCPP() const { return false; }
199
200 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000201 llvm::opt::ArgStringList &CmdArgs) const;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000202 virtual void ConstructJob(Compilation &C, const JobAction &JA,
203 const InputInfo &Output,
204 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000205 const llvm::opt::ArgList &TCArgs,
Tony Linthicum76329bf2011-12-12 21:14:55 +0000206 const char *LinkingOutput) const;
207 };
208
209 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
210 public:
211 Link(const ToolChain &TC) : Tool("hexagon::Link",
212 "hexagon-ld", TC) {}
213
214 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000215 virtual bool isLinkJob() const { return true; }
Tony Linthicum76329bf2011-12-12 21:14:55 +0000216
217 virtual void RenderExtraToolArgs(const JobAction &JA,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000218 llvm::opt::ArgStringList &CmdArgs) const;
Tony Linthicum76329bf2011-12-12 21:14:55 +0000219 virtual void ConstructJob(Compilation &C, const JobAction &JA,
220 const InputInfo &Output,
221 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000222 const llvm::opt::ArgList &TCArgs,
Tony Linthicum76329bf2011-12-12 21:14:55 +0000223 const char *LinkingOutput) const;
224 };
225} // end namespace hexagon.
226
227
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000228namespace darwin {
Rafael Espindoladcbf6982012-10-31 18:51:07 +0000229 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
230
Duncan Sandsaf260b92010-05-11 20:16:05 +0000231 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
David Blaikie68e081d2011-12-20 02:48:34 +0000232 virtual void anchor();
Daniel Dunbare9ded432009-09-09 18:36:20 +0000233 protected:
Reid Kleckner724c21c2013-06-17 13:59:19 +0000234 void AddDarwinArch(const llvm::opt::ArgList &Args,
235 llvm::opt::ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000236
237 const toolchains::Darwin &getDarwinToolChain() const {
238 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
239 }
240
241 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000242 DarwinTool(const char *Name, const char *ShortName,
243 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
Daniel Dunbare9ded432009-09-09 18:36:20 +0000244 };
245
Duncan Sandsaf260b92010-05-11 20:16:05 +0000246 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
Daniel Dunbarbe220842009-03-20 16:06:39 +0000247 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000248 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
249 "assembler", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000250
Daniel Dunbarbe220842009-03-20 16:06:39 +0000251 virtual bool hasIntegratedCPP() const { return false; }
252
253 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000254 const InputInfo &Output,
255 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000256 const llvm::opt::ArgList &TCArgs,
Daniel Dunbarbe220842009-03-20 16:06:39 +0000257 const char *LinkingOutput) const;
258 };
259
Duncan Sandsaf260b92010-05-11 20:16:05 +0000260 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
Bill Wendling3b2000f2012-10-02 18:02:50 +0000261 bool NeedsTempPath(const InputInfoList &Inputs) const;
Reid Kleckner724c21c2013-06-17 13:59:19 +0000262 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
263 llvm::opt::ArgStringList &CmdArgs,
264 const InputInfoList &Inputs) const;
Daniel Dunbarc1964212009-03-26 16:23:12 +0000265
Daniel Dunbarc1964212009-03-26 16:23:12 +0000266 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000267 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000268
Daniel Dunbarc1964212009-03-26 16:23:12 +0000269 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000270 virtual bool isLinkJob() const { return true; }
Daniel Dunbarc1964212009-03-26 16:23:12 +0000271
272 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000273 const InputInfo &Output,
274 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000275 const llvm::opt::ArgList &TCArgs,
Daniel Dunbarc1964212009-03-26 16:23:12 +0000276 const char *LinkingOutput) const;
277 };
278
Duncan Sandsaf260b92010-05-11 20:16:05 +0000279 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000280 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000281 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000282
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000283 virtual bool hasIntegratedCPP() const { return false; }
284
285 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000286 const InputInfo &Output,
287 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000288 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000289 const char *LinkingOutput) const;
290 };
Daniel Dunbar88299622010-06-04 18:28:36 +0000291
292 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
293 public:
294 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
295 "dsymutil", TC) {}
296
Daniel Dunbar88299622010-06-04 18:28:36 +0000297 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierdbf46a12013-02-01 18:30:26 +0000298 virtual bool isDsymutilJob() const { return true; }
Daniel Dunbar88299622010-06-04 18:28:36 +0000299
300 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar88299622010-06-04 18:28:36 +0000301 const InputInfo &Output,
302 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000303 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar88299622010-06-04 18:28:36 +0000304 const char *LinkingOutput) const;
305 };
Eric Christopher551ef452011-08-23 17:56:55 +0000306
307 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
308 public:
309 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
Eric Christopher45f2e712012-12-18 00:31:10 +0000310 "dwarfdump", TC) {}
Eric Christopher551ef452011-08-23 17:56:55 +0000311
312 virtual bool hasIntegratedCPP() const { return false; }
313
314 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Eric Christopher45f2e712012-12-18 00:31:10 +0000315 const InputInfo &Output,
316 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000317 const llvm::opt::ArgList &TCArgs,
Eric Christopher45f2e712012-12-18 00:31:10 +0000318 const char *LinkingOutput) const;
Eric Christopher551ef452011-08-23 17:56:55 +0000319 };
320
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000321}
322
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000323 /// openbsd -- Directly call GNU Binutils assembler and linker
324namespace openbsd {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000325 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000326 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000327 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
328 TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000329
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000330 virtual bool hasIntegratedCPP() const { return false; }
331
332 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000333 const InputInfo &Output,
334 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000335 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000336 const char *LinkingOutput) const;
337 };
Duncan Sandsaf260b92010-05-11 20:16:05 +0000338 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000339 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000340 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000341
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000342 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000343 virtual bool isLinkJob() const { return true; }
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000344
345 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000346 const InputInfo &Output,
347 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000348 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000349 const char *LinkingOutput) const;
350 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000351} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000352
Eli Friedman9fa28852012-08-08 23:57:20 +0000353 /// bitrig -- Directly call GNU Binutils assembler and linker
354namespace bitrig {
355 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
356 public:
357 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
358 TC) {}
359
360 virtual bool hasIntegratedCPP() const { return false; }
361
362 virtual void ConstructJob(Compilation &C, const JobAction &JA,
363 const InputInfo &Output,
364 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000365 const llvm::opt::ArgList &TCArgs,
Eli Friedman9fa28852012-08-08 23:57:20 +0000366 const char *LinkingOutput) const;
367 };
368 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
369 public:
370 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
371
372 virtual bool hasIntegratedCPP() const { return false; }
373 virtual bool isLinkJob() const { return true; }
374
375 virtual void ConstructJob(Compilation &C, const JobAction &JA,
376 const InputInfo &Output,
377 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000378 const llvm::opt::ArgList &TCArgs,
Eli Friedman9fa28852012-08-08 23:57:20 +0000379 const char *LinkingOutput) const;
380 };
381} // end namespace bitrig
382
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000383 /// freebsd -- Directly call GNU Binutils assembler and linker
384namespace freebsd {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000385 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000386 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000387 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
388 TC) {}
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000389
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000390 virtual bool hasIntegratedCPP() const { return false; }
391
392 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000393 const InputInfo &Output,
394 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000395 const llvm::opt::ArgList &TCArgs,
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000396 const char *LinkingOutput) const;
397 };
Duncan Sandsaf260b92010-05-11 20:16:05 +0000398 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000399 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000400 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000401
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000402 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000403 virtual bool isLinkJob() const { return true; }
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000404
405 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000406 const InputInfo &Output,
407 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000408 const llvm::opt::ArgList &TCArgs,
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000409 const char *LinkingOutput) const;
410 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000411} // end namespace freebsd
412
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000413 /// netbsd -- Directly call GNU Binutils assembler and linker
414namespace netbsd {
415 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000416
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000417 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000418 Assemble(const ToolChain &TC)
419 : Tool("netbsd::Assemble", "assembler", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000420
421 virtual bool hasIntegratedCPP() const { return false; }
422
423 virtual void ConstructJob(Compilation &C, const JobAction &JA,
424 const InputInfo &Output,
425 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000426 const llvm::opt::ArgList &TCArgs,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000427 const char *LinkingOutput) const;
428 };
429 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Joerg Sonnenberger637603a2011-05-16 13:35:02 +0000430
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000431 public:
Joerg Sonnenbergerd64c60e2012-01-26 22:27:52 +0000432 Link(const ToolChain &TC)
433 : Tool("netbsd::Link", "linker", TC) {}
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000434
435 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000436 virtual bool isLinkJob() const { return true; }
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000437
438 virtual void ConstructJob(Compilation &C, const JobAction &JA,
439 const InputInfo &Output,
440 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000441 const llvm::opt::ArgList &TCArgs,
Benjamin Kramer24f1d3e2011-02-02 18:59:27 +0000442 const char *LinkingOutput) const;
443 };
444} // end namespace netbsd
445
Thomas Schwinge4e555262013-03-28 19:04:25 +0000446 /// Directly call GNU Binutils' assembler and linker.
447namespace gnutools {
Rafael Espindola92b00932010-08-10 00:25:48 +0000448 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
449 public:
Thomas Schwinge4e555262013-03-28 19:04:25 +0000450 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
Rafael Espindola92b00932010-08-10 00:25:48 +0000451
452 virtual bool hasIntegratedCPP() const { return false; }
453
454 virtual void ConstructJob(Compilation &C, const JobAction &JA,
455 const InputInfo &Output,
456 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000457 const llvm::opt::ArgList &TCArgs,
Rafael Espindola92b00932010-08-10 00:25:48 +0000458 const char *LinkingOutput) const;
459 };
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000460 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
461 public:
Thomas Schwinge4e555262013-03-28 19:04:25 +0000462 Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000463
464 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000465 virtual bool isLinkJob() const { return true; }
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000466
467 virtual void ConstructJob(Compilation &C, const JobAction &JA,
468 const InputInfo &Output,
469 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000470 const llvm::opt::ArgList &TCArgs,
Rafael Espindolac8f008f2010-11-07 20:14:31 +0000471 const char *LinkingOutput) const;
472 };
Rafael Espindola92b00932010-08-10 00:25:48 +0000473}
Chris Lattner3e2ee142010-07-07 16:01:42 +0000474 /// minix -- Directly call GNU Binutils assembler and linker
475namespace minix {
476 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
477 public:
478 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
479 TC) {}
480
Chris Lattner3e2ee142010-07-07 16:01:42 +0000481 virtual bool hasIntegratedCPP() const { return false; }
482
483 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Chris Lattner3e2ee142010-07-07 16:01:42 +0000484 const InputInfo &Output,
485 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000486 const llvm::opt::ArgList &TCArgs,
Chris Lattner3e2ee142010-07-07 16:01:42 +0000487 const char *LinkingOutput) const;
488 };
489 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
490 public:
491 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
492
Chris Lattner3e2ee142010-07-07 16:01:42 +0000493 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000494 virtual bool isLinkJob() const { return true; }
Chris Lattner3e2ee142010-07-07 16:01:42 +0000495
496 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Chris Lattner3e2ee142010-07-07 16:01:42 +0000497 const InputInfo &Output,
498 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000499 const llvm::opt::ArgList &TCArgs,
Chris Lattner3e2ee142010-07-07 16:01:42 +0000500 const char *LinkingOutput) const;
501 };
502} // end namespace minix
503
David Chisnallf571cde2012-02-15 13:39:01 +0000504 /// solaris -- Directly call Solaris assembler and linker
505namespace solaris {
506 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
507 public:
508 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
509 TC) {}
510
511 virtual bool hasIntegratedCPP() const { return false; }
512
513 virtual void ConstructJob(Compilation &C, const JobAction &JA,
514 const InputInfo &Output,
515 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000516 const llvm::opt::ArgList &TCArgs,
David Chisnallf571cde2012-02-15 13:39:01 +0000517 const char *LinkingOutput) const;
518 };
519 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
520 public:
521 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
522
523 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000524 virtual bool isLinkJob() const { return true; }
David Chisnallf571cde2012-02-15 13:39:01 +0000525
526 virtual void ConstructJob(Compilation &C, const JobAction &JA,
527 const InputInfo &Output,
528 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000529 const llvm::opt::ArgList &TCArgs,
David Chisnallf571cde2012-02-15 13:39:01 +0000530 const char *LinkingOutput) const;
531 };
David Chisnalla9ed5d72012-02-15 16:25:46 +0000532} // end namespace solaris
David Chisnallf571cde2012-02-15 13:39:01 +0000533
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000534 /// auroraux -- Directly call GNU Binutils assembler and linker
535namespace auroraux {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000536 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000537 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000538 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
539 TC) {}
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000540
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000541 virtual bool hasIntegratedCPP() const { return false; }
542
543 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000544 const InputInfo &Output,
545 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000546 const llvm::opt::ArgList &TCArgs,
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000547 const char *LinkingOutput) const;
548 };
Duncan Sandsaf260b92010-05-11 20:16:05 +0000549 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000550 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000551 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000552
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000553 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000554 virtual bool isLinkJob() const { return true; }
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000555
556 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000557 const InputInfo &Output,
558 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000559 const llvm::opt::ArgList &TCArgs,
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000560 const char *LinkingOutput) const;
561 };
562} // end namespace auroraux
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000563
Daniel Dunbarcc912342009-05-02 18:28:39 +0000564 /// dragonfly -- Directly call GNU Binutils assembler and linker
565namespace dragonfly {
Duncan Sandsaf260b92010-05-11 20:16:05 +0000566 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000567 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000568 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
569 TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000570
Daniel Dunbarcc912342009-05-02 18:28:39 +0000571 virtual bool hasIntegratedCPP() const { return false; }
572
573 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000574 const InputInfo &Output,
575 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000576 const llvm::opt::ArgList &TCArgs,
Daniel Dunbarcc912342009-05-02 18:28:39 +0000577 const char *LinkingOutput) const;
578 };
Duncan Sandsaf260b92010-05-11 20:16:05 +0000579 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Daniel Dunbarcc912342009-05-02 18:28:39 +0000580 public:
Daniel Dunbar1cb532c2010-05-22 00:37:18 +0000581 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
Daniel Dunbarcc912342009-05-02 18:28:39 +0000582
Daniel Dunbarcc912342009-05-02 18:28:39 +0000583 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000584 virtual bool isLinkJob() const { return true; }
Daniel Dunbarcc912342009-05-02 18:28:39 +0000585
586 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Mike Stump11289f42009-09-09 15:08:12 +0000587 const InputInfo &Output,
588 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000589 const llvm::opt::ArgList &TCArgs,
Daniel Dunbarcc912342009-05-02 18:28:39 +0000590 const char *LinkingOutput) const;
591 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000592} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000593
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000594 /// Visual studio tools.
595namespace visualstudio {
Hans Wennborg87cfa712013-09-19 20:32:16 +0000596 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000597 public:
598 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
599
600 virtual bool hasIntegratedCPP() const { return false; }
Chad Rosierbee5a1d2012-03-07 00:30:40 +0000601 virtual bool isLinkJob() const { return true; }
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000602
603 virtual void ConstructJob(Compilation &C, const JobAction &JA,
604 const InputInfo &Output,
605 const InputInfoList &Inputs,
Reid Kleckner724c21c2013-06-17 13:59:19 +0000606 const llvm::opt::ArgList &TCArgs,
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000607 const char *LinkingOutput) const;
608 };
Hans Wennborg87cfa712013-09-19 20:32:16 +0000609
610 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
611 public:
612 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
613
614 virtual bool hasIntegratedAssembler() const { return true; }
615 virtual bool hasIntegratedCPP() const { return true; }
616 virtual bool isLinkJob() const { return false; }
617
618 virtual void ConstructJob(Compilation &C, const JobAction &JA,
619 const InputInfo &Output,
620 const InputInfoList &Inputs,
621 const llvm::opt::ArgList &TCArgs,
622 const char *LinkingOutput) const;
623
624 Command *GetCommand(Compilation &C, const JobAction &JA,
625 const InputInfo &Output,
626 const InputInfoList &Inputs,
627 const llvm::opt::ArgList &TCArgs,
628 const char *LinkingOutput) const;
629 };
Michael J. Spencerb186bc32010-08-21 21:55:07 +0000630} // end namespace visualstudio
631
Robert Lyttoncf1dd692013-10-11 10:29:40 +0000632namespace XCore {
633 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
634 // We simply use "clang -cc1" for those actions.
635 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
636 public:
637 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
638 "XCore-as", TC) {}
639
640 virtual bool hasIntegratedCPP() const { return false; }
641 virtual void ConstructJob(Compilation &C, const JobAction &JA,
642 const InputInfo &Output,
643 const InputInfoList &Inputs,
644 const llvm::opt::ArgList &TCArgs,
645 const char *LinkingOutput) const;
646 };
647
648 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
649 public:
650 Link(const ToolChain &TC) : Tool("XCore::Link",
651 "XCore-ld", TC) {}
652
653 virtual bool hasIntegratedCPP() const { return false; }
654 virtual bool isLinkJob() const { return true; }
655 virtual void ConstructJob(Compilation &C, const JobAction &JA,
656 const InputInfo &Output,
657 const InputInfoList &Inputs,
658 const llvm::opt::ArgList &TCArgs,
659 const char *LinkingOutput) const;
660 };
661} // end namespace XCore.
662
663
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000664} // end namespace toolchains
665} // end namespace driver
666} // end namespace clang
667
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000668#endif // CLANG_LIB_DRIVER_TOOLS_H_