blob: db596417a9d2814fea9f5fcb374cf2c0df683cde [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"
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000016
17#include "llvm/Support/Compiler.h"
18
19namespace clang {
20namespace driver {
Douglas Gregordf91ef32009-04-18 00:34:01 +000021 class Driver;
22
Daniel Dunbar02633b52009-03-26 16:23:12 +000023namespace toolchains {
Daniel Dunbarf3955282009-09-04 18:34:51 +000024 class Darwin;
Daniel Dunbar02633b52009-03-26 16:23:12 +000025}
26
Daniel Dunbar985b8252009-03-17 22:18:43 +000027namespace tools {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000028
Daniel Dunbar985b8252009-03-17 22:18:43 +000029 class VISIBILITY_HIDDEN Clang : public Tool {
Douglas Gregordf91ef32009-04-18 00:34:01 +000030 void AddPreprocessingOptions(const Driver &D,
31 const ArgList &Args,
Daniel Dunbarc21c4852009-04-08 23:54:23 +000032 ArgStringList &CmdArgs,
33 const InputInfo &Output,
34 const InputInfoList &Inputs) const;
35
Daniel Dunbarb163ef72009-09-10 04:57:17 +000036 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbar6acda162009-09-09 22:33:08 +000037 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
38
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000039 public:
Daniel Dunbar31b1e542009-03-17 22:45:24 +000040 Clang(const ToolChain &TC) : Tool("clang", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000041
42 virtual bool acceptsPipedInput() const { return true; }
43 virtual bool canPipeOutput() const { return true; }
Daniel Dunbar8767cbc2010-02-03 03:07:56 +000044 virtual bool hasIntegratedAssembler() const { return true; }
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000045 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000046
47 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +000048 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +000049 const InputInfo &Output,
50 const InputInfoList &Inputs,
51 const ArgList &TCArgs,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000052 const char *LinkingOutput) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000053 };
54
Daniel Dunbar31b1e542009-03-17 22:45:24 +000055 /// gcc - Generic GCC tool implementations.
56namespace gcc {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000057 class VISIBILITY_HIDDEN Common : public Tool {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000058 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000059 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
60
61 virtual void ConstructJob(Compilation &C, const JobAction &JA,
62 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +000063 const InputInfo &Output,
64 const InputInfoList &Inputs,
65 const ArgList &TCArgs,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000066 const char *LinkingOutput) const;
67
68 /// RenderExtraToolArgs - Render any arguments necessary to force
69 /// the particular tool mode.
Daniel Dunbar82b51cc2010-01-25 22:35:08 +000070 virtual void RenderExtraToolArgs(const JobAction &JA,
71 ArgStringList &CmdArgs) const = 0;
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000072 };
73
Mike Stump1eb44332009-09-09 15:08:12 +000074
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000075 class VISIBILITY_HIDDEN Preprocess : public Common {
76 public:
77 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000078
79 virtual bool acceptsPipedInput() const { return true; }
80 virtual bool canPipeOutput() const { return true; }
81 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000082
Daniel Dunbar82b51cc2010-01-25 22:35:08 +000083 virtual void RenderExtraToolArgs(const JobAction &JA,
84 ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000085 };
86
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000087 class VISIBILITY_HIDDEN Precompile : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000088 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000089 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000090
91 virtual bool acceptsPipedInput() const { return true; }
92 virtual bool canPipeOutput() const { return false; }
93 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000094
Daniel Dunbar82b51cc2010-01-25 22:35:08 +000095 virtual void RenderExtraToolArgs(const JobAction &JA,
96 ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000097 };
98
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000099 class VISIBILITY_HIDDEN Compile : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000100 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000101 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000102
103 virtual bool acceptsPipedInput() const { return true; }
104 virtual bool canPipeOutput() const { return true; }
105 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000106
Daniel Dunbar82b51cc2010-01-25 22:35:08 +0000107 virtual void RenderExtraToolArgs(const JobAction &JA,
108 ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000109 };
110
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000111 class VISIBILITY_HIDDEN Assemble : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000112 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000113 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000114
115 virtual bool acceptsPipedInput() const { return true; }
116 virtual bool canPipeOutput() const { return false; }
117 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000118
Daniel Dunbar82b51cc2010-01-25 22:35:08 +0000119 virtual void RenderExtraToolArgs(const JobAction &JA,
120 ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000121 };
122
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000123 class VISIBILITY_HIDDEN Link : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000124 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000125 Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000126
127 virtual bool acceptsPipedInput() const { return false; }
128 virtual bool canPipeOutput() const { return false; }
129 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000130
Daniel Dunbar82b51cc2010-01-25 22:35:08 +0000131 virtual void RenderExtraToolArgs(const JobAction &JA,
132 ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000133 };
Daniel Dunbar31b1e542009-03-17 22:45:24 +0000134} // end namespace gcc
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000135
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000136namespace darwin {
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000137 class VISIBILITY_HIDDEN DarwinTool : public Tool {
138 protected:
139 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000140
141 const toolchains::Darwin &getDarwinToolChain() const {
142 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
143 }
144
145 public:
Daniel Dunbar7177dee2009-12-19 17:50:07 +0000146 DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000147 };
148
149 class VISIBILITY_HIDDEN CC1 : public DarwinTool {
Daniel Dunbara5a7bd02009-03-30 00:34:04 +0000150 public:
Mike Stump1eb44332009-09-09 15:08:12 +0000151 static const char *getBaseInputName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +0000152 const InputInfoList &Input);
Mike Stump1eb44332009-09-09 15:08:12 +0000153 static const char *getBaseInputStem(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +0000154 const InputInfoList &Input);
Mike Stump1eb44332009-09-09 15:08:12 +0000155 static const char *getDependencyFileName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +0000156 const InputInfoList &Inputs);
157
Daniel Dunbar40f12652009-03-29 17:08:39 +0000158 protected:
159 const char *getCC1Name(types::ID Type) const;
160
Daniel Dunbara3ec60e2009-03-29 18:40:18 +0000161 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbar40f12652009-03-29 17:08:39 +0000162 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
163 const InputInfoList &Inputs,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +0000164 const ArgStringList &OutputArgs) const;
Daniel Dunbar40f12652009-03-29 17:08:39 +0000165 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
166 const InputInfoList &Inputs,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +0000167 const ArgStringList &OutputArgs) const;
Mike Stump1eb44332009-09-09 15:08:12 +0000168 void AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +0000169 ArgStringList &CmdArgs,
170 const InputInfoList &Inputs) const;
171 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbar40f12652009-03-29 17:08:39 +0000172
173 public:
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000174 CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
Daniel Dunbar40f12652009-03-29 17:08:39 +0000175
176 virtual bool acceptsPipedInput() const { return true; }
177 virtual bool canPipeOutput() const { return true; }
178 virtual bool hasIntegratedCPP() const { return true; }
179 };
180
181 class VISIBILITY_HIDDEN Preprocess : public CC1 {
182 public:
183 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
184
185 virtual void ConstructJob(Compilation &C, const JobAction &JA,
186 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000187 const InputInfo &Output,
188 const InputInfoList &Inputs,
189 const ArgList &TCArgs,
Daniel Dunbar40f12652009-03-29 17:08:39 +0000190 const char *LinkingOutput) const;
191 };
192
193 class VISIBILITY_HIDDEN Compile : public CC1 {
194 public:
195 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
196
197 virtual void ConstructJob(Compilation &C, const JobAction &JA,
198 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000199 const InputInfo &Output,
200 const InputInfoList &Inputs,
201 const ArgList &TCArgs,
Daniel Dunbar40f12652009-03-29 17:08:39 +0000202 const char *LinkingOutput) const;
203 };
204
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000205 class VISIBILITY_HIDDEN Assemble : public DarwinTool {
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000206 public:
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000207 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000208
209 virtual bool acceptsPipedInput() const { return true; }
210 virtual bool canPipeOutput() const { return false; }
211 virtual bool hasIntegratedCPP() const { return false; }
212
213 virtual void ConstructJob(Compilation &C, const JobAction &JA,
214 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000215 const InputInfo &Output,
216 const InputInfoList &Inputs,
217 const ArgList &TCArgs,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000218 const char *LinkingOutput) const;
219 };
220
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000221 class VISIBILITY_HIDDEN Link : public DarwinTool {
Daniel Dunbar02633b52009-03-26 16:23:12 +0000222 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
223
Daniel Dunbar02633b52009-03-26 16:23:12 +0000224 public:
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000225 Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
Daniel Dunbar02633b52009-03-26 16:23:12 +0000226
227 virtual bool acceptsPipedInput() const { return false; }
228 virtual bool canPipeOutput() const { return false; }
229 virtual bool hasIntegratedCPP() const { return false; }
230
231 virtual void ConstructJob(Compilation &C, const JobAction &JA,
232 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000233 const InputInfo &Output,
234 const InputInfoList &Inputs,
235 const ArgList &TCArgs,
Daniel Dunbar02633b52009-03-26 16:23:12 +0000236 const char *LinkingOutput) const;
237 };
238
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000239 class VISIBILITY_HIDDEN Lipo : public DarwinTool {
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000240 public:
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000241 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000242
243 virtual bool acceptsPipedInput() const { return false; }
244 virtual bool canPipeOutput() const { return false; }
245 virtual bool hasIntegratedCPP() const { return false; }
246
247 virtual void ConstructJob(Compilation &C, const JobAction &JA,
248 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000249 const InputInfo &Output,
250 const InputInfoList &Inputs,
251 const ArgList &TCArgs,
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000252 const char *LinkingOutput) const;
253 };
254}
255
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000256 /// openbsd -- Directly call GNU Binutils assembler and linker
257namespace openbsd {
258 class VISIBILITY_HIDDEN Assemble : public Tool {
259 public:
260 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
261
262 virtual bool acceptsPipedInput() const { return true; }
263 virtual bool canPipeOutput() const { return true; }
264 virtual bool hasIntegratedCPP() const { return false; }
265
266 virtual void ConstructJob(Compilation &C, const JobAction &JA,
267 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000268 const InputInfo &Output,
269 const InputInfoList &Inputs,
270 const ArgList &TCArgs,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000271 const char *LinkingOutput) const;
272 };
273 class VISIBILITY_HIDDEN Link : public Tool {
274 public:
275 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
276
277 virtual bool acceptsPipedInput() const { return true; }
278 virtual bool canPipeOutput() const { return true; }
279 virtual bool hasIntegratedCPP() const { return false; }
280
281 virtual void ConstructJob(Compilation &C, const JobAction &JA,
282 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000283 const InputInfo &Output,
284 const InputInfoList &Inputs,
285 const ArgList &TCArgs,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000286 const char *LinkingOutput) const;
287 };
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000288} // end namespace openbsd
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000289
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000290 /// freebsd -- Directly call GNU Binutils assembler and linker
291namespace freebsd {
292 class VISIBILITY_HIDDEN Assemble : public Tool {
293 public:
294 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
295
296 virtual bool acceptsPipedInput() const { return true; }
297 virtual bool canPipeOutput() const { return true; }
298 virtual bool hasIntegratedCPP() const { return false; }
299
300 virtual void ConstructJob(Compilation &C, const JobAction &JA,
301 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000302 const InputInfo &Output,
303 const InputInfoList &Inputs,
304 const ArgList &TCArgs,
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000305 const char *LinkingOutput) const;
306 };
Daniel Dunbar008f54a2009-04-01 19:36:32 +0000307 class VISIBILITY_HIDDEN Link : public Tool {
308 public:
309 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
310
311 virtual bool acceptsPipedInput() const { return true; }
312 virtual bool canPipeOutput() const { return true; }
313 virtual bool hasIntegratedCPP() const { return false; }
314
315 virtual void ConstructJob(Compilation &C, const JobAction &JA,
316 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000317 const InputInfo &Output,
318 const InputInfoList &Inputs,
319 const ArgList &TCArgs,
Daniel Dunbar008f54a2009-04-01 19:36:32 +0000320 const char *LinkingOutput) const;
321 };
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000322} // end namespace freebsd
323
324 /// auroraux -- Directly call GNU Binutils assembler and linker
325namespace auroraux {
326 class VISIBILITY_HIDDEN Assemble : public Tool {
327 public:
328 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
329
330 virtual bool acceptsPipedInput() const { return true; }
331 virtual bool canPipeOutput() const { return true; }
332 virtual bool hasIntegratedCPP() const { return false; }
333
334 virtual void ConstructJob(Compilation &C, const JobAction &JA,
335 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000336 const InputInfo &Output,
337 const InputInfoList &Inputs,
338 const ArgList &TCArgs,
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000339 const char *LinkingOutput) const;
340 };
341 class VISIBILITY_HIDDEN Link : public Tool {
342 public:
343 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
344
345 virtual bool acceptsPipedInput() const { return true; }
346 virtual bool canPipeOutput() const { return true; }
347 virtual bool hasIntegratedCPP() const { return false; }
348
349 virtual void ConstructJob(Compilation &C, const JobAction &JA,
350 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000351 const InputInfo &Output,
352 const InputInfoList &Inputs,
353 const ArgList &TCArgs,
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000354 const char *LinkingOutput) const;
355 };
356} // end namespace auroraux
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000357
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000358 /// dragonfly -- Directly call GNU Binutils assembler and linker
359namespace dragonfly {
360 class VISIBILITY_HIDDEN Assemble : public Tool {
361 public:
362 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
363
364 virtual bool acceptsPipedInput() const { return true; }
365 virtual bool canPipeOutput() const { return true; }
366 virtual bool hasIntegratedCPP() const { return false; }
367
368 virtual void ConstructJob(Compilation &C, const JobAction &JA,
369 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000370 const InputInfo &Output,
371 const InputInfoList &Inputs,
372 const ArgList &TCArgs,
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000373 const char *LinkingOutput) const;
374 };
375 class VISIBILITY_HIDDEN Link : public Tool {
376 public:
377 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
378
379 virtual bool acceptsPipedInput() const { return true; }
380 virtual bool canPipeOutput() const { return true; }
381 virtual bool hasIntegratedCPP() const { return false; }
382
383 virtual void ConstructJob(Compilation &C, const JobAction &JA,
384 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000385 const InputInfo &Output,
386 const InputInfoList &Inputs,
387 const ArgList &TCArgs,
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000388 const char *LinkingOutput) const;
389 };
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000390} // end namespace dragonfly
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000391
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000392} // end namespace toolchains
393} // end namespace driver
394} // end namespace clang
395
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000396#endif // CLANG_LIB_DRIVER_TOOLS_H_