Tools.h revision a3ec60e0cf2a1916f479288998d31bd980b1a306
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 {
21namespace toolchains {
22  class Darwin_X86;
23}
24
25namespace tools {
26
27  class VISIBILITY_HIDDEN Clang : public Tool {
28  public:
29    Clang(const ToolChain &TC) : Tool("clang", TC) {}
30
31    virtual bool acceptsPipedInput() const { return true; }
32    virtual bool canPipeOutput() const { return true; }
33    virtual bool hasIntegratedCPP() const { return true; }
34
35    virtual void ConstructJob(Compilation &C, const JobAction &JA,
36                              Job &Dest,
37                              const InputInfo &Output,
38                              const InputInfoList &Inputs,
39                              const ArgList &TCArgs,
40                              const char *LinkingOutput) const;
41  };
42
43  /// gcc - Generic GCC tool implementations.
44namespace gcc {
45  class VISIBILITY_HIDDEN Common : public Tool {
46  public:
47    Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
48
49    virtual void ConstructJob(Compilation &C, const JobAction &JA,
50                              Job &Dest,
51                              const InputInfo &Output,
52                              const InputInfoList &Inputs,
53                              const ArgList &TCArgs,
54                              const char *LinkingOutput) const;
55
56    /// RenderExtraToolArgs - Render any arguments necessary to force
57    /// the particular tool mode.
58    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
59  };
60
61
62  class VISIBILITY_HIDDEN Preprocess : public Common {
63  public:
64    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
65
66    virtual bool acceptsPipedInput() const { return true; }
67    virtual bool canPipeOutput() const { return true; }
68    virtual bool hasIntegratedCPP() const { return false; }
69
70    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
71  };
72
73  class VISIBILITY_HIDDEN Precompile : public Common  {
74  public:
75    Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
76
77    virtual bool acceptsPipedInput() const { return true; }
78    virtual bool canPipeOutput() const { return false; }
79    virtual bool hasIntegratedCPP() const { return true; }
80
81    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
82  };
83
84  class VISIBILITY_HIDDEN Compile : public Common  {
85  public:
86    Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
87
88    virtual bool acceptsPipedInput() const { return true; }
89    virtual bool canPipeOutput() const { return true; }
90    virtual bool hasIntegratedCPP() const { return true; }
91
92    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
93  };
94
95  class VISIBILITY_HIDDEN Assemble : public Common  {
96  public:
97    Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
98
99    virtual bool acceptsPipedInput() const { return true; }
100    virtual bool canPipeOutput() const { return false; }
101    virtual bool hasIntegratedCPP() const { return false; }
102
103    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
104  };
105
106  class VISIBILITY_HIDDEN Link : public Common  {
107  public:
108    Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
109
110    virtual bool acceptsPipedInput() const { return false; }
111    virtual bool canPipeOutput() const { return false; }
112    virtual bool hasIntegratedCPP() const { return false; }
113
114    virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
115  };
116} // end namespace gcc
117
118namespace darwin {
119  class VISIBILITY_HIDDEN CC1 : public Tool  {
120  protected:
121    const char *getCC1Name(types::ID Type) const;
122    const char *getBaseInputName(const ArgList &Args,
123                                 const InputInfoList &Input) const;
124    const char *getBaseInputStem(const ArgList &Args,
125                                 const InputInfoList &Input) const;
126    const char *getDependencyFileName(const ArgList &Args,
127                                      const InputInfoList &Inputs) const;
128
129    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
130    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
131                           const InputInfoList &Inputs,
132                           const ArgStringList &OutputArgs) const;
133    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
134                           const InputInfoList &Inputs,
135                           const ArgStringList &OutputArgs) const;
136    void AddCPPUniqueOptionsArgs(const ArgList &Args,
137                                 ArgStringList &CmdArgs,
138                                 const InputInfoList &Inputs) const;
139    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
140
141  public:
142    CC1(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
143
144    virtual bool acceptsPipedInput() const { return true; }
145    virtual bool canPipeOutput() const { return true; }
146    virtual bool hasIntegratedCPP() const { return true; }
147  };
148
149  class VISIBILITY_HIDDEN Preprocess : public CC1  {
150  public:
151    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
152
153    virtual void ConstructJob(Compilation &C, const JobAction &JA,
154                              Job &Dest,
155                              const InputInfo &Output,
156                              const InputInfoList &Inputs,
157                              const ArgList &TCArgs,
158                              const char *LinkingOutput) const;
159  };
160
161  class VISIBILITY_HIDDEN Compile : public CC1  {
162  public:
163    Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
164
165    virtual void ConstructJob(Compilation &C, const JobAction &JA,
166                              Job &Dest,
167                              const InputInfo &Output,
168                              const InputInfoList &Inputs,
169                              const ArgList &TCArgs,
170                              const char *LinkingOutput) const;
171  };
172
173  class VISIBILITY_HIDDEN Assemble : public Tool  {
174  public:
175    Assemble(const ToolChain &TC) : Tool("darwin::Assemble", TC) {}
176
177    virtual bool acceptsPipedInput() const { return true; }
178    virtual bool canPipeOutput() const { return false; }
179    virtual bool hasIntegratedCPP() const { return false; }
180
181    virtual void ConstructJob(Compilation &C, const JobAction &JA,
182                              Job &Dest,
183                              const InputInfo &Output,
184                              const InputInfoList &Inputs,
185                              const ArgList &TCArgs,
186                              const char *LinkingOutput) const;
187  };
188
189  class VISIBILITY_HIDDEN Link : public Tool  {
190    void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
191    void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const;
192    void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
193
194    /// The default macosx-version-min.
195    const char *MacosxVersionMin;
196
197    const toolchains::Darwin_X86 &getDarwinToolChain() const;
198
199  public:
200    Link(const ToolChain &TC,
201         const char *_MacosxVersionMin)
202      : Tool("darwin::Link", TC), MacosxVersionMin(_MacosxVersionMin) {
203    }
204
205    virtual bool acceptsPipedInput() const { return false; }
206    virtual bool canPipeOutput() const { return false; }
207    virtual bool hasIntegratedCPP() const { return false; }
208
209    virtual void ConstructJob(Compilation &C, const JobAction &JA,
210                              Job &Dest,
211                              const InputInfo &Output,
212                              const InputInfoList &Inputs,
213                              const ArgList &TCArgs,
214                              const char *LinkingOutput) const;
215  };
216
217  class VISIBILITY_HIDDEN Lipo : public Tool  {
218  public:
219    Lipo(const ToolChain &TC) : Tool("darwin::Lipo", TC) {}
220
221    virtual bool acceptsPipedInput() const { return false; }
222    virtual bool canPipeOutput() const { return false; }
223    virtual bool hasIntegratedCPP() const { return false; }
224
225    virtual void ConstructJob(Compilation &C, const JobAction &JA,
226                              Job &Dest,
227                              const InputInfo &Output,
228                              const InputInfoList &Inputs,
229                              const ArgList &TCArgs,
230                              const char *LinkingOutput) const;
231  };
232}
233
234} // end namespace toolchains
235} // end namespace driver
236} // end namespace clang
237
238#endif
239