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 /// \brief Clang compiler tool.
30 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
31 void AddPreprocessingOptions(const Driver &D,
33 ArgStringList &CmdArgs,
34 const InputInfo &Output,
35 const InputInfoList &Inputs) const;
37 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
38 bool KernelOrKext) const;
39 void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
40 void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
41 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
44 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
46 virtual bool hasGoodDiagnostics() const { return true; }
47 virtual bool hasIntegratedAssembler() const { return true; }
48 virtual bool hasIntegratedCPP() const { return true; }
50 virtual void ConstructJob(Compilation &C, const JobAction &JA,
51 const InputInfo &Output,
52 const InputInfoList &Inputs,
53 const ArgList &TCArgs,
54 const char *LinkingOutput) const;
57 /// \brief Clang integrated assembler tool.
58 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
60 ClangAs(const ToolChain &TC) : Tool("clang::as",
61 "clang integrated assembler", TC) {}
63 virtual bool hasGoodDiagnostics() const { return true; }
64 virtual bool hasIntegratedAssembler() const { return false; }
65 virtual bool hasIntegratedCPP() const { return false; }
67 virtual void ConstructJob(Compilation &C, const JobAction &JA,
68 const InputInfo &Output,
69 const InputInfoList &Inputs,
70 const ArgList &TCArgs,
71 const char *LinkingOutput) const;
74 /// gcc - Generic GCC tool implementations.
76 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
78 Common(const char *Name, const char *ShortName,
79 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
81 virtual void ConstructJob(Compilation &C, const JobAction &JA,
82 const InputInfo &Output,
83 const InputInfoList &Inputs,
84 const ArgList &TCArgs,
85 const char *LinkingOutput) const;
87 /// RenderExtraToolArgs - Render any arguments necessary to force
88 /// the particular tool mode.
89 virtual void RenderExtraToolArgs(const JobAction &JA,
90 ArgStringList &CmdArgs) const = 0;
94 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
96 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
97 "gcc preprocessor", TC) {}
99 virtual bool hasGoodDiagnostics() const { return true; }
100 virtual bool hasIntegratedCPP() const { return false; }
102 virtual void RenderExtraToolArgs(const JobAction &JA,
103 ArgStringList &CmdArgs) const;
106 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
108 Precompile(const ToolChain &TC) : Common("gcc::Precompile",
109 "gcc precompile", TC) {}
111 virtual bool hasGoodDiagnostics() const { return true; }
112 virtual bool hasIntegratedCPP() const { return true; }
114 virtual void RenderExtraToolArgs(const JobAction &JA,
115 ArgStringList &CmdArgs) const;
118 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
120 Compile(const ToolChain &TC) : Common("gcc::Compile",
121 "gcc frontend", TC) {}
123 virtual bool hasGoodDiagnostics() const { return true; }
124 virtual bool hasIntegratedCPP() const { return true; }
126 virtual void RenderExtraToolArgs(const JobAction &JA,
127 ArgStringList &CmdArgs) const;
130 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
132 Assemble(const ToolChain &TC) : Common("gcc::Assemble",
133 "assembler (via gcc)", TC) {}
135 virtual bool hasIntegratedCPP() const { return false; }
137 virtual void RenderExtraToolArgs(const JobAction &JA,
138 ArgStringList &CmdArgs) const;
141 class LLVM_LIBRARY_VISIBILITY Link : public Common {
143 Link(const ToolChain &TC) : Common("gcc::Link",
144 "linker (via gcc)", TC) {}
146 virtual bool hasIntegratedCPP() const { return false; }
148 virtual void RenderExtraToolArgs(const JobAction &JA,
149 ArgStringList &CmdArgs) const;
151 } // end namespace gcc
154 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
156 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
158 const toolchains::Darwin &getDarwinToolChain() const {
159 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
163 DarwinTool(const char *Name, const char *ShortName,
164 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
167 class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool {
169 static const char *getBaseInputName(const ArgList &Args,
170 const InputInfoList &Input);
171 static const char *getBaseInputStem(const ArgList &Args,
172 const InputInfoList &Input);
173 static const char *getDependencyFileName(const ArgList &Args,
174 const InputInfoList &Inputs);
177 const char *getCC1Name(types::ID Type) const;
179 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
180 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
181 const InputInfoList &Inputs,
182 const ArgStringList &OutputArgs) const;
183 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
184 const InputInfoList &Inputs,
185 const ArgStringList &OutputArgs) const;
186 void AddCPPUniqueOptionsArgs(const ArgList &Args,
187 ArgStringList &CmdArgs,
188 const InputInfoList &Inputs) const;
189 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
192 CC1(const char *Name, const char *ShortName,
193 const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {}
195 virtual bool hasGoodDiagnostics() const { return true; }
196 virtual bool hasIntegratedCPP() const { return true; }
199 class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1 {
201 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess",
202 "gcc preprocessor", TC) {}
204 virtual void ConstructJob(Compilation &C, const JobAction &JA,
205 const InputInfo &Output,
206 const InputInfoList &Inputs,
207 const ArgList &TCArgs,
208 const char *LinkingOutput) const;
211 class LLVM_LIBRARY_VISIBILITY Compile : public CC1 {
213 Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {}
215 virtual void ConstructJob(Compilation &C, const JobAction &JA,
216 const InputInfo &Output,
217 const InputInfoList &Inputs,
218 const ArgList &TCArgs,
219 const char *LinkingOutput) const;
222 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
224 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
227 virtual bool hasIntegratedCPP() const { return false; }
229 virtual void ConstructJob(Compilation &C, const JobAction &JA,
230 const InputInfo &Output,
231 const InputInfoList &Inputs,
232 const ArgList &TCArgs,
233 const char *LinkingOutput) const;
236 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
237 void AddLinkArgs(Compilation &C, const ArgList &Args,
238 ArgStringList &CmdArgs) const;
241 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
243 virtual bool hasIntegratedCPP() const { return false; }
245 virtual void ConstructJob(Compilation &C, const JobAction &JA,
246 const InputInfo &Output,
247 const InputInfoList &Inputs,
248 const ArgList &TCArgs,
249 const char *LinkingOutput) const;
252 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
254 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
256 virtual bool hasIntegratedCPP() const { return false; }
258 virtual void ConstructJob(Compilation &C, const JobAction &JA,
259 const InputInfo &Output,
260 const InputInfoList &Inputs,
261 const ArgList &TCArgs,
262 const char *LinkingOutput) const;
265 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
267 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
270 virtual bool hasIntegratedCPP() const { return false; }
272 virtual void ConstructJob(Compilation &C, const JobAction &JA,
273 const InputInfo &Output,
274 const InputInfoList &Inputs,
275 const ArgList &TCArgs,
276 const char *LinkingOutput) const;
280 /// openbsd -- Directly call GNU Binutils assembler and linker
282 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
284 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
287 virtual bool hasIntegratedCPP() const { return false; }
289 virtual void ConstructJob(Compilation &C, const JobAction &JA,
290 const InputInfo &Output,
291 const InputInfoList &Inputs,
292 const ArgList &TCArgs,
293 const char *LinkingOutput) const;
295 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
297 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
299 virtual bool hasIntegratedCPP() const { return false; }
301 virtual void ConstructJob(Compilation &C, const JobAction &JA,
302 const InputInfo &Output,
303 const InputInfoList &Inputs,
304 const ArgList &TCArgs,
305 const char *LinkingOutput) const;
307 } // end namespace openbsd
309 /// freebsd -- Directly call GNU Binutils assembler and linker
311 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
313 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
316 virtual bool hasIntegratedCPP() const { return false; }
318 virtual void ConstructJob(Compilation &C, const JobAction &JA,
319 const InputInfo &Output,
320 const InputInfoList &Inputs,
321 const ArgList &TCArgs,
322 const char *LinkingOutput) const;
324 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
326 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
328 virtual bool hasIntegratedCPP() const { return false; }
330 virtual void ConstructJob(Compilation &C, const JobAction &JA,
331 const InputInfo &Output,
332 const InputInfoList &Inputs,
333 const ArgList &TCArgs,
334 const char *LinkingOutput) const;
336 } // end namespace freebsd
338 /// netbsd -- Directly call GNU Binutils assembler and linker
340 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
342 Assemble(const ToolChain &TC) : Tool("netbsd::Assemble", "assembler",
345 virtual bool hasIntegratedCPP() const { return false; }
347 virtual void ConstructJob(Compilation &C, const JobAction &JA,
348 const InputInfo &Output,
349 const InputInfoList &Inputs,
350 const ArgList &TCArgs,
351 const char *LinkingOutput) const;
353 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
355 Link(const ToolChain &TC) : Tool("netbsd::Link", "linker", TC) {}
357 virtual bool hasIntegratedCPP() const { return false; }
359 virtual void ConstructJob(Compilation &C, const JobAction &JA,
360 const InputInfo &Output,
361 const InputInfoList &Inputs,
362 const ArgList &TCArgs,
363 const char *LinkingOutput) const;
365 } // end namespace netbsd
367 /// linux -- Directly call GNU Binutils assembler and linker
368 namespace linuxtools {
369 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
371 Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
374 virtual bool hasIntegratedCPP() const { return false; }
376 virtual void ConstructJob(Compilation &C, const JobAction &JA,
377 const InputInfo &Output,
378 const InputInfoList &Inputs,
379 const ArgList &TCArgs,
380 const char *LinkingOutput) const;
382 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
384 Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {}
386 virtual bool hasIntegratedCPP() const { return false; }
388 virtual void ConstructJob(Compilation &C, const JobAction &JA,
389 const InputInfo &Output,
390 const InputInfoList &Inputs,
391 const ArgList &TCArgs,
392 const char *LinkingOutput) const;
395 /// minix -- Directly call GNU Binutils assembler and linker
397 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
399 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
402 virtual bool hasIntegratedCPP() const { return false; }
404 virtual void ConstructJob(Compilation &C, const JobAction &JA,
405 const InputInfo &Output,
406 const InputInfoList &Inputs,
407 const ArgList &TCArgs,
408 const char *LinkingOutput) const;
410 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
412 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
414 virtual bool hasIntegratedCPP() const { return false; }
416 virtual void ConstructJob(Compilation &C, const JobAction &JA,
417 const InputInfo &Output,
418 const InputInfoList &Inputs,
419 const ArgList &TCArgs,
420 const char *LinkingOutput) const;
422 } // end namespace minix
424 /// auroraux -- Directly call GNU Binutils assembler and linker
426 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
428 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
431 virtual bool hasIntegratedCPP() const { return false; }
433 virtual void ConstructJob(Compilation &C, const JobAction &JA,
434 const InputInfo &Output,
435 const InputInfoList &Inputs,
436 const ArgList &TCArgs,
437 const char *LinkingOutput) const;
439 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
441 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
443 virtual bool hasIntegratedCPP() const { return false; }
445 virtual void ConstructJob(Compilation &C, const JobAction &JA,
446 const InputInfo &Output,
447 const InputInfoList &Inputs,
448 const ArgList &TCArgs,
449 const char *LinkingOutput) const;
451 } // end namespace auroraux
453 /// dragonfly -- Directly call GNU Binutils assembler and linker
454 namespace dragonfly {
455 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
457 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
460 virtual bool hasIntegratedCPP() const { return false; }
462 virtual void ConstructJob(Compilation &C, const JobAction &JA,
463 const InputInfo &Output,
464 const InputInfoList &Inputs,
465 const ArgList &TCArgs,
466 const char *LinkingOutput) const;
468 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
470 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
472 virtual bool hasIntegratedCPP() const { return false; }
474 virtual void ConstructJob(Compilation &C, const JobAction &JA,
475 const InputInfo &Output,
476 const InputInfoList &Inputs,
477 const ArgList &TCArgs,
478 const char *LinkingOutput) const;
480 } // end namespace dragonfly
482 /// Visual studio tools.
483 namespace visualstudio {
484 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
486 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
488 virtual bool hasIntegratedCPP() const { return false; }
490 virtual void ConstructJob(Compilation &C, const JobAction &JA,
491 const InputInfo &Output,
492 const InputInfoList &Inputs,
493 const ArgList &TCArgs,
494 const char *LinkingOutput) const;
496 } // end namespace visualstudio
498 } // end namespace toolchains
499 } // end namespace driver
500 } // end namespace clang
502 #endif // CLANG_LIB_DRIVER_TOOLS_H_