blob: c584b5ef05ec23be7bc5fdbf882750d37bab5514 [file] [log] [blame]
Daniel Dunbar542fae92009-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 Dunbar06f97922009-03-29 17:08:39 +000014#include "clang/Driver/Types.h"
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000015#include "clang/Driver/Util.h"
Daniel Dunbar542fae92009-03-17 22:07:58 +000016
17#include "llvm/Support/Compiler.h"
18
19namespace clang {
20namespace driver {
Douglas Gregor95734502009-04-18 00:34:01 +000021 class Driver;
22
Daniel Dunbareb1be3f2009-03-26 16:23:12 +000023namespace toolchains {
Daniel Dunbar57c63bb2009-09-04 18:34:51 +000024 class Darwin;
Daniel Dunbareb1be3f2009-03-26 16:23:12 +000025}
26
Daniel Dunbar7c764122009-03-17 22:18:43 +000027namespace tools {
Daniel Dunbar542fae92009-03-17 22:07:58 +000028
Daniel Dunbar7c764122009-03-17 22:18:43 +000029 class VISIBILITY_HIDDEN Clang : public Tool {
Douglas Gregor95734502009-04-18 00:34:01 +000030 void AddPreprocessingOptions(const Driver &D,
31 const ArgList &Args,
Daniel Dunbar064e0f22009-04-08 23:54:23 +000032 ArgStringList &CmdArgs,
33 const InputInfo &Output,
34 const InputInfoList &Inputs) const;
35
Daniel Dunbar542fae92009-03-17 22:07:58 +000036 public:
Daniel Dunbareed1b422009-03-17 22:45:24 +000037 Clang(const ToolChain &TC) : Tool("clang", TC) {}
Daniel Dunbar542fae92009-03-17 22:07:58 +000038
39 virtual bool acceptsPipedInput() const { return true; }
40 virtual bool canPipeOutput() const { return true; }
41 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar00fd3792009-03-18 06:00:36 +000042
43 virtual void ConstructJob(Compilation &C, const JobAction &JA,
Daniel Dunbar933ac452009-03-18 07:06:02 +000044 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +000045 const InputInfo &Output,
46 const InputInfoList &Inputs,
47 const ArgList &TCArgs,
Daniel Dunbar00fd3792009-03-18 06:00:36 +000048 const char *LinkingOutput) const;
Daniel Dunbar542fae92009-03-17 22:07:58 +000049 };
50
Daniel Dunbareed1b422009-03-17 22:45:24 +000051 /// gcc - Generic GCC tool implementations.
52namespace gcc {
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000053 class VISIBILITY_HIDDEN Common : public Tool {
Daniel Dunbar542fae92009-03-17 22:07:58 +000054 public:
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000055 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
56
57 virtual void ConstructJob(Compilation &C, const JobAction &JA,
58 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +000059 const InputInfo &Output,
60 const InputInfoList &Inputs,
61 const ArgList &TCArgs,
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000062 const char *LinkingOutput) const;
63
64 /// RenderExtraToolArgs - Render any arguments necessary to force
65 /// the particular tool mode.
66 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
67 };
68
Mike Stump25cf7602009-09-09 15:08:12 +000069
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000070 class VISIBILITY_HIDDEN Preprocess : public Common {
71 public:
72 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
Daniel Dunbar542fae92009-03-17 22:07:58 +000073
74 virtual bool acceptsPipedInput() const { return true; }
75 virtual bool canPipeOutput() const { return true; }
76 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar00fd3792009-03-18 06:00:36 +000077
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000078 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar542fae92009-03-17 22:07:58 +000079 };
80
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000081 class VISIBILITY_HIDDEN Precompile : public Common {
Daniel Dunbar542fae92009-03-17 22:07:58 +000082 public:
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000083 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
Daniel Dunbar542fae92009-03-17 22:07:58 +000084
85 virtual bool acceptsPipedInput() const { return true; }
86 virtual bool canPipeOutput() const { return false; }
87 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar00fd3792009-03-18 06:00:36 +000088
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000089 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar542fae92009-03-17 22:07:58 +000090 };
91
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000092 class VISIBILITY_HIDDEN Compile : public Common {
Daniel Dunbar542fae92009-03-17 22:07:58 +000093 public:
Daniel Dunbar09c3aa52009-03-18 08:07:30 +000094 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
Daniel Dunbar542fae92009-03-17 22:07:58 +000095
96 virtual bool acceptsPipedInput() const { return true; }
97 virtual bool canPipeOutput() const { return true; }
98 virtual bool hasIntegratedCPP() const { return true; }
Daniel Dunbar00fd3792009-03-18 06:00:36 +000099
Daniel Dunbar09c3aa52009-03-18 08:07:30 +0000100 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar542fae92009-03-17 22:07:58 +0000101 };
102
Daniel Dunbar09c3aa52009-03-18 08:07:30 +0000103 class VISIBILITY_HIDDEN Assemble : public Common {
Daniel Dunbar542fae92009-03-17 22:07:58 +0000104 public:
Daniel Dunbar09c3aa52009-03-18 08:07:30 +0000105 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
Daniel Dunbar542fae92009-03-17 22:07:58 +0000106
107 virtual bool acceptsPipedInput() const { return true; }
108 virtual bool canPipeOutput() const { return false; }
109 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar00fd3792009-03-18 06:00:36 +0000110
Daniel Dunbar09c3aa52009-03-18 08:07:30 +0000111 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar542fae92009-03-17 22:07:58 +0000112 };
113
Daniel Dunbar09c3aa52009-03-18 08:07:30 +0000114 class VISIBILITY_HIDDEN Link : public Common {
Daniel Dunbar542fae92009-03-17 22:07:58 +0000115 public:
Daniel Dunbar09c3aa52009-03-18 08:07:30 +0000116 Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
Daniel Dunbar542fae92009-03-17 22:07:58 +0000117
118 virtual bool acceptsPipedInput() const { return false; }
119 virtual bool canPipeOutput() const { return false; }
120 virtual bool hasIntegratedCPP() const { return false; }
Daniel Dunbar00fd3792009-03-18 06:00:36 +0000121
Daniel Dunbar09c3aa52009-03-18 08:07:30 +0000122 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
Daniel Dunbar542fae92009-03-17 22:07:58 +0000123 };
Daniel Dunbareed1b422009-03-17 22:45:24 +0000124} // end namespace gcc
Daniel Dunbar542fae92009-03-17 22:07:58 +0000125
Daniel Dunbarb9b1fb22009-03-20 00:52:38 +0000126namespace darwin {
Daniel Dunbar06f97922009-03-29 17:08:39 +0000127 class VISIBILITY_HIDDEN CC1 : public Tool {
Daniel Dunbar0bf13eb2009-03-30 00:34:04 +0000128 public:
Mike Stump25cf7602009-09-09 15:08:12 +0000129 static const char *getBaseInputName(const ArgList &Args,
Daniel Dunbar0bf13eb2009-03-30 00:34:04 +0000130 const InputInfoList &Input);
Mike Stump25cf7602009-09-09 15:08:12 +0000131 static const char *getBaseInputStem(const ArgList &Args,
Daniel Dunbar0bf13eb2009-03-30 00:34:04 +0000132 const InputInfoList &Input);
Mike Stump25cf7602009-09-09 15:08:12 +0000133 static const char *getDependencyFileName(const ArgList &Args,
Daniel Dunbar0bf13eb2009-03-30 00:34:04 +0000134 const InputInfoList &Inputs);
135
Daniel Dunbar06f97922009-03-29 17:08:39 +0000136 protected:
137 const char *getCC1Name(types::ID Type) const;
138
Daniel Dunbar62e9c642009-03-29 18:40:18 +0000139 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbar06f97922009-03-29 17:08:39 +0000140 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
141 const InputInfoList &Inputs,
Daniel Dunbar62e9c642009-03-29 18:40:18 +0000142 const ArgStringList &OutputArgs) const;
Daniel Dunbar06f97922009-03-29 17:08:39 +0000143 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
144 const InputInfoList &Inputs,
Daniel Dunbar62e9c642009-03-29 18:40:18 +0000145 const ArgStringList &OutputArgs) const;
Mike Stump25cf7602009-09-09 15:08:12 +0000146 void AddCPPUniqueOptionsArgs(const ArgList &Args,
Daniel Dunbar62e9c642009-03-29 18:40:18 +0000147 ArgStringList &CmdArgs,
148 const InputInfoList &Inputs) const;
149 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
Daniel Dunbar06f97922009-03-29 17:08:39 +0000150
151 public:
152 CC1(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
153
154 virtual bool acceptsPipedInput() const { return true; }
155 virtual bool canPipeOutput() const { return true; }
156 virtual bool hasIntegratedCPP() const { return true; }
157 };
158
159 class VISIBILITY_HIDDEN Preprocess : public CC1 {
160 public:
161 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
162
163 virtual void ConstructJob(Compilation &C, const JobAction &JA,
164 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000165 const InputInfo &Output,
166 const InputInfoList &Inputs,
167 const ArgList &TCArgs,
Daniel Dunbar06f97922009-03-29 17:08:39 +0000168 const char *LinkingOutput) const;
169 };
170
171 class VISIBILITY_HIDDEN Compile : public CC1 {
172 public:
173 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
174
175 virtual void ConstructJob(Compilation &C, const JobAction &JA,
176 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000177 const InputInfo &Output,
178 const InputInfoList &Inputs,
179 const ArgList &TCArgs,
Daniel Dunbar06f97922009-03-29 17:08:39 +0000180 const char *LinkingOutput) const;
181 };
182
Daniel Dunbar32a8df32009-03-20 16:06:39 +0000183 class VISIBILITY_HIDDEN Assemble : public Tool {
184 public:
185 Assemble(const ToolChain &TC) : Tool("darwin::Assemble", TC) {}
186
187 virtual bool acceptsPipedInput() const { return true; }
188 virtual bool canPipeOutput() const { return false; }
189 virtual bool hasIntegratedCPP() const { return false; }
190
191 virtual void ConstructJob(Compilation &C, const JobAction &JA,
192 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000193 const InputInfo &Output,
194 const InputInfoList &Inputs,
195 const ArgList &TCArgs,
Daniel Dunbar32a8df32009-03-20 16:06:39 +0000196 const char *LinkingOutput) const;
197 };
198
Daniel Dunbareb1be3f2009-03-26 16:23:12 +0000199 class VISIBILITY_HIDDEN Link : public Tool {
200 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
201 void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const;
202 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
203
Daniel Dunbar57c63bb2009-09-04 18:34:51 +0000204 const toolchains::Darwin &getDarwinToolChain() const {
205 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
206 }
Daniel Dunbareb1be3f2009-03-26 16:23:12 +0000207
208 public:
Daniel Dunbareac73b62009-09-04 17:39:02 +0000209 Link(const ToolChain &TC)
210 : Tool("darwin::Link", TC) {
Daniel Dunbareb1be3f2009-03-26 16:23:12 +0000211 }
212
213 virtual bool acceptsPipedInput() const { return false; }
214 virtual bool canPipeOutput() const { return false; }
215 virtual bool hasIntegratedCPP() const { return false; }
216
217 virtual void ConstructJob(Compilation &C, const JobAction &JA,
218 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000219 const InputInfo &Output,
220 const InputInfoList &Inputs,
221 const ArgList &TCArgs,
Daniel Dunbareb1be3f2009-03-26 16:23:12 +0000222 const char *LinkingOutput) const;
223 };
224
Daniel Dunbarb9b1fb22009-03-20 00:52:38 +0000225 class VISIBILITY_HIDDEN Lipo : public Tool {
226 public:
Daniel Dunbar32a8df32009-03-20 16:06:39 +0000227 Lipo(const ToolChain &TC) : Tool("darwin::Lipo", TC) {}
Daniel Dunbarb9b1fb22009-03-20 00:52:38 +0000228
229 virtual bool acceptsPipedInput() const { return false; }
230 virtual bool canPipeOutput() const { return false; }
231 virtual bool hasIntegratedCPP() const { return false; }
232
233 virtual void ConstructJob(Compilation &C, const JobAction &JA,
234 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000235 const InputInfo &Output,
236 const InputInfoList &Inputs,
237 const ArgList &TCArgs,
Daniel Dunbarb9b1fb22009-03-20 00:52:38 +0000238 const char *LinkingOutput) const;
239 };
240}
241
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000242 /// openbsd -- Directly call GNU Binutils assembler and linker
243namespace openbsd {
244 class VISIBILITY_HIDDEN Assemble : public Tool {
245 public:
246 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
247
248 virtual bool acceptsPipedInput() const { return true; }
249 virtual bool canPipeOutput() const { return true; }
250 virtual bool hasIntegratedCPP() const { return false; }
251
252 virtual void ConstructJob(Compilation &C, const JobAction &JA,
253 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000254 const InputInfo &Output,
255 const InputInfoList &Inputs,
256 const ArgList &TCArgs,
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000257 const char *LinkingOutput) const;
258 };
259 class VISIBILITY_HIDDEN Link : public Tool {
260 public:
261 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
262
263 virtual bool acceptsPipedInput() const { return true; }
264 virtual bool canPipeOutput() const { return true; }
265 virtual bool hasIntegratedCPP() const { return false; }
266
267 virtual void ConstructJob(Compilation &C, const JobAction &JA,
268 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000269 const InputInfo &Output,
270 const InputInfoList &Inputs,
271 const ArgList &TCArgs,
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000272 const char *LinkingOutput) const;
273 };
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000274} // end namespace openbsd
Daniel Dunbar64c77a12009-06-29 20:52:51 +0000275
Daniel Dunbar133a0812009-03-31 17:45:15 +0000276 /// freebsd -- Directly call GNU Binutils assembler and linker
277namespace freebsd {
278 class VISIBILITY_HIDDEN Assemble : public Tool {
279 public:
280 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
281
282 virtual bool acceptsPipedInput() const { return true; }
283 virtual bool canPipeOutput() const { return true; }
284 virtual bool hasIntegratedCPP() const { return false; }
285
286 virtual void ConstructJob(Compilation &C, const JobAction &JA,
287 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000288 const InputInfo &Output,
289 const InputInfoList &Inputs,
290 const ArgList &TCArgs,
Daniel Dunbar133a0812009-03-31 17:45:15 +0000291 const char *LinkingOutput) const;
292 };
Daniel Dunbar790528e2009-04-01 19:36:32 +0000293 class VISIBILITY_HIDDEN Link : public Tool {
294 public:
295 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
296
297 virtual bool acceptsPipedInput() const { return true; }
298 virtual bool canPipeOutput() const { return true; }
299 virtual bool hasIntegratedCPP() const { return false; }
300
301 virtual void ConstructJob(Compilation &C, const JobAction &JA,
302 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000303 const InputInfo &Output,
304 const InputInfoList &Inputs,
305 const ArgList &TCArgs,
Daniel Dunbar790528e2009-04-01 19:36:32 +0000306 const char *LinkingOutput) const;
307 };
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000308} // end namespace freebsd
309
310 /// auroraux -- Directly call GNU Binutils assembler and linker
311namespace auroraux {
312 class VISIBILITY_HIDDEN Assemble : public Tool {
313 public:
314 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
315
316 virtual bool acceptsPipedInput() const { return true; }
317 virtual bool canPipeOutput() const { return true; }
318 virtual bool hasIntegratedCPP() const { return false; }
319
320 virtual void ConstructJob(Compilation &C, const JobAction &JA,
321 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000322 const InputInfo &Output,
323 const InputInfoList &Inputs,
324 const ArgList &TCArgs,
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000325 const char *LinkingOutput) const;
326 };
327 class VISIBILITY_HIDDEN Link : public Tool {
328 public:
329 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
330
331 virtual bool acceptsPipedInput() const { return true; }
332 virtual bool canPipeOutput() const { return true; }
333 virtual bool hasIntegratedCPP() const { return false; }
334
335 virtual void ConstructJob(Compilation &C, const JobAction &JA,
336 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000337 const InputInfo &Output,
338 const InputInfoList &Inputs,
339 const ArgList &TCArgs,
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000340 const char *LinkingOutput) const;
341 };
342} // end namespace auroraux
Daniel Dunbar133a0812009-03-31 17:45:15 +0000343
Daniel Dunbar46363f52009-05-02 18:28:39 +0000344 /// dragonfly -- Directly call GNU Binutils assembler and linker
345namespace dragonfly {
346 class VISIBILITY_HIDDEN Assemble : public Tool {
347 public:
348 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
349
350 virtual bool acceptsPipedInput() const { return true; }
351 virtual bool canPipeOutput() const { return true; }
352 virtual bool hasIntegratedCPP() const { return false; }
353
354 virtual void ConstructJob(Compilation &C, const JobAction &JA,
355 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000356 const InputInfo &Output,
357 const InputInfoList &Inputs,
358 const ArgList &TCArgs,
Daniel Dunbar46363f52009-05-02 18:28:39 +0000359 const char *LinkingOutput) const;
360 };
361 class VISIBILITY_HIDDEN Link : public Tool {
362 public:
363 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
364
365 virtual bool acceptsPipedInput() const { return true; }
366 virtual bool canPipeOutput() const { return true; }
367 virtual bool hasIntegratedCPP() const { return false; }
368
369 virtual void ConstructJob(Compilation &C, const JobAction &JA,
370 Job &Dest,
Mike Stump25cf7602009-09-09 15:08:12 +0000371 const InputInfo &Output,
372 const InputInfoList &Inputs,
373 const ArgList &TCArgs,
Daniel Dunbar46363f52009-05-02 18:28:39 +0000374 const char *LinkingOutput) const;
375 };
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000376} // end namespace dragonfly
Daniel Dunbar46363f52009-05-02 18:28:39 +0000377
Daniel Dunbar542fae92009-03-17 22:07:58 +0000378} // end namespace toolchains
379} // end namespace driver
380} // end namespace clang
381
Edward O'Callaghanb68ac562009-08-22 01:06:46 +0000382#endif // CLANG_LIB_DRIVER_TOOLS_H_