Tools.h revision ed734737d5af31906e30e537d4a41c760ddcfc59
1//===--- 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 AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
38    void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
39
40  public:
41    Clang(const ToolChain &TC) : Tool("clang", TC) {}
42
43    virtual bool acceptsPipedInput() const { return true; }
44    virtual bool canPipeOutput() const { return true; }
45    virtual bool hasIntegratedAssembler() const { return true; }
46    virtual bool hasIntegratedCPP() const { return true; }
47
48    virtual void ConstructJob(Compilation &C, const JobAction &JA,
49                              Job &Dest,
50                              const InputInfo &Output,
51                              const InputInfoList &Inputs,
52                              const ArgList &TCArgs,
53                              const char *LinkingOutput) const;
54  };
55
56  /// gcc - Generic GCC tool implementations.
57namespace gcc {
58  class VISIBILITY_HIDDEN Common : public Tool {
59  public:
60    Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
61
62    virtual void ConstructJob(Compilation &C, const JobAction &JA,
63                              Job &Dest,
64                              const InputInfo &Output,
65                              const InputInfoList &Inputs,
66                              const ArgList &TCArgs,
67                              const char *LinkingOutput) const;
68
69    /// RenderExtraToolArgs - Render any arguments necessary to force
70    /// the particular tool mode.
71    virtual void RenderExtraToolArgs(const JobAction &JA,
72                                     ArgStringList &CmdArgs) const = 0;
73  };
74
75
76  class VISIBILITY_HIDDEN Preprocess : public Common {
77  public:
78    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
79
80    virtual bool acceptsPipedInput() const { return true; }
81    virtual bool canPipeOutput() const { return true; }
82    virtual bool hasIntegratedCPP() const { return false; }
83
84    virtual void RenderExtraToolArgs(const JobAction &JA,
85                                     ArgStringList &CmdArgs) const;
86  };
87
88  class VISIBILITY_HIDDEN Precompile : public Common  {
89  public:
90    Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
91
92    virtual bool acceptsPipedInput() const { return true; }
93    virtual bool canPipeOutput() const { return false; }
94    virtual bool hasIntegratedCPP() const { return true; }
95
96    virtual void RenderExtraToolArgs(const JobAction &JA,
97                                     ArgStringList &CmdArgs) const;
98  };
99
100  class VISIBILITY_HIDDEN Compile : public Common  {
101  public:
102    Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
103
104    virtual bool acceptsPipedInput() const { return true; }
105    virtual bool canPipeOutput() const { return true; }
106    virtual bool hasIntegratedCPP() const { return true; }
107
108    virtual void RenderExtraToolArgs(const JobAction &JA,
109                                     ArgStringList &CmdArgs) const;
110  };
111
112  class VISIBILITY_HIDDEN Assemble : public Common  {
113  public:
114    Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
115
116    virtual bool acceptsPipedInput() const { return true; }
117    virtual bool canPipeOutput() const { return false; }
118    virtual bool hasIntegratedCPP() const { return false; }
119
120    virtual void RenderExtraToolArgs(const JobAction &JA,
121                                     ArgStringList &CmdArgs) const;
122  };
123
124  class VISIBILITY_HIDDEN Link : public Common  {
125  public:
126    Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
127
128    virtual bool acceptsPipedInput() const { return false; }
129    virtual bool canPipeOutput() const { return false; }
130    virtual bool hasIntegratedCPP() const { return false; }
131
132    virtual void RenderExtraToolArgs(const JobAction &JA,
133                                     ArgStringList &CmdArgs) const;
134  };
135} // end namespace gcc
136
137namespace darwin {
138  class VISIBILITY_HIDDEN DarwinTool : public Tool {
139  protected:
140    void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
141
142    const toolchains::Darwin &getDarwinToolChain() const {
143      return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
144    }
145
146  public:
147    DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
148  };
149
150  class VISIBILITY_HIDDEN CC1 : public DarwinTool  {
151  public:
152    static const char *getBaseInputName(const ArgList &Args,
153                                 const InputInfoList &Input);
154    static const char *getBaseInputStem(const ArgList &Args,
155                                 const InputInfoList &Input);
156    static const char *getDependencyFileName(const ArgList &Args,
157                                             const InputInfoList &Inputs);
158
159  protected:
160    const char *getCC1Name(types::ID Type) const;
161
162    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
163    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
164                           const InputInfoList &Inputs,
165                           const ArgStringList &OutputArgs) const;
166    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
167                           const InputInfoList &Inputs,
168                           const ArgStringList &OutputArgs) const;
169    void AddCPPUniqueOptionsArgs(const ArgList &Args,
170                                 ArgStringList &CmdArgs,
171                                 const InputInfoList &Inputs) const;
172    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
173
174  public:
175    CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
176
177    virtual bool acceptsPipedInput() const { return true; }
178    virtual bool canPipeOutput() const { return true; }
179    virtual bool hasIntegratedCPP() const { return true; }
180  };
181
182  class VISIBILITY_HIDDEN Preprocess : public CC1  {
183  public:
184    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
185
186    virtual void ConstructJob(Compilation &C, const JobAction &JA,
187                              Job &Dest,
188                              const InputInfo &Output,
189                              const InputInfoList &Inputs,
190                              const ArgList &TCArgs,
191                              const char *LinkingOutput) const;
192  };
193
194  class VISIBILITY_HIDDEN Compile : public CC1  {
195  public:
196    Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
197
198    virtual void ConstructJob(Compilation &C, const JobAction &JA,
199                              Job &Dest,
200                              const InputInfo &Output,
201                              const InputInfoList &Inputs,
202                              const ArgList &TCArgs,
203                              const char *LinkingOutput) const;
204  };
205
206  class VISIBILITY_HIDDEN Assemble : public DarwinTool  {
207  public:
208    Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
209
210    virtual bool acceptsPipedInput() const { return true; }
211    virtual bool canPipeOutput() const { return false; }
212    virtual bool hasIntegratedCPP() const { return false; }
213
214    virtual void ConstructJob(Compilation &C, const JobAction &JA,
215                              Job &Dest,
216                              const InputInfo &Output,
217                              const InputInfoList &Inputs,
218                              const ArgList &TCArgs,
219                              const char *LinkingOutput) const;
220  };
221
222  class VISIBILITY_HIDDEN Link : public DarwinTool  {
223    void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
224
225  public:
226    Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
227
228    virtual bool acceptsPipedInput() const { return false; }
229    virtual bool canPipeOutput() const { return false; }
230    virtual bool hasIntegratedCPP() const { return false; }
231
232    virtual void ConstructJob(Compilation &C, const JobAction &JA,
233                              Job &Dest,
234                              const InputInfo &Output,
235                              const InputInfoList &Inputs,
236                              const ArgList &TCArgs,
237                              const char *LinkingOutput) const;
238  };
239
240  class VISIBILITY_HIDDEN Lipo : public DarwinTool  {
241  public:
242    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
243
244    virtual bool acceptsPipedInput() const { return false; }
245    virtual bool canPipeOutput() const { return false; }
246    virtual bool hasIntegratedCPP() const { return false; }
247
248    virtual void ConstructJob(Compilation &C, const JobAction &JA,
249                              Job &Dest,
250                              const InputInfo &Output,
251                              const InputInfoList &Inputs,
252                              const ArgList &TCArgs,
253                              const char *LinkingOutput) const;
254  };
255}
256
257  /// openbsd -- Directly call GNU Binutils assembler and linker
258namespace openbsd {
259  class VISIBILITY_HIDDEN Assemble : public Tool  {
260  public:
261    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", 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,
269                              const InputInfo &Output,
270                              const InputInfoList &Inputs,
271                              const ArgList &TCArgs,
272                              const char *LinkingOutput) const;
273  };
274  class VISIBILITY_HIDDEN Link : public Tool  {
275  public:
276    Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
277
278    virtual bool acceptsPipedInput() const { return true; }
279    virtual bool canPipeOutput() const { return true; }
280    virtual bool hasIntegratedCPP() const { return false; }
281
282    virtual void ConstructJob(Compilation &C, const JobAction &JA,
283                              Job &Dest,
284                              const InputInfo &Output,
285                              const InputInfoList &Inputs,
286                              const ArgList &TCArgs,
287                              const char *LinkingOutput) const;
288  };
289} // end namespace openbsd
290
291  /// freebsd -- Directly call GNU Binutils assembler and linker
292namespace freebsd {
293  class VISIBILITY_HIDDEN Assemble : public Tool  {
294  public:
295    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", 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,
303                              const InputInfo &Output,
304                              const InputInfoList &Inputs,
305                              const ArgList &TCArgs,
306                              const char *LinkingOutput) const;
307  };
308  class VISIBILITY_HIDDEN Link : public Tool  {
309  public:
310    Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
311
312    virtual bool acceptsPipedInput() const { return true; }
313    virtual bool canPipeOutput() const { return true; }
314    virtual bool hasIntegratedCPP() const { return false; }
315
316    virtual void ConstructJob(Compilation &C, const JobAction &JA,
317                              Job &Dest,
318                              const InputInfo &Output,
319                              const InputInfoList &Inputs,
320                              const ArgList &TCArgs,
321                              const char *LinkingOutput) const;
322  };
323} // end namespace freebsd
324
325  /// auroraux -- Directly call GNU Binutils assembler and linker
326namespace auroraux {
327  class VISIBILITY_HIDDEN Assemble : public Tool  {
328  public:
329    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", 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,
337                              const InputInfo &Output,
338                              const InputInfoList &Inputs,
339                              const ArgList &TCArgs,
340                              const char *LinkingOutput) const;
341  };
342  class VISIBILITY_HIDDEN Link : public Tool  {
343  public:
344    Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
345
346    virtual bool acceptsPipedInput() const { return true; }
347    virtual bool canPipeOutput() const { return true; }
348    virtual bool hasIntegratedCPP() const { return false; }
349
350    virtual void ConstructJob(Compilation &C, const JobAction &JA,
351                              Job &Dest,
352                              const InputInfo &Output,
353                              const InputInfoList &Inputs,
354                              const ArgList &TCArgs,
355                              const char *LinkingOutput) const;
356  };
357} // end namespace auroraux
358
359  /// dragonfly -- Directly call GNU Binutils assembler and linker
360namespace dragonfly {
361  class VISIBILITY_HIDDEN Assemble : public Tool  {
362  public:
363    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", 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,
371                              const InputInfo &Output,
372                              const InputInfoList &Inputs,
373                              const ArgList &TCArgs,
374                              const char *LinkingOutput) const;
375  };
376  class VISIBILITY_HIDDEN Link : public Tool  {
377  public:
378    Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
379
380    virtual bool acceptsPipedInput() const { return true; }
381    virtual bool canPipeOutput() const { return true; }
382    virtual bool hasIntegratedCPP() const { return false; }
383
384    virtual void ConstructJob(Compilation &C, const JobAction &JA,
385                              Job &Dest,
386                              const InputInfo &Output,
387                              const InputInfoList &Inputs,
388                              const ArgList &TCArgs,
389                              const char *LinkingOutput) const;
390  };
391} // end namespace dragonfly
392
393} // end namespace toolchains
394} // end namespace driver
395} // end namespace clang
396
397#endif // CLANG_LIB_DRIVER_TOOLS_H_
398