blob: 572c7f4e783d2a79dc19d00628209825e400e2c7 [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"
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000016
17#include "llvm/Support/Compiler.h"
18
19namespace clang {
20namespace driver {
Douglas Gregor111af7d2009-04-18 00:34:01 +000021 class Driver;
22
Daniel Dunbarc1964212009-03-26 16:23:12 +000023namespace toolchains {
Daniel Dunbarf0a5b9b2009-09-04 18:34:51 +000024 class Darwin;
Daniel Dunbarc1964212009-03-26 16:23:12 +000025}
26
Daniel Dunbar15abb2e2009-03-17 22:18:43 +000027namespace tools {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000028
Daniel Dunbar15abb2e2009-03-17 22:18:43 +000029 class VISIBILITY_HIDDEN Clang : public Tool {
Douglas Gregor111af7d2009-04-18 00:34:01 +000030 void AddPreprocessingOptions(const Driver &D,
31 const ArgList &Args,
Daniel Dunbard067f7f2009-04-08 23:54:23 +000032 ArgStringList &CmdArgs,
33 const InputInfo &Output,
34 const InputInfoList &Inputs) const;
35
Daniel Dunbar0f5c5422009-09-10 04:57:17 +000036 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbar3b3191f2009-09-09 22:33:08 +000037 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
38
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000039 public:
Daniel Dunbar82116f82009-03-17 22:45:24 +000040 Clang(const ToolChain &TC) : Tool("clang", TC) {}
Daniel Dunbar5903d8c2009-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 Dunbar1a093d22009-03-18 06:00:36 +000045
46 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar04c4c2c2009-03-18 07:06:02 +000047 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +000048 const InputInfo &Output,
49 const InputInfoList &Inputs,
50 const ArgList &TCArgs,
Daniel Dunbar1a093d22009-03-18 06:00:36 +000051 const char *LinkingOutput) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000052 };
53
Daniel Dunbar82116f82009-03-17 22:45:24 +000054 /// gcc - Generic GCC tool implementations.
55namespace gcc {
Daniel Dunbara3246a02009-03-18 08:07:30 +000056 class VISIBILITY_HIDDEN Common : public Tool {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000057 public:
Daniel Dunbara3246a02009-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 Stump11289f42009-09-09 15:08:12 +000062 const InputInfo &Output,
63 const InputInfoList &Inputs,
64 const ArgList &TCArgs,
Daniel Dunbara3246a02009-03-18 08:07:30 +000065 const char *LinkingOutput) const;
66
67 /// RenderExtraToolArgs - Render any arguments necessary to force
68 /// the particular tool mode.
Daniel Dunbar4e295052010-01-25 22:35:08 +000069 virtual void RenderExtraToolArgs(const JobAction &JA,
70 ArgStringList &CmdArgs) const = 0;
Daniel Dunbara3246a02009-03-18 08:07:30 +000071 };
72
Mike Stump11289f42009-09-09 15:08:12 +000073
Daniel Dunbara3246a02009-03-18 08:07:30 +000074 class VISIBILITY_HIDDEN Preprocess : public Common {
75 public:
76 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000077
78 virtual bool acceptsPipedInput() const { return true; }
79 virtual bool canPipeOutput() const { return true; }
80 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +000081
Daniel Dunbar4e295052010-01-25 22:35:08 +000082 virtual void RenderExtraToolArgs(const JobAction &JA,
83 ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000084 };
85
Daniel Dunbara3246a02009-03-18 08:07:30 +000086 class VISIBILITY_HIDDEN Precompile : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000087 public:
Daniel Dunbara3246a02009-03-18 08:07:30 +000088 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000089
90 virtual bool acceptsPipedInput() const { return true; }
91 virtual bool canPipeOutput() const { return false; }
92 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +000093
Daniel Dunbar4e295052010-01-25 22:35:08 +000094 virtual void RenderExtraToolArgs(const JobAction &JA,
95 ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000096 };
97
Daniel Dunbara3246a02009-03-18 08:07:30 +000098 class VISIBILITY_HIDDEN Compile : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +000099 public:
Daniel Dunbara3246a02009-03-18 08:07:30 +0000100 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000101
102 virtual bool acceptsPipedInput() const { return true; }
103 virtual bool canPipeOutput() const { return true; }
104 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000105
Daniel Dunbar4e295052010-01-25 22:35:08 +0000106 virtual void RenderExtraToolArgs(const JobAction &JA,
107 ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000108 };
109
Daniel Dunbara3246a02009-03-18 08:07:30 +0000110 class VISIBILITY_HIDDEN Assemble : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000111 public:
Daniel Dunbara3246a02009-03-18 08:07:30 +0000112 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000113
114 virtual bool acceptsPipedInput() const { return true; }
115 virtual bool canPipeOutput() const { return false; }
116 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000117
Daniel Dunbar4e295052010-01-25 22:35:08 +0000118 virtual void RenderExtraToolArgs(const JobAction &JA,
119 ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000120 };
121
Daniel Dunbara3246a02009-03-18 08:07:30 +0000122 class VISIBILITY_HIDDEN Link : public Common {
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000123 public:
Daniel Dunbara3246a02009-03-18 08:07:30 +0000124 Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000125
126 virtual bool acceptsPipedInput() const { return false; }
127 virtual bool canPipeOutput() const { return false; }
128 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar1a093d22009-03-18 06:00:36 +0000129
Daniel Dunbar4e295052010-01-25 22:35:08 +0000130 virtual void RenderExtraToolArgs(const JobAction &JA,
131 ArgStringList &CmdArgs) const;
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000132 };
Daniel Dunbar82116f82009-03-17 22:45:24 +0000133} // end namespace gcc
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000134
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000135namespace darwin {
Daniel Dunbare9ded432009-09-09 18:36:20 +0000136 class VISIBILITY_HIDDEN DarwinTool : public Tool {
137 protected:
138 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbare9ded432009-09-09 18:36:20 +0000139
140 const toolchains::Darwin &getDarwinToolChain() const {
141 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
142 }
143
144 public:
Daniel Dunbare017ecc2009-12-19 17:50:07 +0000145 DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
Daniel Dunbare9ded432009-09-09 18:36:20 +0000146 };
147
148 class VISIBILITY_HIDDEN CC1 : public DarwinTool {
Daniel Dunbar52e96cc2009-03-30 00:34:04 +0000149 public:
Mike Stump11289f42009-09-09 15:08:12 +0000150 static const char *getBaseInputName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +0000151 const InputInfoList &Input);
Mike Stump11289f42009-09-09 15:08:12 +0000152 static const char *getBaseInputStem(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +0000153 const InputInfoList &Input);
Mike Stump11289f42009-09-09 15:08:12 +0000154 static const char *getDependencyFileName(const ArgList &Args,
Daniel Dunbar52e96cc2009-03-30 00:34:04 +0000155 const InputInfoList &Inputs);
156
Daniel Dunbare6adeee2009-03-29 17:08:39 +0000157 protected:
158 const char *getCC1Name(types::ID Type) const;
159
Daniel Dunbarafec1f52009-03-29 18:40:18 +0000160 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbare6adeee2009-03-29 17:08:39 +0000161 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
162 const InputInfoList &Inputs,
Daniel Dunbarafec1f52009-03-29 18:40:18 +0000163 const ArgStringList &OutputArgs) const;
Daniel Dunbare6adeee2009-03-29 17:08:39 +0000164 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
165 const InputInfoList &Inputs,
Daniel Dunbarafec1f52009-03-29 18:40:18 +0000166 const ArgStringList &OutputArgs) const;
Mike Stump11289f42009-09-09 15:08:12 +0000167 void AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbarafec1f52009-03-29 18:40:18 +0000168 ArgStringList &CmdArgs,
169 const InputInfoList &Inputs) const;
170 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbare6adeee2009-03-29 17:08:39 +0000171
172 public:
Daniel Dunbare9ded432009-09-09 18:36:20 +0000173 CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
Daniel Dunbare6adeee2009-03-29 17:08:39 +0000174
175 virtual bool acceptsPipedInput() const { return true; }
176 virtual bool canPipeOutput() const { return true; }
177 virtual bool hasIntegratedCPP() const { return true; }
178 };
179
180 class VISIBILITY_HIDDEN Preprocess : public CC1 {
181 public:
182 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
183
184 virtual void ConstructJob(Compilation &C, const JobAction &JA,
185 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000186 const InputInfo &Output,
187 const InputInfoList &Inputs,
188 const ArgList &TCArgs,
Daniel Dunbare6adeee2009-03-29 17:08:39 +0000189 const char *LinkingOutput) const;
190 };
191
192 class VISIBILITY_HIDDEN Compile : public CC1 {
193 public:
194 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
195
196 virtual void ConstructJob(Compilation &C, const JobAction &JA,
197 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000198 const InputInfo &Output,
199 const InputInfoList &Inputs,
200 const ArgList &TCArgs,
Daniel Dunbare6adeee2009-03-29 17:08:39 +0000201 const char *LinkingOutput) const;
202 };
203
Daniel Dunbare9ded432009-09-09 18:36:20 +0000204 class VISIBILITY_HIDDEN Assemble : public DarwinTool {
Daniel Dunbarbe220842009-03-20 16:06:39 +0000205 public:
Daniel Dunbare9ded432009-09-09 18:36:20 +0000206 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
Daniel Dunbarbe220842009-03-20 16:06:39 +0000207
208 virtual bool acceptsPipedInput() const { return true; }
209 virtual bool canPipeOutput() const { return false; }
210 virtual bool hasIntegratedCPP() const { return false; }
211
212 virtual void ConstructJob(Compilation &C, const JobAction &JA,
213 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000214 const InputInfo &Output,
215 const InputInfoList &Inputs,
216 const ArgList &TCArgs,
Daniel Dunbarbe220842009-03-20 16:06:39 +0000217 const char *LinkingOutput) const;
218 };
219
Daniel Dunbare9ded432009-09-09 18:36:20 +0000220 class VISIBILITY_HIDDEN Link : public DarwinTool {
Daniel Dunbarc1964212009-03-26 16:23:12 +0000221 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
222
Daniel Dunbarc1964212009-03-26 16:23:12 +0000223 public:
Daniel Dunbare9ded432009-09-09 18:36:20 +0000224 Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
Daniel Dunbarc1964212009-03-26 16:23:12 +0000225
226 virtual bool acceptsPipedInput() const { return false; }
227 virtual bool canPipeOutput() const { return false; }
228 virtual bool hasIntegratedCPP() const { return false; }
229
230 virtual void ConstructJob(Compilation &C, const JobAction &JA,
231 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000232 const InputInfo &Output,
233 const InputInfoList &Inputs,
234 const ArgList &TCArgs,
Daniel Dunbarc1964212009-03-26 16:23:12 +0000235 const char *LinkingOutput) const;
236 };
237
Daniel Dunbare9ded432009-09-09 18:36:20 +0000238 class VISIBILITY_HIDDEN Lipo : public DarwinTool {
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000239 public:
Daniel Dunbare9ded432009-09-09 18:36:20 +0000240 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000241
242 virtual bool acceptsPipedInput() const { return false; }
243 virtual bool canPipeOutput() const { return false; }
244 virtual bool hasIntegratedCPP() const { return false; }
245
246 virtual void ConstructJob(Compilation &C, const JobAction &JA,
247 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000248 const InputInfo &Output,
249 const InputInfoList &Inputs,
250 const ArgList &TCArgs,
Daniel Dunbar64ed5e32009-03-20 00:52:38 +0000251 const char *LinkingOutput) const;
252 };
253}
254
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000255 /// openbsd -- Directly call GNU Binutils assembler and linker
256namespace openbsd {
257 class VISIBILITY_HIDDEN Assemble : public Tool {
258 public:
259 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
260
261 virtual bool acceptsPipedInput() const { return true; }
262 virtual bool canPipeOutput() const { return true; }
263 virtual bool hasIntegratedCPP() const { return false; }
264
265 virtual void ConstructJob(Compilation &C, const JobAction &JA,
266 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000267 const InputInfo &Output,
268 const InputInfoList &Inputs,
269 const ArgList &TCArgs,
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000270 const char *LinkingOutput) const;
271 };
272 class VISIBILITY_HIDDEN Link : public Tool {
273 public:
274 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
275
276 virtual bool acceptsPipedInput() const { return true; }
277 virtual bool canPipeOutput() const { return true; }
278 virtual bool hasIntegratedCPP() const { return false; }
279
280 virtual void ConstructJob(Compilation &C, const JobAction &JA,
281 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000282 const InputInfo &Output,
283 const InputInfoList &Inputs,
284 const ArgList &TCArgs,
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000285 const char *LinkingOutput) const;
286 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000287} // end namespace openbsd
Daniel Dunbar10de9e62009-06-29 20:52:51 +0000288
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000289 /// freebsd -- Directly call GNU Binutils assembler and linker
290namespace freebsd {
291 class VISIBILITY_HIDDEN Assemble : public Tool {
292 public:
293 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
294
295 virtual bool acceptsPipedInput() const { return true; }
296 virtual bool canPipeOutput() const { return true; }
297 virtual bool hasIntegratedCPP() const { return false; }
298
299 virtual void ConstructJob(Compilation &C, const JobAction &JA,
300 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000301 const InputInfo &Output,
302 const InputInfoList &Inputs,
303 const ArgList &TCArgs,
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000304 const char *LinkingOutput) const;
305 };
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000306 class VISIBILITY_HIDDEN Link : public Tool {
307 public:
308 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
309
310 virtual bool acceptsPipedInput() const { return true; }
311 virtual bool canPipeOutput() const { return true; }
312 virtual bool hasIntegratedCPP() const { return false; }
313
314 virtual void ConstructJob(Compilation &C, const JobAction &JA,
315 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000316 const InputInfo &Output,
317 const InputInfoList &Inputs,
318 const ArgList &TCArgs,
Daniel Dunbard854c8d2009-04-01 19:36:32 +0000319 const char *LinkingOutput) const;
320 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000321} // end namespace freebsd
322
323 /// auroraux -- Directly call GNU Binutils assembler and linker
324namespace auroraux {
325 class VISIBILITY_HIDDEN Assemble : public Tool {
326 public:
327 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
328
329 virtual bool acceptsPipedInput() const { return true; }
330 virtual bool canPipeOutput() const { return true; }
331 virtual bool hasIntegratedCPP() const { return false; }
332
333 virtual void ConstructJob(Compilation &C, const JobAction &JA,
334 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000335 const InputInfo &Output,
336 const InputInfoList &Inputs,
337 const ArgList &TCArgs,
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000338 const char *LinkingOutput) const;
339 };
340 class VISIBILITY_HIDDEN Link : public Tool {
341 public:
342 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
343
344 virtual bool acceptsPipedInput() const { return true; }
345 virtual bool canPipeOutput() const { return true; }
346 virtual bool hasIntegratedCPP() const { return false; }
347
348 virtual void ConstructJob(Compilation &C, const JobAction &JA,
349 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000350 const InputInfo &Output,
351 const InputInfoList &Inputs,
352 const ArgList &TCArgs,
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000353 const char *LinkingOutput) const;
354 };
355} // end namespace auroraux
Daniel Dunbar8eb473c2009-03-31 17:45:15 +0000356
Daniel Dunbarcc912342009-05-02 18:28:39 +0000357 /// dragonfly -- Directly call GNU Binutils assembler and linker
358namespace dragonfly {
359 class VISIBILITY_HIDDEN Assemble : public Tool {
360 public:
361 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
362
363 virtual bool acceptsPipedInput() const { return true; }
364 virtual bool canPipeOutput() const { return true; }
365 virtual bool hasIntegratedCPP() const { return false; }
366
367 virtual void ConstructJob(Compilation &C, const JobAction &JA,
368 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000369 const InputInfo &Output,
370 const InputInfoList &Inputs,
371 const ArgList &TCArgs,
Daniel Dunbarcc912342009-05-02 18:28:39 +0000372 const char *LinkingOutput) const;
373 };
374 class VISIBILITY_HIDDEN Link : public Tool {
375 public:
376 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
377
378 virtual bool acceptsPipedInput() const { return true; }
379 virtual bool canPipeOutput() const { return true; }
380 virtual bool hasIntegratedCPP() const { return false; }
381
382 virtual void ConstructJob(Compilation &C, const JobAction &JA,
383 Job &Dest,
Mike Stump11289f42009-09-09 15:08:12 +0000384 const InputInfo &Output,
385 const InputInfoList &Inputs,
386 const ArgList &TCArgs,
Daniel Dunbarcc912342009-05-02 18:28:39 +0000387 const char *LinkingOutput) const;
388 };
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000389} // end namespace dragonfly
Daniel Dunbarcc912342009-05-02 18:28:39 +0000390
Daniel Dunbar5903d8c2009-03-17 22:07:58 +0000391} // end namespace toolchains
392} // end namespace driver
393} // end namespace clang
394
Edward O'Callaghan856e4ff2009-08-22 01:06:46 +0000395#endif // CLANG_LIB_DRIVER_TOOLS_H_