Tools.h revision 8767cbc475ed96397b6f08617814eeb9cab121bd
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 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_
397