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"
16 #include "llvm/ADT/Triple.h"
17 #include "llvm/Option/Option.h"
18 #include "llvm/Support/Compiler.h"
27 namespace toolchains {
32 using llvm::opt::ArgStringList;
34 /// \brief Clang compiler tool.
35 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
37 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
38 const InputInfoList &Inputs);
39 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
40 const InputInfoList &Inputs);
41 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
42 const InputInfoList &Inputs);
45 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
47 const llvm::opt::ArgList &Args,
48 llvm::opt::ArgStringList &CmdArgs,
49 const InputInfo &Output,
50 const InputInfoList &Inputs) const;
52 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
53 llvm::opt::ArgStringList &CmdArgs) const;
54 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
55 llvm::opt::ArgStringList &CmdArgs,
56 bool KernelOrKext) const;
57 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs) const;
59 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
60 llvm::opt::ArgStringList &CmdArgs) const;
61 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
62 llvm::opt::ArgStringList &CmdArgs) const;
63 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
64 llvm::opt::ArgStringList &CmdArgs) const;
65 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
66 llvm::opt::ArgStringList &CmdArgs) const;
67 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
68 llvm::opt::ArgStringList &CmdArgs) const;
70 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
72 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
73 llvm::opt::ArgStringList &cmdArgs,
74 RewriteKind rewrite) const;
76 void AddClangCLArgs(const llvm::opt::ArgList &Args,
77 llvm::opt::ArgStringList &CmdArgs) const;
80 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
82 virtual bool hasGoodDiagnostics() const { return true; }
83 virtual bool hasIntegratedAssembler() const { return true; }
84 virtual bool hasIntegratedCPP() const { return true; }
86 virtual void ConstructJob(Compilation &C, const JobAction &JA,
87 const InputInfo &Output,
88 const InputInfoList &Inputs,
89 const llvm::opt::ArgList &TCArgs,
90 const char *LinkingOutput) const;
93 /// \brief Clang integrated assembler tool.
94 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
96 ClangAs(const ToolChain &TC) : Tool("clang::as",
97 "clang integrated assembler", TC) {}
99 virtual bool hasGoodDiagnostics() const { return true; }
100 virtual bool hasIntegratedAssembler() const { return false; }
101 virtual bool hasIntegratedCPP() const { return false; }
103 virtual void ConstructJob(Compilation &C, const JobAction &JA,
104 const InputInfo &Output,
105 const InputInfoList &Inputs,
106 const llvm::opt::ArgList &TCArgs,
107 const char *LinkingOutput) const;
110 /// gcc - Generic GCC tool implementations.
112 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
114 Common(const char *Name, const char *ShortName,
115 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
117 virtual void ConstructJob(Compilation &C, const JobAction &JA,
118 const InputInfo &Output,
119 const InputInfoList &Inputs,
120 const llvm::opt::ArgList &TCArgs,
121 const char *LinkingOutput) const;
123 /// RenderExtraToolArgs - Render any arguments necessary to force
124 /// the particular tool mode.
126 RenderExtraToolArgs(const JobAction &JA,
127 llvm::opt::ArgStringList &CmdArgs) const = 0;
130 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
132 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
133 "gcc preprocessor", TC) {}
135 virtual bool hasGoodDiagnostics() const { return true; }
136 virtual bool hasIntegratedCPP() const { return false; }
138 virtual void RenderExtraToolArgs(const JobAction &JA,
139 llvm::opt::ArgStringList &CmdArgs) const;
142 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
144 Precompile(const ToolChain &TC) : Common("gcc::Precompile",
145 "gcc precompile", TC) {}
147 virtual bool hasGoodDiagnostics() const { return true; }
148 virtual bool hasIntegratedCPP() const { return true; }
150 virtual void RenderExtraToolArgs(const JobAction &JA,
151 llvm::opt::ArgStringList &CmdArgs) const;
154 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
156 Compile(const ToolChain &TC) : Common("gcc::Compile",
157 "gcc frontend", TC) {}
159 virtual bool hasGoodDiagnostics() const { return true; }
160 virtual bool hasIntegratedCPP() const { return true; }
162 virtual void RenderExtraToolArgs(const JobAction &JA,
163 llvm::opt::ArgStringList &CmdArgs) const;
166 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
168 Assemble(const ToolChain &TC) : Common("gcc::Assemble",
169 "assembler (via gcc)", TC) {}
171 virtual bool hasIntegratedCPP() const { return false; }
173 virtual void RenderExtraToolArgs(const JobAction &JA,
174 llvm::opt::ArgStringList &CmdArgs) const;
177 class LLVM_LIBRARY_VISIBILITY Link : public Common {
179 Link(const ToolChain &TC) : Common("gcc::Link",
180 "linker (via gcc)", TC) {}
182 virtual bool hasIntegratedCPP() const { return false; }
183 virtual bool isLinkJob() const { return true; }
185 virtual void RenderExtraToolArgs(const JobAction &JA,
186 llvm::opt::ArgStringList &CmdArgs) const;
188 } // end namespace gcc
191 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
192 // We simply use "clang -cc1" for those actions.
193 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
195 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
198 virtual bool hasIntegratedCPP() const { return false; }
200 virtual void RenderExtraToolArgs(const JobAction &JA,
201 llvm::opt::ArgStringList &CmdArgs) const;
202 virtual void ConstructJob(Compilation &C, const JobAction &JA,
203 const InputInfo &Output,
204 const InputInfoList &Inputs,
205 const llvm::opt::ArgList &TCArgs,
206 const char *LinkingOutput) const;
209 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
211 Link(const ToolChain &TC) : Tool("hexagon::Link",
214 virtual bool hasIntegratedCPP() const { return false; }
215 virtual bool isLinkJob() const { return true; }
217 virtual void RenderExtraToolArgs(const JobAction &JA,
218 llvm::opt::ArgStringList &CmdArgs) const;
219 virtual void ConstructJob(Compilation &C, const JobAction &JA,
220 const InputInfo &Output,
221 const InputInfoList &Inputs,
222 const llvm::opt::ArgList &TCArgs,
223 const char *LinkingOutput) const;
225 } // end namespace hexagon.
229 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
231 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
232 virtual void anchor();
234 void AddDarwinArch(const llvm::opt::ArgList &Args,
235 llvm::opt::ArgStringList &CmdArgs) const;
237 const toolchains::Darwin &getDarwinToolChain() const {
238 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
242 DarwinTool(const char *Name, const char *ShortName,
243 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
246 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
248 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
251 virtual bool hasIntegratedCPP() const { return false; }
253 virtual void ConstructJob(Compilation &C, const JobAction &JA,
254 const InputInfo &Output,
255 const InputInfoList &Inputs,
256 const llvm::opt::ArgList &TCArgs,
257 const char *LinkingOutput) const;
260 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
261 bool NeedsTempPath(const InputInfoList &Inputs) const;
262 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
263 llvm::opt::ArgStringList &CmdArgs,
264 const InputInfoList &Inputs) const;
267 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
269 virtual bool hasIntegratedCPP() const { return false; }
270 virtual bool isLinkJob() const { return true; }
272 virtual void ConstructJob(Compilation &C, const JobAction &JA,
273 const InputInfo &Output,
274 const InputInfoList &Inputs,
275 const llvm::opt::ArgList &TCArgs,
276 const char *LinkingOutput) const;
279 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
281 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
283 virtual bool hasIntegratedCPP() const { return false; }
285 virtual void ConstructJob(Compilation &C, const JobAction &JA,
286 const InputInfo &Output,
287 const InputInfoList &Inputs,
288 const llvm::opt::ArgList &TCArgs,
289 const char *LinkingOutput) const;
292 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
294 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
297 virtual bool hasIntegratedCPP() const { return false; }
298 virtual bool isDsymutilJob() const { return true; }
300 virtual void ConstructJob(Compilation &C, const JobAction &JA,
301 const InputInfo &Output,
302 const InputInfoList &Inputs,
303 const llvm::opt::ArgList &TCArgs,
304 const char *LinkingOutput) const;
307 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
309 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
312 virtual bool hasIntegratedCPP() const { return false; }
314 virtual void ConstructJob(Compilation &C, const JobAction &JA,
315 const InputInfo &Output,
316 const InputInfoList &Inputs,
317 const llvm::opt::ArgList &TCArgs,
318 const char *LinkingOutput) const;
323 /// openbsd -- Directly call GNU Binutils assembler and linker
325 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
327 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
330 virtual bool hasIntegratedCPP() const { return false; }
332 virtual void ConstructJob(Compilation &C, const JobAction &JA,
333 const InputInfo &Output,
334 const InputInfoList &Inputs,
335 const llvm::opt::ArgList &TCArgs,
336 const char *LinkingOutput) const;
338 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
340 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
342 virtual bool hasIntegratedCPP() const { return false; }
343 virtual bool isLinkJob() const { return true; }
345 virtual void ConstructJob(Compilation &C, const JobAction &JA,
346 const InputInfo &Output,
347 const InputInfoList &Inputs,
348 const llvm::opt::ArgList &TCArgs,
349 const char *LinkingOutput) const;
351 } // end namespace openbsd
353 /// bitrig -- Directly call GNU Binutils assembler and linker
355 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
357 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
360 virtual bool hasIntegratedCPP() const { return false; }
362 virtual void ConstructJob(Compilation &C, const JobAction &JA,
363 const InputInfo &Output,
364 const InputInfoList &Inputs,
365 const llvm::opt::ArgList &TCArgs,
366 const char *LinkingOutput) const;
368 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
370 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
372 virtual bool hasIntegratedCPP() const { return false; }
373 virtual bool isLinkJob() const { return true; }
375 virtual void ConstructJob(Compilation &C, const JobAction &JA,
376 const InputInfo &Output,
377 const InputInfoList &Inputs,
378 const llvm::opt::ArgList &TCArgs,
379 const char *LinkingOutput) const;
381 } // end namespace bitrig
383 /// freebsd -- Directly call GNU Binutils assembler and linker
385 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
387 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
390 virtual bool hasIntegratedCPP() const { return false; }
392 virtual void ConstructJob(Compilation &C, const JobAction &JA,
393 const InputInfo &Output,
394 const InputInfoList &Inputs,
395 const llvm::opt::ArgList &TCArgs,
396 const char *LinkingOutput) const;
398 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
400 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
402 virtual bool hasIntegratedCPP() const { return false; }
403 virtual bool isLinkJob() const { return true; }
405 virtual void ConstructJob(Compilation &C, const JobAction &JA,
406 const InputInfo &Output,
407 const InputInfoList &Inputs,
408 const llvm::opt::ArgList &TCArgs,
409 const char *LinkingOutput) const;
411 } // end namespace freebsd
413 /// netbsd -- Directly call GNU Binutils assembler and linker
415 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
418 Assemble(const ToolChain &TC)
419 : Tool("netbsd::Assemble", "assembler", TC) {}
421 virtual bool hasIntegratedCPP() const { return false; }
423 virtual void ConstructJob(Compilation &C, const JobAction &JA,
424 const InputInfo &Output,
425 const InputInfoList &Inputs,
426 const llvm::opt::ArgList &TCArgs,
427 const char *LinkingOutput) const;
429 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
432 Link(const ToolChain &TC)
433 : Tool("netbsd::Link", "linker", TC) {}
435 virtual bool hasIntegratedCPP() const { return false; }
436 virtual bool isLinkJob() const { return true; }
438 virtual void ConstructJob(Compilation &C, const JobAction &JA,
439 const InputInfo &Output,
440 const InputInfoList &Inputs,
441 const llvm::opt::ArgList &TCArgs,
442 const char *LinkingOutput) const;
444 } // end namespace netbsd
446 /// Directly call GNU Binutils' assembler and linker.
448 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
450 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
452 virtual bool hasIntegratedCPP() const { return false; }
454 virtual void ConstructJob(Compilation &C, const JobAction &JA,
455 const InputInfo &Output,
456 const InputInfoList &Inputs,
457 const llvm::opt::ArgList &TCArgs,
458 const char *LinkingOutput) const;
460 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
462 Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
464 virtual bool hasIntegratedCPP() const { return false; }
465 virtual bool isLinkJob() const { return true; }
467 virtual void ConstructJob(Compilation &C, const JobAction &JA,
468 const InputInfo &Output,
469 const InputInfoList &Inputs,
470 const llvm::opt::ArgList &TCArgs,
471 const char *LinkingOutput) const;
474 /// minix -- Directly call GNU Binutils assembler and linker
476 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
478 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
481 virtual bool hasIntegratedCPP() const { return false; }
483 virtual void ConstructJob(Compilation &C, const JobAction &JA,
484 const InputInfo &Output,
485 const InputInfoList &Inputs,
486 const llvm::opt::ArgList &TCArgs,
487 const char *LinkingOutput) const;
489 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
491 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
493 virtual bool hasIntegratedCPP() const { return false; }
494 virtual bool isLinkJob() const { return true; }
496 virtual void ConstructJob(Compilation &C, const JobAction &JA,
497 const InputInfo &Output,
498 const InputInfoList &Inputs,
499 const llvm::opt::ArgList &TCArgs,
500 const char *LinkingOutput) const;
502 } // end namespace minix
504 /// solaris -- Directly call Solaris assembler and linker
506 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
508 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
511 virtual bool hasIntegratedCPP() const { return false; }
513 virtual void ConstructJob(Compilation &C, const JobAction &JA,
514 const InputInfo &Output,
515 const InputInfoList &Inputs,
516 const llvm::opt::ArgList &TCArgs,
517 const char *LinkingOutput) const;
519 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
521 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
523 virtual bool hasIntegratedCPP() const { return false; }
524 virtual bool isLinkJob() const { return true; }
526 virtual void ConstructJob(Compilation &C, const JobAction &JA,
527 const InputInfo &Output,
528 const InputInfoList &Inputs,
529 const llvm::opt::ArgList &TCArgs,
530 const char *LinkingOutput) const;
532 } // end namespace solaris
534 /// auroraux -- Directly call GNU Binutils assembler and linker
536 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
538 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
541 virtual bool hasIntegratedCPP() const { return false; }
543 virtual void ConstructJob(Compilation &C, const JobAction &JA,
544 const InputInfo &Output,
545 const InputInfoList &Inputs,
546 const llvm::opt::ArgList &TCArgs,
547 const char *LinkingOutput) const;
549 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
551 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
553 virtual bool hasIntegratedCPP() const { return false; }
554 virtual bool isLinkJob() const { return true; }
556 virtual void ConstructJob(Compilation &C, const JobAction &JA,
557 const InputInfo &Output,
558 const InputInfoList &Inputs,
559 const llvm::opt::ArgList &TCArgs,
560 const char *LinkingOutput) const;
562 } // end namespace auroraux
564 /// dragonfly -- Directly call GNU Binutils assembler and linker
565 namespace dragonfly {
566 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
568 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
571 virtual bool hasIntegratedCPP() const { return false; }
573 virtual void ConstructJob(Compilation &C, const JobAction &JA,
574 const InputInfo &Output,
575 const InputInfoList &Inputs,
576 const llvm::opt::ArgList &TCArgs,
577 const char *LinkingOutput) const;
579 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
581 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
583 virtual bool hasIntegratedCPP() const { return false; }
584 virtual bool isLinkJob() const { return true; }
586 virtual void ConstructJob(Compilation &C, const JobAction &JA,
587 const InputInfo &Output,
588 const InputInfoList &Inputs,
589 const llvm::opt::ArgList &TCArgs,
590 const char *LinkingOutput) const;
592 } // end namespace dragonfly
594 /// Visual studio tools.
595 namespace visualstudio {
596 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
598 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
600 virtual bool hasIntegratedCPP() const { return false; }
601 virtual bool isLinkJob() const { return true; }
603 virtual void ConstructJob(Compilation &C, const JobAction &JA,
604 const InputInfo &Output,
605 const InputInfoList &Inputs,
606 const llvm::opt::ArgList &TCArgs,
607 const char *LinkingOutput) const;
610 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
612 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
614 virtual bool hasIntegratedAssembler() const { return true; }
615 virtual bool hasIntegratedCPP() const { return true; }
616 virtual bool isLinkJob() const { return false; }
618 virtual void ConstructJob(Compilation &C, const JobAction &JA,
619 const InputInfo &Output,
620 const InputInfoList &Inputs,
621 const llvm::opt::ArgList &TCArgs,
622 const char *LinkingOutput) const;
624 Command *GetCommand(Compilation &C, const JobAction &JA,
625 const InputInfo &Output,
626 const InputInfoList &Inputs,
627 const llvm::opt::ArgList &TCArgs,
628 const char *LinkingOutput) const;
630 } // end namespace visualstudio
633 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
634 // We simply use "clang -cc1" for those actions.
635 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
637 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
640 virtual bool hasIntegratedCPP() const { return false; }
641 virtual void ConstructJob(Compilation &C, const JobAction &JA,
642 const InputInfo &Output,
643 const InputInfoList &Inputs,
644 const llvm::opt::ArgList &TCArgs,
645 const char *LinkingOutput) const;
648 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
650 Link(const ToolChain &TC) : Tool("XCore::Link",
653 virtual bool hasIntegratedCPP() const { return false; }
654 virtual bool isLinkJob() const { return true; }
655 virtual void ConstructJob(Compilation &C, const JobAction &JA,
656 const InputInfo &Output,
657 const InputInfoList &Inputs,
658 const llvm::opt::ArgList &TCArgs,
659 const char *LinkingOutput) const;
661 } // end namespace XCore.
664 } // end namespace toolchains
665 } // end namespace driver
666 } // end namespace clang
668 #endif // CLANG_LIB_DRIVER_TOOLS_H_