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 Link : public Common {
168 Link(const ToolChain &TC) : Common("gcc::Link",
169 "linker (via gcc)", TC) {}
171 virtual bool hasIntegratedCPP() const { return false; }
172 virtual bool isLinkJob() const { return true; }
174 virtual void RenderExtraToolArgs(const JobAction &JA,
175 llvm::opt::ArgStringList &CmdArgs) const;
177 } // end namespace gcc
180 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
181 // We simply use "clang -cc1" for those actions.
182 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
184 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
187 virtual bool hasIntegratedCPP() const { return false; }
189 virtual void RenderExtraToolArgs(const JobAction &JA,
190 llvm::opt::ArgStringList &CmdArgs) const;
191 virtual void ConstructJob(Compilation &C, const JobAction &JA,
192 const InputInfo &Output,
193 const InputInfoList &Inputs,
194 const llvm::opt::ArgList &TCArgs,
195 const char *LinkingOutput) const;
198 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
200 Link(const ToolChain &TC) : Tool("hexagon::Link",
203 virtual bool hasIntegratedCPP() const { return false; }
204 virtual bool isLinkJob() const { return true; }
206 virtual void RenderExtraToolArgs(const JobAction &JA,
207 llvm::opt::ArgStringList &CmdArgs) const;
208 virtual void ConstructJob(Compilation &C, const JobAction &JA,
209 const InputInfo &Output,
210 const InputInfoList &Inputs,
211 const llvm::opt::ArgList &TCArgs,
212 const char *LinkingOutput) const;
214 } // end namespace hexagon.
218 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
220 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
221 virtual void anchor();
223 void AddDarwinArch(const llvm::opt::ArgList &Args,
224 llvm::opt::ArgStringList &CmdArgs) const;
226 const toolchains::Darwin &getDarwinToolChain() const {
227 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
231 DarwinTool(const char *Name, const char *ShortName,
232 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
235 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
237 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
240 virtual bool hasIntegratedCPP() const { return false; }
242 virtual void ConstructJob(Compilation &C, const JobAction &JA,
243 const InputInfo &Output,
244 const InputInfoList &Inputs,
245 const llvm::opt::ArgList &TCArgs,
246 const char *LinkingOutput) const;
249 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
250 bool NeedsTempPath(const InputInfoList &Inputs) const;
251 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
252 llvm::opt::ArgStringList &CmdArgs,
253 const InputInfoList &Inputs) const;
256 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
258 virtual bool hasIntegratedCPP() const { return false; }
259 virtual bool isLinkJob() const { return true; }
261 virtual void ConstructJob(Compilation &C, const JobAction &JA,
262 const InputInfo &Output,
263 const InputInfoList &Inputs,
264 const llvm::opt::ArgList &TCArgs,
265 const char *LinkingOutput) const;
268 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
270 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
272 virtual bool hasIntegratedCPP() const { return false; }
274 virtual void ConstructJob(Compilation &C, const JobAction &JA,
275 const InputInfo &Output,
276 const InputInfoList &Inputs,
277 const llvm::opt::ArgList &TCArgs,
278 const char *LinkingOutput) const;
281 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
283 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
286 virtual bool hasIntegratedCPP() const { return false; }
287 virtual bool isDsymutilJob() const { return true; }
289 virtual void ConstructJob(Compilation &C, const JobAction &JA,
290 const InputInfo &Output,
291 const InputInfoList &Inputs,
292 const llvm::opt::ArgList &TCArgs,
293 const char *LinkingOutput) const;
296 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
298 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
301 virtual bool hasIntegratedCPP() const { return false; }
303 virtual void ConstructJob(Compilation &C, const JobAction &JA,
304 const InputInfo &Output,
305 const InputInfoList &Inputs,
306 const llvm::opt::ArgList &TCArgs,
307 const char *LinkingOutput) const;
312 /// openbsd -- Directly call GNU Binutils assembler and linker
314 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
316 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
319 virtual bool hasIntegratedCPP() const { return false; }
321 virtual void ConstructJob(Compilation &C, const JobAction &JA,
322 const InputInfo &Output,
323 const InputInfoList &Inputs,
324 const llvm::opt::ArgList &TCArgs,
325 const char *LinkingOutput) const;
327 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
329 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
331 virtual bool hasIntegratedCPP() const { return false; }
332 virtual bool isLinkJob() const { return true; }
334 virtual void ConstructJob(Compilation &C, const JobAction &JA,
335 const InputInfo &Output,
336 const InputInfoList &Inputs,
337 const llvm::opt::ArgList &TCArgs,
338 const char *LinkingOutput) const;
340 } // end namespace openbsd
342 /// bitrig -- Directly call GNU Binutils assembler and linker
344 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
346 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
349 virtual bool hasIntegratedCPP() const { return false; }
351 virtual void ConstructJob(Compilation &C, const JobAction &JA,
352 const InputInfo &Output,
353 const InputInfoList &Inputs,
354 const llvm::opt::ArgList &TCArgs,
355 const char *LinkingOutput) const;
357 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
359 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
361 virtual bool hasIntegratedCPP() const { return false; }
362 virtual bool isLinkJob() const { return true; }
364 virtual void ConstructJob(Compilation &C, const JobAction &JA,
365 const InputInfo &Output,
366 const InputInfoList &Inputs,
367 const llvm::opt::ArgList &TCArgs,
368 const char *LinkingOutput) const;
370 } // end namespace bitrig
372 /// freebsd -- Directly call GNU Binutils assembler and linker
374 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
376 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
379 virtual bool hasIntegratedCPP() const { return false; }
381 virtual void ConstructJob(Compilation &C, const JobAction &JA,
382 const InputInfo &Output,
383 const InputInfoList &Inputs,
384 const llvm::opt::ArgList &TCArgs,
385 const char *LinkingOutput) const;
387 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
389 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
391 virtual bool hasIntegratedCPP() const { return false; }
392 virtual bool isLinkJob() const { return true; }
394 virtual void ConstructJob(Compilation &C, const JobAction &JA,
395 const InputInfo &Output,
396 const InputInfoList &Inputs,
397 const llvm::opt::ArgList &TCArgs,
398 const char *LinkingOutput) const;
400 } // end namespace freebsd
402 /// netbsd -- Directly call GNU Binutils assembler and linker
404 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
407 Assemble(const ToolChain &TC)
408 : Tool("netbsd::Assemble", "assembler", TC) {}
410 virtual bool hasIntegratedCPP() const { return false; }
412 virtual void ConstructJob(Compilation &C, const JobAction &JA,
413 const InputInfo &Output,
414 const InputInfoList &Inputs,
415 const llvm::opt::ArgList &TCArgs,
416 const char *LinkingOutput) const;
418 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
421 Link(const ToolChain &TC)
422 : Tool("netbsd::Link", "linker", TC) {}
424 virtual bool hasIntegratedCPP() const { return false; }
425 virtual bool isLinkJob() const { return true; }
427 virtual void ConstructJob(Compilation &C, const JobAction &JA,
428 const InputInfo &Output,
429 const InputInfoList &Inputs,
430 const llvm::opt::ArgList &TCArgs,
431 const char *LinkingOutput) const;
433 } // end namespace netbsd
435 /// Directly call GNU Binutils' assembler and linker.
437 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
439 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
441 virtual bool hasIntegratedCPP() const { return false; }
443 virtual void ConstructJob(Compilation &C, const JobAction &JA,
444 const InputInfo &Output,
445 const InputInfoList &Inputs,
446 const llvm::opt::ArgList &TCArgs,
447 const char *LinkingOutput) const;
449 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
451 Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
453 virtual bool hasIntegratedCPP() const { return false; }
454 virtual bool isLinkJob() const { return true; }
456 virtual void ConstructJob(Compilation &C, const JobAction &JA,
457 const InputInfo &Output,
458 const InputInfoList &Inputs,
459 const llvm::opt::ArgList &TCArgs,
460 const char *LinkingOutput) const;
463 /// minix -- Directly call GNU Binutils assembler and linker
465 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
467 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
470 virtual bool hasIntegratedCPP() const { return false; }
472 virtual void ConstructJob(Compilation &C, const JobAction &JA,
473 const InputInfo &Output,
474 const InputInfoList &Inputs,
475 const llvm::opt::ArgList &TCArgs,
476 const char *LinkingOutput) const;
478 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
480 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
482 virtual bool hasIntegratedCPP() const { return false; }
483 virtual bool isLinkJob() const { return true; }
485 virtual void ConstructJob(Compilation &C, const JobAction &JA,
486 const InputInfo &Output,
487 const InputInfoList &Inputs,
488 const llvm::opt::ArgList &TCArgs,
489 const char *LinkingOutput) const;
491 } // end namespace minix
493 /// solaris -- Directly call Solaris assembler and linker
495 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
497 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
500 virtual bool hasIntegratedCPP() const { return false; }
502 virtual void ConstructJob(Compilation &C, const JobAction &JA,
503 const InputInfo &Output,
504 const InputInfoList &Inputs,
505 const llvm::opt::ArgList &TCArgs,
506 const char *LinkingOutput) const;
508 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
510 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
512 virtual bool hasIntegratedCPP() const { return false; }
513 virtual bool isLinkJob() const { return true; }
515 virtual void ConstructJob(Compilation &C, const JobAction &JA,
516 const InputInfo &Output,
517 const InputInfoList &Inputs,
518 const llvm::opt::ArgList &TCArgs,
519 const char *LinkingOutput) const;
521 } // end namespace solaris
523 /// auroraux -- Directly call GNU Binutils assembler and linker
525 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
527 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
530 virtual bool hasIntegratedCPP() const { return false; }
532 virtual void ConstructJob(Compilation &C, const JobAction &JA,
533 const InputInfo &Output,
534 const InputInfoList &Inputs,
535 const llvm::opt::ArgList &TCArgs,
536 const char *LinkingOutput) const;
538 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
540 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
542 virtual bool hasIntegratedCPP() const { return false; }
543 virtual bool isLinkJob() const { return true; }
545 virtual void ConstructJob(Compilation &C, const JobAction &JA,
546 const InputInfo &Output,
547 const InputInfoList &Inputs,
548 const llvm::opt::ArgList &TCArgs,
549 const char *LinkingOutput) const;
551 } // end namespace auroraux
553 /// dragonfly -- Directly call GNU Binutils assembler and linker
554 namespace dragonfly {
555 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
557 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
560 virtual bool hasIntegratedCPP() const { return false; }
562 virtual void ConstructJob(Compilation &C, const JobAction &JA,
563 const InputInfo &Output,
564 const InputInfoList &Inputs,
565 const llvm::opt::ArgList &TCArgs,
566 const char *LinkingOutput) const;
568 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
570 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
572 virtual bool hasIntegratedCPP() const { return false; }
573 virtual bool isLinkJob() const { return true; }
575 virtual void ConstructJob(Compilation &C, const JobAction &JA,
576 const InputInfo &Output,
577 const InputInfoList &Inputs,
578 const llvm::opt::ArgList &TCArgs,
579 const char *LinkingOutput) const;
581 } // end namespace dragonfly
583 /// Visual studio tools.
584 namespace visualstudio {
585 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
587 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
589 virtual bool hasIntegratedCPP() const { return false; }
590 virtual bool isLinkJob() const { return true; }
592 virtual void ConstructJob(Compilation &C, const JobAction &JA,
593 const InputInfo &Output,
594 const InputInfoList &Inputs,
595 const llvm::opt::ArgList &TCArgs,
596 const char *LinkingOutput) const;
599 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
601 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
603 virtual bool hasIntegratedAssembler() const { return true; }
604 virtual bool hasIntegratedCPP() const { return true; }
605 virtual bool isLinkJob() const { return false; }
607 virtual void ConstructJob(Compilation &C, const JobAction &JA,
608 const InputInfo &Output,
609 const InputInfoList &Inputs,
610 const llvm::opt::ArgList &TCArgs,
611 const char *LinkingOutput) const;
613 Command *GetCommand(Compilation &C, const JobAction &JA,
614 const InputInfo &Output,
615 const InputInfoList &Inputs,
616 const llvm::opt::ArgList &TCArgs,
617 const char *LinkingOutput) const;
619 } // end namespace visualstudio
622 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
623 // We simply use "clang -cc1" for those actions.
624 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
626 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
629 virtual bool hasIntegratedCPP() const { return false; }
630 virtual void ConstructJob(Compilation &C, const JobAction &JA,
631 const InputInfo &Output,
632 const InputInfoList &Inputs,
633 const llvm::opt::ArgList &TCArgs,
634 const char *LinkingOutput) const;
637 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
639 Link(const ToolChain &TC) : Tool("XCore::Link",
642 virtual bool hasIntegratedCPP() const { return false; }
643 virtual bool isLinkJob() const { return true; }
644 virtual void ConstructJob(Compilation &C, const JobAction &JA,
645 const InputInfo &Output,
646 const InputInfoList &Inputs,
647 const llvm::opt::ArgList &TCArgs,
648 const char *LinkingOutput) const;
650 } // end namespace XCore.
653 } // end namespace toolchains
654 } // end namespace driver
655 } // end namespace clang
657 #endif // CLANG_LIB_DRIVER_TOOLS_H_