blob: 6729da8370a5af265da201e4cf75444d14a9e967 [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; }
44 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000045
46 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar871adcf2009-03-18 07:06:02 +000047 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +000048 const InputInfo &Output,
49 const InputInfoList &Inputs,
50 const ArgList &TCArgs,
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000051 const char *LinkingOutput) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000052 };
53
Daniel Dunbar31b1e542009-03-17 22:45:24 +000054 /// gcc - Generic GCC tool implementations.
55namespace gcc {
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000056 class VISIBILITY_HIDDEN Common : public Tool {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000057 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000058 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
59
60 virtual void ConstructJob(Compilation &C, const JobAction &JA,
61 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +000062 const InputInfo &Output,
63 const InputInfoList &Inputs,
64 const ArgList &TCArgs,
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000065 const char *LinkingOutput) const;
66
67 /// RenderExtraToolArgs - Render any arguments necessary to force
68 /// the particular tool mode.
69 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
70 };
71
Mike Stump1eb44332009-09-09 15:08:12 +000072
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000073 class VISIBILITY_HIDDEN Preprocess : public Common {
74 public:
75 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000076
77 virtual bool acceptsPipedInput() const { return true; }
78 virtual bool canPipeOutput() const { return true; }
79 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000080
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000081 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000082 };
83
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000084 class VISIBILITY_HIDDEN Precompile : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000085 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000086 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000087
88 virtual bool acceptsPipedInput() const { return true; }
89 virtual bool canPipeOutput() const { return false; }
90 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +000091
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000092 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000093 };
94
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000095 class VISIBILITY_HIDDEN Compile : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000096 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +000097 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +000098
99 virtual bool acceptsPipedInput() const { return true; }
100 virtual bool canPipeOutput() const { return true; }
101 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000102
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000103 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000104 };
105
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000106 class VISIBILITY_HIDDEN Assemble : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000107 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000108 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000109
110 virtual bool acceptsPipedInput() const { return true; }
111 virtual bool canPipeOutput() const { return false; }
112 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000113
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000114 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000115 };
116
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000117 class VISIBILITY_HIDDEN Link : public Common {
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000118 public:
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000119 Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000120
121 virtual bool acceptsPipedInput() const { return false; }
122 virtual bool canPipeOutput() const { return false; }
123 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar47ac7d22009-03-18 06:00:36 +0000124
Daniel Dunbarb488c1d2009-03-18 08:07:30 +0000125 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000126 };
Daniel Dunbar31b1e542009-03-17 22:45:24 +0000127} // end namespace gcc
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000128
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000129namespace darwin {
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000130 class VISIBILITY_HIDDEN DarwinTool : public Tool {
131 protected:
132 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
133 void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const;
134
135 const toolchains::Darwin &getDarwinToolChain() const {
136 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
137 }
138
139 public:
140 DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {};
141 };
142
143 class VISIBILITY_HIDDEN CC1 : public DarwinTool {
Daniel Dunbara5a7bd02009-03-30 00:34:04 +0000144 public:
Mike Stump1eb44332009-09-09 15:08:12 +0000145 static const char *getBaseInputName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +0000146 const InputInfoList &Input);
Mike Stump1eb44332009-09-09 15:08:12 +0000147 static const char *getBaseInputStem(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +0000148 const InputInfoList &Input);
Mike Stump1eb44332009-09-09 15:08:12 +0000149 static const char *getDependencyFileName(const ArgList &Args,
Daniel Dunbara5a7bd02009-03-30 00:34:04 +0000150 const InputInfoList &Inputs);
151
Daniel Dunbar40f12652009-03-29 17:08:39 +0000152 protected:
153 const char *getCC1Name(types::ID Type) const;
154
Daniel Dunbara3ec60e2009-03-29 18:40:18 +0000155 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbar40f12652009-03-29 17:08:39 +0000156 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
157 const InputInfoList &Inputs,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +0000158 const ArgStringList &OutputArgs) const;
Daniel Dunbar40f12652009-03-29 17:08:39 +0000159 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
160 const InputInfoList &Inputs,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +0000161 const ArgStringList &OutputArgs) const;
Mike Stump1eb44332009-09-09 15:08:12 +0000162 void AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbara3ec60e2009-03-29 18:40:18 +0000163 ArgStringList &CmdArgs,
164 const InputInfoList &Inputs) const;
165 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbar40f12652009-03-29 17:08:39 +0000166
167 public:
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000168 CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
Daniel Dunbar40f12652009-03-29 17:08:39 +0000169
170 virtual bool acceptsPipedInput() const { return true; }
171 virtual bool canPipeOutput() const { return true; }
172 virtual bool hasIntegratedCPP() const { return true; }
173 };
174
175 class VISIBILITY_HIDDEN Preprocess : public CC1 {
176 public:
177 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
178
179 virtual void ConstructJob(Compilation &C, const JobAction &JA,
180 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000181 const InputInfo &Output,
182 const InputInfoList &Inputs,
183 const ArgList &TCArgs,
Daniel Dunbar40f12652009-03-29 17:08:39 +0000184 const char *LinkingOutput) const;
185 };
186
187 class VISIBILITY_HIDDEN Compile : public CC1 {
188 public:
189 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
190
191 virtual void ConstructJob(Compilation &C, const JobAction &JA,
192 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000193 const InputInfo &Output,
194 const InputInfoList &Inputs,
195 const ArgList &TCArgs,
Daniel Dunbar40f12652009-03-29 17:08:39 +0000196 const char *LinkingOutput) const;
197 };
198
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000199 class VISIBILITY_HIDDEN Assemble : public DarwinTool {
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000200 public:
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000201 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000202
203 virtual bool acceptsPipedInput() const { return true; }
204 virtual bool canPipeOutput() const { return false; }
205 virtual bool hasIntegratedCPP() const { return false; }
206
207 virtual void ConstructJob(Compilation &C, const JobAction &JA,
208 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000209 const InputInfo &Output,
210 const InputInfoList &Inputs,
211 const ArgList &TCArgs,
Daniel Dunbar8cac5f72009-03-20 16:06:39 +0000212 const char *LinkingOutput) const;
213 };
214
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000215 class VISIBILITY_HIDDEN Link : public DarwinTool {
Daniel Dunbar02633b52009-03-26 16:23:12 +0000216 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
217
Daniel Dunbar02633b52009-03-26 16:23:12 +0000218 public:
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000219 Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
Daniel Dunbar02633b52009-03-26 16:23:12 +0000220
221 virtual bool acceptsPipedInput() const { return false; }
222 virtual bool canPipeOutput() const { return false; }
223 virtual bool hasIntegratedCPP() const { return false; }
224
225 virtual void ConstructJob(Compilation &C, const JobAction &JA,
226 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000227 const InputInfo &Output,
228 const InputInfoList &Inputs,
229 const ArgList &TCArgs,
Daniel Dunbar02633b52009-03-26 16:23:12 +0000230 const char *LinkingOutput) const;
231 };
232
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000233 class VISIBILITY_HIDDEN Lipo : public DarwinTool {
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000234 public:
Daniel Dunbarfbefe6b2009-09-09 18:36:20 +0000235 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000236
237 virtual bool acceptsPipedInput() const { return false; }
238 virtual bool canPipeOutput() const { return false; }
239 virtual bool hasIntegratedCPP() const { return false; }
240
241 virtual void ConstructJob(Compilation &C, const JobAction &JA,
242 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000243 const InputInfo &Output,
244 const InputInfoList &Inputs,
245 const ArgList &TCArgs,
Daniel Dunbarff7488d2009-03-20 00:52:38 +0000246 const char *LinkingOutput) const;
247 };
248}
249
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000250 /// openbsd -- Directly call GNU Binutils assembler and linker
251namespace openbsd {
252 class VISIBILITY_HIDDEN Assemble : public Tool {
253 public:
254 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
255
256 virtual bool acceptsPipedInput() const { return true; }
257 virtual bool canPipeOutput() const { return true; }
258 virtual bool hasIntegratedCPP() const { return false; }
259
260 virtual void ConstructJob(Compilation &C, const JobAction &JA,
261 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000262 const InputInfo &Output,
263 const InputInfoList &Inputs,
264 const ArgList &TCArgs,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000265 const char *LinkingOutput) const;
266 };
267 class VISIBILITY_HIDDEN Link : public Tool {
268 public:
269 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
270
271 virtual bool acceptsPipedInput() const { return true; }
272 virtual bool canPipeOutput() const { return true; }
273 virtual bool hasIntegratedCPP() const { return false; }
274
275 virtual void ConstructJob(Compilation &C, const JobAction &JA,
276 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000277 const InputInfo &Output,
278 const InputInfoList &Inputs,
279 const ArgList &TCArgs,
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000280 const char *LinkingOutput) const;
281 };
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000282} // end namespace openbsd
Daniel Dunbarf7b8eec2009-06-29 20:52:51 +0000283
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000284 /// freebsd -- Directly call GNU Binutils assembler and linker
285namespace freebsd {
286 class VISIBILITY_HIDDEN Assemble : public Tool {
287 public:
288 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
289
290 virtual bool acceptsPipedInput() const { return true; }
291 virtual bool canPipeOutput() const { return true; }
292 virtual bool hasIntegratedCPP() const { return false; }
293
294 virtual void ConstructJob(Compilation &C, const JobAction &JA,
295 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000296 const InputInfo &Output,
297 const InputInfoList &Inputs,
298 const ArgList &TCArgs,
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000299 const char *LinkingOutput) const;
300 };
Daniel Dunbar008f54a2009-04-01 19:36:32 +0000301 class VISIBILITY_HIDDEN Link : public Tool {
302 public:
303 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
304
305 virtual bool acceptsPipedInput() const { return true; }
306 virtual bool canPipeOutput() const { return true; }
307 virtual bool hasIntegratedCPP() const { return false; }
308
309 virtual void ConstructJob(Compilation &C, const JobAction &JA,
310 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000311 const InputInfo &Output,
312 const InputInfoList &Inputs,
313 const ArgList &TCArgs,
Daniel Dunbar008f54a2009-04-01 19:36:32 +0000314 const char *LinkingOutput) const;
315 };
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000316} // end namespace freebsd
317
318 /// auroraux -- Directly call GNU Binutils assembler and linker
319namespace auroraux {
320 class VISIBILITY_HIDDEN Assemble : public Tool {
321 public:
322 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
323
324 virtual bool acceptsPipedInput() const { return true; }
325 virtual bool canPipeOutput() const { return true; }
326 virtual bool hasIntegratedCPP() const { return false; }
327
328 virtual void ConstructJob(Compilation &C, const JobAction &JA,
329 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000330 const InputInfo &Output,
331 const InputInfoList &Inputs,
332 const ArgList &TCArgs,
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000333 const char *LinkingOutput) const;
334 };
335 class VISIBILITY_HIDDEN Link : public Tool {
336 public:
337 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
338
339 virtual bool acceptsPipedInput() const { return true; }
340 virtual bool canPipeOutput() const { return true; }
341 virtual bool hasIntegratedCPP() const { return false; }
342
343 virtual void ConstructJob(Compilation &C, const JobAction &JA,
344 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000345 const InputInfo &Output,
346 const InputInfoList &Inputs,
347 const ArgList &TCArgs,
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000348 const char *LinkingOutput) const;
349 };
350} // end namespace auroraux
Daniel Dunbar68a31d42009-03-31 17:45:15 +0000351
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000352 /// dragonfly -- Directly call GNU Binutils assembler and linker
353namespace dragonfly {
354 class VISIBILITY_HIDDEN Assemble : public Tool {
355 public:
356 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
357
358 virtual bool acceptsPipedInput() const { return true; }
359 virtual bool canPipeOutput() const { return true; }
360 virtual bool hasIntegratedCPP() const { return false; }
361
362 virtual void ConstructJob(Compilation &C, const JobAction &JA,
363 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000364 const InputInfo &Output,
365 const InputInfoList &Inputs,
366 const ArgList &TCArgs,
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000367 const char *LinkingOutput) const;
368 };
369 class VISIBILITY_HIDDEN Link : public Tool {
370 public:
371 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
372
373 virtual bool acceptsPipedInput() const { return true; }
374 virtual bool canPipeOutput() const { return true; }
375 virtual bool hasIntegratedCPP() const { return false; }
376
377 virtual void ConstructJob(Compilation &C, const JobAction &JA,
378 Job &Dest,
Mike Stump1eb44332009-09-09 15:08:12 +0000379 const InputInfo &Output,
380 const InputInfoList &Inputs,
381 const ArgList &TCArgs,
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000382 const char *LinkingOutput) const;
383 };
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000384} // end namespace dragonfly
Daniel Dunbar11e1b402009-05-02 18:28:39 +0000385
Daniel Dunbar9c073ff2009-03-17 22:07:58 +0000386} // end namespace toolchains
387} // end namespace driver
388} // end namespace clang
389
Edward O'Callaghane7925a02009-08-22 01:06:46 +0000390#endif // CLANG_LIB_DRIVER_TOOLS_H_