blob: db596417a9d2814fea9f5fcb374cf2c0df683cde [file] [log] [blame]
Shih-wei Liaof8fd82b2010-02-10 11:10:31 -08001//===--- 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"
14#include "clang/Driver/Types.h"
15#include "clang/Driver/Util.h"
16
17#include "llvm/Support/Compiler.h"
18
19namespace clang {
20namespace driver {
21 class Driver;
22
23namespace toolchains {
24 class Darwin;
25}
26
27namespace tools {
28
29 class VISIBILITY_HIDDEN Clang : public Tool {
30 void AddPreprocessingOptions(const Driver &D,
31 const ArgList &Args,
32 ArgStringList &CmdArgs,
33 const InputInfo &Output,
34 const InputInfoList &Inputs) const;
35
36 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
37 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
38
39 public:
40 Clang(const ToolChain &TC) : Tool("clang", TC) {}
41
42 virtual bool acceptsPipedInput() const { return true; }
43 virtual bool canPipeOutput() const { return true; }
44 virtual bool hasIntegratedAssembler() const { return true; }
45 virtual bool hasIntegratedCPP() const { return true; }
46
47 virtual void ConstructJob(Compilation &C, const JobAction &JA,
48 Job &Dest,
49 const InputInfo &Output,
50 const InputInfoList &Inputs,
51 const ArgList &TCArgs,
52 const char *LinkingOutput) const;
53 };
54
55 /// gcc - Generic GCC tool implementations.
56namespace gcc {
57 class VISIBILITY_HIDDEN Common : public Tool {
58 public:
59 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
60
61 virtual void ConstructJob(Compilation &C, const JobAction &JA,
62 Job &Dest,
63 const InputInfo &Output,
64 const InputInfoList &Inputs,
65 const ArgList &TCArgs,
66 const char *LinkingOutput) const;
67
68 /// RenderExtraToolArgs - Render any arguments necessary to force
69 /// the particular tool mode.
70 virtual void RenderExtraToolArgs(const JobAction &JA,
71 ArgStringList &CmdArgs) const = 0;
72 };
73
74
75 class VISIBILITY_HIDDEN Preprocess : public Common {
76 public:
77 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
78
79 virtual bool acceptsPipedInput() const { return true; }
80 virtual bool canPipeOutput() const { return true; }
81 virtual bool hasIntegratedCPP() const { return false; }
82
83 virtual void RenderExtraToolArgs(const JobAction &JA,
84 ArgStringList &CmdArgs) const;
85 };
86
87 class VISIBILITY_HIDDEN Precompile : public Common {
88 public:
89 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
90
91 virtual bool acceptsPipedInput() const { return true; }
92 virtual bool canPipeOutput() const { return false; }
93 virtual bool hasIntegratedCPP() const { return true; }
94
95 virtual void RenderExtraToolArgs(const JobAction &JA,
96 ArgStringList &CmdArgs) const;
97 };
98
99 class VISIBILITY_HIDDEN Compile : public Common {
100 public:
101 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
102
103 virtual bool acceptsPipedInput() const { return true; }
104 virtual bool canPipeOutput() const { return true; }
105 virtual bool hasIntegratedCPP() const { return true; }
106
107 virtual void RenderExtraToolArgs(const JobAction &JA,
108 ArgStringList &CmdArgs) const;
109 };
110
111 class VISIBILITY_HIDDEN Assemble : public Common {
112 public:
113 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
114
115 virtual bool acceptsPipedInput() const { return true; }
116 virtual bool canPipeOutput() const { return false; }
117 virtual bool hasIntegratedCPP() const { return false; }
118
119 virtual void RenderExtraToolArgs(const JobAction &JA,
120 ArgStringList &CmdArgs) const;
121 };
122
123 class VISIBILITY_HIDDEN Link : public Common {
124 public:
125 Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
126
127 virtual bool acceptsPipedInput() const { return false; }
128 virtual bool canPipeOutput() const { return false; }
129 virtual bool hasIntegratedCPP() const { return false; }
130
131 virtual void RenderExtraToolArgs(const JobAction &JA,
132 ArgStringList &CmdArgs) const;
133 };
134} // end namespace gcc
135
136namespace darwin {
137 class VISIBILITY_HIDDEN DarwinTool : public Tool {
138 protected:
139 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
140
141 const toolchains::Darwin &getDarwinToolChain() const {
142 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
143 }
144
145 public:
146 DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
147 };
148
149 class VISIBILITY_HIDDEN CC1 : public DarwinTool {
150 public:
151 static const char *getBaseInputName(const ArgList &Args,
152 const InputInfoList &Input);
153 static const char *getBaseInputStem(const ArgList &Args,
154 const InputInfoList &Input);
155 static const char *getDependencyFileName(const ArgList &Args,
156 const InputInfoList &Inputs);
157
158 protected:
159 const char *getCC1Name(types::ID Type) const;
160
161 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
162 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
163 const InputInfoList &Inputs,
164 const ArgStringList &OutputArgs) const;
165 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
166 const InputInfoList &Inputs,
167 const ArgStringList &OutputArgs) const;
168 void AddCPPUniqueOptionsArgs(const ArgList &Args,
169 ArgStringList &CmdArgs,
170 const InputInfoList &Inputs) const;
171 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
172
173 public:
174 CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
175
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,
187 const InputInfo &Output,
188 const InputInfoList &Inputs,
189 const ArgList &TCArgs,
190 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,
199 const InputInfo &Output,
200 const InputInfoList &Inputs,
201 const ArgList &TCArgs,
202 const char *LinkingOutput) const;
203 };
204
205 class VISIBILITY_HIDDEN Assemble : public DarwinTool {
206 public:
207 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
208
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,
215 const InputInfo &Output,
216 const InputInfoList &Inputs,
217 const ArgList &TCArgs,
218 const char *LinkingOutput) const;
219 };
220
221 class VISIBILITY_HIDDEN Link : public DarwinTool {
222 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
223
224 public:
225 Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
226
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,
233 const InputInfo &Output,
234 const InputInfoList &Inputs,
235 const ArgList &TCArgs,
236 const char *LinkingOutput) const;
237 };
238
239 class VISIBILITY_HIDDEN Lipo : public DarwinTool {
240 public:
241 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
242
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,
249 const InputInfo &Output,
250 const InputInfoList &Inputs,
251 const ArgList &TCArgs,
252 const char *LinkingOutput) const;
253 };
254}
255
256 /// 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,
268 const InputInfo &Output,
269 const InputInfoList &Inputs,
270 const ArgList &TCArgs,
271 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,
283 const InputInfo &Output,
284 const InputInfoList &Inputs,
285 const ArgList &TCArgs,
286 const char *LinkingOutput) const;
287 };
288} // end namespace openbsd
289
290 /// 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,
302 const InputInfo &Output,
303 const InputInfoList &Inputs,
304 const ArgList &TCArgs,
305 const char *LinkingOutput) const;
306 };
307 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,
317 const InputInfo &Output,
318 const InputInfoList &Inputs,
319 const ArgList &TCArgs,
320 const char *LinkingOutput) const;
321 };
322} // 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,
336 const InputInfo &Output,
337 const InputInfoList &Inputs,
338 const ArgList &TCArgs,
339 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,
351 const InputInfo &Output,
352 const InputInfoList &Inputs,
353 const ArgList &TCArgs,
354 const char *LinkingOutput) const;
355 };
356} // end namespace auroraux
357
358 /// 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,
370 const InputInfo &Output,
371 const InputInfoList &Inputs,
372 const ArgList &TCArgs,
373 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,
385 const InputInfo &Output,
386 const InputInfoList &Inputs,
387 const ArgList &TCArgs,
388 const char *LinkingOutput) const;
389 };
390} // end namespace dragonfly
391
392} // end namespace toolchains
393} // end namespace driver
394} // end namespace clang
395
396#endif // CLANG_LIB_DRIVER_TOOLS_H_