1 //===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #ifndef CLANG_LIB_DRIVER_TOOLS_H_
11 #define CLANG_LIB_DRIVER_TOOLS_H_
13 #include "clang/Driver/Tool.h"
14 #include "clang/Driver/Types.h"
15 #include "clang/Driver/Util.h"
17 #include "llvm/Support/Compiler.h"
23 namespace toolchains {
29 class VISIBILITY_HIDDEN Clang : public Tool {
30 void AddPreprocessingOptions(const Driver &D,
32 ArgStringList &CmdArgs,
33 const InputInfo &Output,
34 const InputInfoList &Inputs) const;
36 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
37 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
40 Clang(const ToolChain &TC) : Tool("clang", TC) {}
42 virtual bool acceptsPipedInput() const { return true; }
43 virtual bool canPipeOutput() const { return true; }
44 virtual bool hasIntegratedCPP() const { return true; }
46 virtual void ConstructJob(Compilation &C, const JobAction &JA,
48 const InputInfo &Output,
49 const InputInfoList &Inputs,
50 const ArgList &TCArgs,
51 const char *LinkingOutput) const;
54 /// gcc - Generic GCC tool implementations.
56 class VISIBILITY_HIDDEN Common : public Tool {
58 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
60 virtual void ConstructJob(Compilation &C, const JobAction &JA,
62 const InputInfo &Output,
63 const InputInfoList &Inputs,
64 const ArgList &TCArgs,
65 const char *LinkingOutput) const;
67 /// RenderExtraToolArgs - Render any arguments necessary to force
68 /// the particular tool mode.
69 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
73 class VISIBILITY_HIDDEN Preprocess : public Common {
75 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
77 virtual bool acceptsPipedInput() const { return true; }
78 virtual bool canPipeOutput() const { return true; }
79 virtual bool hasIntegratedCPP() const { return false; }
81 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
84 class VISIBILITY_HIDDEN Precompile : public Common {
86 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
88 virtual bool acceptsPipedInput() const { return true; }
89 virtual bool canPipeOutput() const { return false; }
90 virtual bool hasIntegratedCPP() const { return true; }
92 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
95 class VISIBILITY_HIDDEN Compile : public Common {
97 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
99 virtual bool acceptsPipedInput() const { return true; }
100 virtual bool canPipeOutput() const { return true; }
101 virtual bool hasIntegratedCPP() const { return true; }
103 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
106 class VISIBILITY_HIDDEN Assemble : public Common {
108 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
110 virtual bool acceptsPipedInput() const { return true; }
111 virtual bool canPipeOutput() const { return false; }
112 virtual bool hasIntegratedCPP() const { return false; }
114 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
117 class VISIBILITY_HIDDEN Link : public Common {
119 Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
121 virtual bool acceptsPipedInput() const { return false; }
122 virtual bool canPipeOutput() const { return false; }
123 virtual bool hasIntegratedCPP() const { return false; }
125 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
127 } // end namespace gcc
130 class VISIBILITY_HIDDEN DarwinTool : public Tool {
132 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
134 const toolchains::Darwin &getDarwinToolChain() const {
135 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
139 DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
142 class VISIBILITY_HIDDEN CC1 : public DarwinTool {
144 static const char *getBaseInputName(const ArgList &Args,
145 const InputInfoList &Input);
146 static const char *getBaseInputStem(const ArgList &Args,
147 const InputInfoList &Input);
148 static const char *getDependencyFileName(const ArgList &Args,
149 const InputInfoList &Inputs);
152 const char *getCC1Name(types::ID Type) const;
154 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
155 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
156 const InputInfoList &Inputs,
157 const ArgStringList &OutputArgs) const;
158 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
159 const InputInfoList &Inputs,
160 const ArgStringList &OutputArgs) const;
161 void AddCPPUniqueOptionsArgs(const ArgList &Args,
162 ArgStringList &CmdArgs,
163 const InputInfoList &Inputs) const;
164 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
167 CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
169 virtual bool acceptsPipedInput() const { return true; }
170 virtual bool canPipeOutput() const { return true; }
171 virtual bool hasIntegratedCPP() const { return true; }
174 class VISIBILITY_HIDDEN Preprocess : public CC1 {
176 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
178 virtual void ConstructJob(Compilation &C, const JobAction &JA,
180 const InputInfo &Output,
181 const InputInfoList &Inputs,
182 const ArgList &TCArgs,
183 const char *LinkingOutput) const;
186 class VISIBILITY_HIDDEN Compile : public CC1 {
188 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
190 virtual void ConstructJob(Compilation &C, const JobAction &JA,
192 const InputInfo &Output,
193 const InputInfoList &Inputs,
194 const ArgList &TCArgs,
195 const char *LinkingOutput) const;
198 class VISIBILITY_HIDDEN Assemble : public DarwinTool {
200 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
202 virtual bool acceptsPipedInput() const { return true; }
203 virtual bool canPipeOutput() const { return false; }
204 virtual bool hasIntegratedCPP() const { return false; }
206 virtual void ConstructJob(Compilation &C, const JobAction &JA,
208 const InputInfo &Output,
209 const InputInfoList &Inputs,
210 const ArgList &TCArgs,
211 const char *LinkingOutput) const;
214 class VISIBILITY_HIDDEN Link : public DarwinTool {
215 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
218 Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
220 virtual bool acceptsPipedInput() const { return false; }
221 virtual bool canPipeOutput() const { return false; }
222 virtual bool hasIntegratedCPP() const { return false; }
224 virtual void ConstructJob(Compilation &C, const JobAction &JA,
226 const InputInfo &Output,
227 const InputInfoList &Inputs,
228 const ArgList &TCArgs,
229 const char *LinkingOutput) const;
232 class VISIBILITY_HIDDEN Lipo : public DarwinTool {
234 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
236 virtual bool acceptsPipedInput() const { return false; }
237 virtual bool canPipeOutput() const { return false; }
238 virtual bool hasIntegratedCPP() const { return false; }
240 virtual void ConstructJob(Compilation &C, const JobAction &JA,
242 const InputInfo &Output,
243 const InputInfoList &Inputs,
244 const ArgList &TCArgs,
245 const char *LinkingOutput) const;
249 /// openbsd -- Directly call GNU Binutils assembler and linker
251 class VISIBILITY_HIDDEN Assemble : public Tool {
253 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
255 virtual bool acceptsPipedInput() const { return true; }
256 virtual bool canPipeOutput() const { return true; }
257 virtual bool hasIntegratedCPP() const { return false; }
259 virtual void ConstructJob(Compilation &C, const JobAction &JA,
261 const InputInfo &Output,
262 const InputInfoList &Inputs,
263 const ArgList &TCArgs,
264 const char *LinkingOutput) const;
266 class VISIBILITY_HIDDEN Link : public Tool {
268 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
270 virtual bool acceptsPipedInput() const { return true; }
271 virtual bool canPipeOutput() const { return true; }
272 virtual bool hasIntegratedCPP() const { return false; }
274 virtual void ConstructJob(Compilation &C, const JobAction &JA,
276 const InputInfo &Output,
277 const InputInfoList &Inputs,
278 const ArgList &TCArgs,
279 const char *LinkingOutput) const;
281 } // end namespace openbsd
283 /// freebsd -- Directly call GNU Binutils assembler and linker
285 class VISIBILITY_HIDDEN Assemble : public Tool {
287 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
289 virtual bool acceptsPipedInput() const { return true; }
290 virtual bool canPipeOutput() const { return true; }
291 virtual bool hasIntegratedCPP() const { return false; }
293 virtual void ConstructJob(Compilation &C, const JobAction &JA,
295 const InputInfo &Output,
296 const InputInfoList &Inputs,
297 const ArgList &TCArgs,
298 const char *LinkingOutput) const;
300 class VISIBILITY_HIDDEN Link : public Tool {
302 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
304 virtual bool acceptsPipedInput() const { return true; }
305 virtual bool canPipeOutput() const { return true; }
306 virtual bool hasIntegratedCPP() const { return false; }
308 virtual void ConstructJob(Compilation &C, const JobAction &JA,
310 const InputInfo &Output,
311 const InputInfoList &Inputs,
312 const ArgList &TCArgs,
313 const char *LinkingOutput) const;
315 } // end namespace freebsd
317 /// auroraux -- Directly call GNU Binutils assembler and linker
319 class VISIBILITY_HIDDEN Assemble : public Tool {
321 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
323 virtual bool acceptsPipedInput() const { return true; }
324 virtual bool canPipeOutput() const { return true; }
325 virtual bool hasIntegratedCPP() const { return false; }
327 virtual void ConstructJob(Compilation &C, const JobAction &JA,
329 const InputInfo &Output,
330 const InputInfoList &Inputs,
331 const ArgList &TCArgs,
332 const char *LinkingOutput) const;
334 class VISIBILITY_HIDDEN Link : public Tool {
336 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
338 virtual bool acceptsPipedInput() const { return true; }
339 virtual bool canPipeOutput() const { return true; }
340 virtual bool hasIntegratedCPP() const { return false; }
342 virtual void ConstructJob(Compilation &C, const JobAction &JA,
344 const InputInfo &Output,
345 const InputInfoList &Inputs,
346 const ArgList &TCArgs,
347 const char *LinkingOutput) const;
349 } // end namespace auroraux
351 /// dragonfly -- Directly call GNU Binutils assembler and linker
352 namespace dragonfly {
353 class VISIBILITY_HIDDEN Assemble : public Tool {
355 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
357 virtual bool acceptsPipedInput() const { return true; }
358 virtual bool canPipeOutput() const { return true; }
359 virtual bool hasIntegratedCPP() const { return false; }
361 virtual void ConstructJob(Compilation &C, const JobAction &JA,
363 const InputInfo &Output,
364 const InputInfoList &Inputs,
365 const ArgList &TCArgs,
366 const char *LinkingOutput) const;
368 class VISIBILITY_HIDDEN Link : public Tool {
370 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
372 virtual bool acceptsPipedInput() const { return true; }
373 virtual bool canPipeOutput() const { return true; }
374 virtual bool hasIntegratedCPP() const { return false; }
376 virtual void ConstructJob(Compilation &C, const JobAction &JA,
378 const InputInfo &Output,
379 const InputInfoList &Inputs,
380 const ArgList &TCArgs,
381 const char *LinkingOutput) const;
383 } // end namespace dragonfly
385 } // end namespace toolchains
386 } // end namespace driver
387 } // end namespace clang
389 #endif // CLANG_LIB_DRIVER_TOOLS_H_