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 Compile : public Common {
144 Compile(const ToolChain &TC) : Common("gcc::Compile",
145 "gcc frontend", 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 Link : public Common {
156 Link(const ToolChain &TC) : Common("gcc::Link",
157 "linker (via gcc)", TC) {}
159 virtual bool hasIntegratedCPP() const { return false; }
160 virtual bool isLinkJob() const { return true; }
162 virtual void RenderExtraToolArgs(const JobAction &JA,
163 llvm::opt::ArgStringList &CmdArgs) const;
165 } // end namespace gcc
168 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
169 // We simply use "clang -cc1" for those actions.
170 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
172 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
175 virtual bool hasIntegratedCPP() const { return false; }
177 virtual void RenderExtraToolArgs(const JobAction &JA,
178 llvm::opt::ArgStringList &CmdArgs) const;
179 virtual void ConstructJob(Compilation &C, const JobAction &JA,
180 const InputInfo &Output,
181 const InputInfoList &Inputs,
182 const llvm::opt::ArgList &TCArgs,
183 const char *LinkingOutput) const;
186 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
188 Link(const ToolChain &TC) : Tool("hexagon::Link",
191 virtual bool hasIntegratedCPP() const { return false; }
192 virtual bool isLinkJob() const { return true; }
194 virtual void RenderExtraToolArgs(const JobAction &JA,
195 llvm::opt::ArgStringList &CmdArgs) const;
196 virtual void ConstructJob(Compilation &C, const JobAction &JA,
197 const InputInfo &Output,
198 const InputInfoList &Inputs,
199 const llvm::opt::ArgList &TCArgs,
200 const char *LinkingOutput) const;
202 } // end namespace hexagon.
206 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
208 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
209 virtual void anchor();
211 void AddDarwinArch(const llvm::opt::ArgList &Args,
212 llvm::opt::ArgStringList &CmdArgs) const;
214 const toolchains::Darwin &getDarwinToolChain() const {
215 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
219 DarwinTool(const char *Name, const char *ShortName,
220 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
223 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
225 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
228 virtual bool hasIntegratedCPP() const { return false; }
230 virtual void ConstructJob(Compilation &C, const JobAction &JA,
231 const InputInfo &Output,
232 const InputInfoList &Inputs,
233 const llvm::opt::ArgList &TCArgs,
234 const char *LinkingOutput) const;
237 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
238 bool NeedsTempPath(const InputInfoList &Inputs) const;
239 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
240 llvm::opt::ArgStringList &CmdArgs,
241 const InputInfoList &Inputs) const;
244 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
246 virtual bool hasIntegratedCPP() const { return false; }
247 virtual bool isLinkJob() const { return true; }
249 virtual void ConstructJob(Compilation &C, const JobAction &JA,
250 const InputInfo &Output,
251 const InputInfoList &Inputs,
252 const llvm::opt::ArgList &TCArgs,
253 const char *LinkingOutput) const;
256 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
258 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
260 virtual bool hasIntegratedCPP() const { return false; }
262 virtual void ConstructJob(Compilation &C, const JobAction &JA,
263 const InputInfo &Output,
264 const InputInfoList &Inputs,
265 const llvm::opt::ArgList &TCArgs,
266 const char *LinkingOutput) const;
269 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
271 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
274 virtual bool hasIntegratedCPP() const { return false; }
275 virtual bool isDsymutilJob() const { return true; }
277 virtual void ConstructJob(Compilation &C, const JobAction &JA,
278 const InputInfo &Output,
279 const InputInfoList &Inputs,
280 const llvm::opt::ArgList &TCArgs,
281 const char *LinkingOutput) const;
284 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
286 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
289 virtual bool hasIntegratedCPP() const { return false; }
291 virtual void ConstructJob(Compilation &C, const JobAction &JA,
292 const InputInfo &Output,
293 const InputInfoList &Inputs,
294 const llvm::opt::ArgList &TCArgs,
295 const char *LinkingOutput) const;
300 /// openbsd -- Directly call GNU Binutils assembler and linker
302 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
304 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
307 virtual bool hasIntegratedCPP() const { return false; }
309 virtual void ConstructJob(Compilation &C, const JobAction &JA,
310 const InputInfo &Output,
311 const InputInfoList &Inputs,
312 const llvm::opt::ArgList &TCArgs,
313 const char *LinkingOutput) const;
315 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
317 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
319 virtual bool hasIntegratedCPP() const { return false; }
320 virtual bool isLinkJob() const { return true; }
322 virtual void ConstructJob(Compilation &C, const JobAction &JA,
323 const InputInfo &Output,
324 const InputInfoList &Inputs,
325 const llvm::opt::ArgList &TCArgs,
326 const char *LinkingOutput) const;
328 } // end namespace openbsd
330 /// bitrig -- Directly call GNU Binutils assembler and linker
332 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
334 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
337 virtual bool hasIntegratedCPP() const { return false; }
339 virtual void ConstructJob(Compilation &C, const JobAction &JA,
340 const InputInfo &Output,
341 const InputInfoList &Inputs,
342 const llvm::opt::ArgList &TCArgs,
343 const char *LinkingOutput) const;
345 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
347 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
349 virtual bool hasIntegratedCPP() const { return false; }
350 virtual bool isLinkJob() const { return true; }
352 virtual void ConstructJob(Compilation &C, const JobAction &JA,
353 const InputInfo &Output,
354 const InputInfoList &Inputs,
355 const llvm::opt::ArgList &TCArgs,
356 const char *LinkingOutput) const;
358 } // end namespace bitrig
360 /// freebsd -- Directly call GNU Binutils assembler and linker
362 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
364 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
367 virtual bool hasIntegratedCPP() const { return false; }
369 virtual void ConstructJob(Compilation &C, const JobAction &JA,
370 const InputInfo &Output,
371 const InputInfoList &Inputs,
372 const llvm::opt::ArgList &TCArgs,
373 const char *LinkingOutput) const;
375 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
377 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
379 virtual bool hasIntegratedCPP() const { return false; }
380 virtual bool isLinkJob() const { return true; }
382 virtual void ConstructJob(Compilation &C, const JobAction &JA,
383 const InputInfo &Output,
384 const InputInfoList &Inputs,
385 const llvm::opt::ArgList &TCArgs,
386 const char *LinkingOutput) const;
388 } // end namespace freebsd
390 /// netbsd -- Directly call GNU Binutils assembler and linker
392 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
395 Assemble(const ToolChain &TC)
396 : Tool("netbsd::Assemble", "assembler", TC) {}
398 virtual bool hasIntegratedCPP() const { return false; }
400 virtual void ConstructJob(Compilation &C, const JobAction &JA,
401 const InputInfo &Output,
402 const InputInfoList &Inputs,
403 const llvm::opt::ArgList &TCArgs,
404 const char *LinkingOutput) const;
406 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
409 Link(const ToolChain &TC)
410 : Tool("netbsd::Link", "linker", TC) {}
412 virtual bool hasIntegratedCPP() const { return false; }
413 virtual bool isLinkJob() const { return true; }
415 virtual void ConstructJob(Compilation &C, const JobAction &JA,
416 const InputInfo &Output,
417 const InputInfoList &Inputs,
418 const llvm::opt::ArgList &TCArgs,
419 const char *LinkingOutput) const;
421 } // end namespace netbsd
423 /// Directly call GNU Binutils' assembler and linker.
425 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
427 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
429 virtual bool hasIntegratedCPP() const { return false; }
431 virtual void ConstructJob(Compilation &C, const JobAction &JA,
432 const InputInfo &Output,
433 const InputInfoList &Inputs,
434 const llvm::opt::ArgList &TCArgs,
435 const char *LinkingOutput) const;
437 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
439 Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
441 virtual bool hasIntegratedCPP() const { return false; }
442 virtual bool isLinkJob() const { return true; }
444 virtual void ConstructJob(Compilation &C, const JobAction &JA,
445 const InputInfo &Output,
446 const InputInfoList &Inputs,
447 const llvm::opt::ArgList &TCArgs,
448 const char *LinkingOutput) const;
451 /// minix -- Directly call GNU Binutils assembler and linker
453 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
455 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
458 virtual bool hasIntegratedCPP() const { return false; }
460 virtual void ConstructJob(Compilation &C, const JobAction &JA,
461 const InputInfo &Output,
462 const InputInfoList &Inputs,
463 const llvm::opt::ArgList &TCArgs,
464 const char *LinkingOutput) const;
466 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
468 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
470 virtual bool hasIntegratedCPP() const { return false; }
471 virtual bool isLinkJob() const { return true; }
473 virtual void ConstructJob(Compilation &C, const JobAction &JA,
474 const InputInfo &Output,
475 const InputInfoList &Inputs,
476 const llvm::opt::ArgList &TCArgs,
477 const char *LinkingOutput) const;
479 } // end namespace minix
481 /// solaris -- Directly call Solaris assembler and linker
483 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
485 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
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 llvm::opt::ArgList &TCArgs,
494 const char *LinkingOutput) const;
496 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
498 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
500 virtual bool hasIntegratedCPP() const { return false; }
501 virtual bool isLinkJob() const { return true; }
503 virtual void ConstructJob(Compilation &C, const JobAction &JA,
504 const InputInfo &Output,
505 const InputInfoList &Inputs,
506 const llvm::opt::ArgList &TCArgs,
507 const char *LinkingOutput) const;
509 } // end namespace solaris
511 /// auroraux -- Directly call GNU Binutils assembler and linker
513 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
515 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
518 virtual bool hasIntegratedCPP() const { return false; }
520 virtual void ConstructJob(Compilation &C, const JobAction &JA,
521 const InputInfo &Output,
522 const InputInfoList &Inputs,
523 const llvm::opt::ArgList &TCArgs,
524 const char *LinkingOutput) const;
526 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
528 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
530 virtual bool hasIntegratedCPP() const { return false; }
531 virtual bool isLinkJob() const { return true; }
533 virtual void ConstructJob(Compilation &C, const JobAction &JA,
534 const InputInfo &Output,
535 const InputInfoList &Inputs,
536 const llvm::opt::ArgList &TCArgs,
537 const char *LinkingOutput) const;
539 } // end namespace auroraux
541 /// dragonfly -- Directly call GNU Binutils assembler and linker
542 namespace dragonfly {
543 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
545 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
548 virtual bool hasIntegratedCPP() const { return false; }
550 virtual void ConstructJob(Compilation &C, const JobAction &JA,
551 const InputInfo &Output,
552 const InputInfoList &Inputs,
553 const llvm::opt::ArgList &TCArgs,
554 const char *LinkingOutput) const;
556 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
558 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
560 virtual bool hasIntegratedCPP() const { return false; }
561 virtual bool isLinkJob() const { return true; }
563 virtual void ConstructJob(Compilation &C, const JobAction &JA,
564 const InputInfo &Output,
565 const InputInfoList &Inputs,
566 const llvm::opt::ArgList &TCArgs,
567 const char *LinkingOutput) const;
569 } // end namespace dragonfly
571 /// Visual studio tools.
572 namespace visualstudio {
573 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
575 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
577 virtual bool hasIntegratedCPP() const { return false; }
578 virtual bool isLinkJob() const { return true; }
580 virtual void ConstructJob(Compilation &C, const JobAction &JA,
581 const InputInfo &Output,
582 const InputInfoList &Inputs,
583 const llvm::opt::ArgList &TCArgs,
584 const char *LinkingOutput) const;
587 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
589 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
591 virtual bool hasIntegratedAssembler() const { return true; }
592 virtual bool hasIntegratedCPP() const { return true; }
593 virtual bool isLinkJob() const { return false; }
595 virtual void ConstructJob(Compilation &C, const JobAction &JA,
596 const InputInfo &Output,
597 const InputInfoList &Inputs,
598 const llvm::opt::ArgList &TCArgs,
599 const char *LinkingOutput) const;
601 Command *GetCommand(Compilation &C, const JobAction &JA,
602 const InputInfo &Output,
603 const InputInfoList &Inputs,
604 const llvm::opt::ArgList &TCArgs,
605 const char *LinkingOutput) const;
607 } // end namespace visualstudio
610 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
611 const llvm::Triple &Triple);
614 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
615 // We simply use "clang -cc1" for those actions.
616 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
618 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
621 virtual bool hasIntegratedCPP() const { return false; }
622 virtual void ConstructJob(Compilation &C, const JobAction &JA,
623 const InputInfo &Output,
624 const InputInfoList &Inputs,
625 const llvm::opt::ArgList &TCArgs,
626 const char *LinkingOutput) const;
629 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
631 Link(const ToolChain &TC) : Tool("XCore::Link",
634 virtual bool hasIntegratedCPP() const { return false; }
635 virtual bool isLinkJob() const { return true; }
636 virtual void ConstructJob(Compilation &C, const JobAction &JA,
637 const InputInfo &Output,
638 const InputInfoList &Inputs,
639 const llvm::opt::ArgList &TCArgs,
640 const char *LinkingOutput) const;
642 } // end namespace XCore.
645 } // end namespace toolchains
646 } // end namespace driver
647 } // end namespace clang
649 #endif // CLANG_LIB_DRIVER_TOOLS_H_