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 LLVM_CLANG_LIB_DRIVER_TOOLS_H
11 #define LLVM_CLANG_LIB_DRIVER_TOOLS_H
13 #include "clang/Basic/VersionTuple.h"
14 #include "clang/Driver/Tool.h"
15 #include "clang/Driver/Types.h"
16 #include "clang/Driver/Util.h"
17 #include "clang/Frontend/CodeGenOptions.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/Option/Option.h"
20 #include "llvm/Support/Compiler.h"
29 namespace toolchains {
35 namespace visualstudio {
39 using llvm::opt::ArgStringList;
41 SmallString<128> getCompilerRT(const ToolChain &TC,
42 const llvm::opt::ArgList &Args,
43 StringRef Component, bool Shared = false);
45 /// \brief Clang compiler tool.
46 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
48 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
49 const InputInfo &Input);
50 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
51 const InputInfoList &Inputs);
52 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
53 const InputInfoList &Inputs);
56 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
57 const Driver &D, const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs,
59 const InputInfo &Output,
60 const InputInfoList &Inputs,
61 const ToolChain *AuxToolChain) const;
63 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
64 llvm::opt::ArgStringList &CmdArgs) const;
65 void AddARMTargetArgs(const llvm::Triple &Triple,
66 const llvm::opt::ArgList &Args,
67 llvm::opt::ArgStringList &CmdArgs,
68 bool KernelOrKext) const;
69 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
70 llvm::opt::ArgStringList &CmdArgs) const;
71 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
72 llvm::opt::ArgStringList &CmdArgs) const;
73 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
74 llvm::opt::ArgStringList &CmdArgs) const;
75 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
76 llvm::opt::ArgStringList &CmdArgs) const;
77 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
78 llvm::opt::ArgStringList &CmdArgs) const;
79 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
80 llvm::opt::ArgStringList &CmdArgs) const;
81 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
82 llvm::opt::ArgStringList &CmdArgs) const;
83 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
84 llvm::opt::ArgStringList &CmdArgs) const;
86 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
88 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
89 llvm::opt::ArgStringList &cmdArgs,
90 RewriteKind rewrite) const;
92 void AddClangCLArgs(const llvm::opt::ArgList &Args,
93 llvm::opt::ArgStringList &CmdArgs,
94 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
95 bool *EmitCodeView) const;
97 visualstudio::Compiler *getCLFallback() const;
99 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
102 // CAUTION! The first constructor argument ("clang") is not arbitrary,
103 // as it is for other tools. Some operations on a Tool actually test
104 // whether that tool is Clang based on the Tool's Name as a string.
105 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
107 bool hasGoodDiagnostics() const override { return true; }
108 bool hasIntegratedAssembler() const override { return true; }
109 bool hasIntegratedCPP() const override { return true; }
110 bool canEmitIR() const override { return true; }
112 void ConstructJob(Compilation &C, const JobAction &JA,
113 const InputInfo &Output, const InputInfoList &Inputs,
114 const llvm::opt::ArgList &TCArgs,
115 const char *LinkingOutput) const override;
118 /// \brief Clang integrated assembler tool.
119 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
121 ClangAs(const ToolChain &TC)
122 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
123 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
124 llvm::opt::ArgStringList &CmdArgs) const;
125 bool hasGoodDiagnostics() const override { return true; }
126 bool hasIntegratedAssembler() const override { return false; }
127 bool hasIntegratedCPP() const override { return false; }
129 void ConstructJob(Compilation &C, const JobAction &JA,
130 const InputInfo &Output, const InputInfoList &Inputs,
131 const llvm::opt::ArgList &TCArgs,
132 const char *LinkingOutput) const override;
135 /// \brief Base class for all GNU tools that provide the same behavior when
136 /// it comes to response files support
137 class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
138 virtual void anchor();
141 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
142 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
145 /// gcc - Generic GCC tool implementations.
147 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
149 Common(const char *Name, const char *ShortName, const ToolChain &TC)
150 : GnuTool(Name, ShortName, TC) {}
152 void ConstructJob(Compilation &C, const JobAction &JA,
153 const InputInfo &Output, const InputInfoList &Inputs,
154 const llvm::opt::ArgList &TCArgs,
155 const char *LinkingOutput) const override;
157 /// RenderExtraToolArgs - Render any arguments necessary to force
158 /// the particular tool mode.
159 virtual void RenderExtraToolArgs(const JobAction &JA,
160 llvm::opt::ArgStringList &CmdArgs) const = 0;
163 class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
165 Preprocessor(const ToolChain &TC)
166 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
168 bool hasGoodDiagnostics() const override { return true; }
169 bool hasIntegratedCPP() const override { return false; }
171 void RenderExtraToolArgs(const JobAction &JA,
172 llvm::opt::ArgStringList &CmdArgs) const override;
175 class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
177 Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
179 bool hasGoodDiagnostics() const override { return true; }
180 bool hasIntegratedCPP() const override { return true; }
182 void RenderExtraToolArgs(const JobAction &JA,
183 llvm::opt::ArgStringList &CmdArgs) const override;
186 class LLVM_LIBRARY_VISIBILITY Linker : public Common {
188 Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
190 bool hasIntegratedCPP() const override { return false; }
191 bool isLinkJob() const override { return true; }
193 void RenderExtraToolArgs(const JobAction &JA,
194 llvm::opt::ArgStringList &CmdArgs) const override;
196 } // end namespace gcc
199 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
201 // We simply use "clang -cc1" for those actions.
202 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
204 Assembler(const ToolChain &TC)
205 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
207 bool hasIntegratedCPP() const override { return false; }
209 void RenderExtraToolArgs(const JobAction &JA,
210 llvm::opt::ArgStringList &CmdArgs) const;
211 void ConstructJob(Compilation &C, const JobAction &JA,
212 const InputInfo &Output, const InputInfoList &Inputs,
213 const llvm::opt::ArgList &TCArgs,
214 const char *LinkingOutput) const override;
217 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
219 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
221 bool hasIntegratedCPP() const override { return false; }
222 bool isLinkJob() const override { return true; }
224 virtual void RenderExtraToolArgs(const JobAction &JA,
225 llvm::opt::ArgStringList &CmdArgs) const;
226 void ConstructJob(Compilation &C, const JobAction &JA,
227 const InputInfo &Output, const InputInfoList &Inputs,
228 const llvm::opt::ArgList &TCArgs,
229 const char *LinkingOutput) const override;
231 } // end namespace hexagon.
235 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
237 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "lld", TC) {}
238 bool isLinkJob() const override { return true; }
239 bool hasIntegratedCPP() const override { return false; }
240 void ConstructJob(Compilation &C, const JobAction &JA,
241 const InputInfo &Output, const InputInfoList &Inputs,
242 const llvm::opt::ArgList &TCArgs,
243 const char *LinkingOutput) const override;
246 } // end namespace amdgpu
250 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
252 explicit Linker(const ToolChain &TC);
253 bool isLinkJob() const override;
254 bool hasIntegratedCPP() const override;
255 void ConstructJob(Compilation &C, const JobAction &JA,
256 const InputInfo &Output, const InputInfoList &Inputs,
257 const llvm::opt::ArgList &TCArgs,
258 const char *LinkingOutput) const override;
261 } // end namespace wasm
264 std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
265 const llvm::Triple &Triple);
266 const std::string getARMArch(StringRef Arch,
267 const llvm::Triple &Triple);
268 StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
269 StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
270 const llvm::Triple &Triple);
272 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
273 const llvm::Triple &Triple);
274 } // end namespace arm
277 typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
279 enum class FloatABI {
285 NanEncoding getSupportedNanEncoding(StringRef &CPU);
286 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
287 const llvm::Triple &Triple, StringRef &CPUName,
289 std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args,
290 const llvm::Triple &Triple);
291 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
292 bool isUCLibc(const llvm::opt::ArgList &Args);
293 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
294 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
295 StringRef ABIName, mips::FloatABI FloatABI);
296 bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
297 StringRef CPUName, StringRef ABIName,
298 mips::FloatABI FloatABI);
299 } // end namespace mips
302 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
303 } // end namespace ppc
305 /// cloudabi -- Directly call GNU Binutils linker
307 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
309 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
311 bool hasIntegratedCPP() const override { return false; }
312 bool isLinkJob() const override { return true; }
314 void ConstructJob(Compilation &C, const JobAction &JA,
315 const InputInfo &Output, const InputInfoList &Inputs,
316 const llvm::opt::ArgList &TCArgs,
317 const char *LinkingOutput) const override;
319 } // end namespace cloudabi
322 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
323 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
325 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
326 virtual void anchor();
329 void AddMachOArch(const llvm::opt::ArgList &Args,
330 llvm::opt::ArgStringList &CmdArgs) const;
332 const toolchains::MachO &getMachOToolChain() const {
333 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
338 const char *Name, const char *ShortName, const ToolChain &TC,
339 ResponseFileSupport ResponseSupport = RF_None,
340 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
341 const char *ResponseFlag = "@")
342 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
346 class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
348 Assembler(const ToolChain &TC)
349 : MachOTool("darwin::Assembler", "assembler", TC) {}
351 bool hasIntegratedCPP() const override { return false; }
353 void ConstructJob(Compilation &C, const JobAction &JA,
354 const InputInfo &Output, const InputInfoList &Inputs,
355 const llvm::opt::ArgList &TCArgs,
356 const char *LinkingOutput) const override;
359 class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
360 bool NeedsTempPath(const InputInfoList &Inputs) const;
361 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
362 llvm::opt::ArgStringList &CmdArgs,
363 const InputInfoList &Inputs) const;
366 Linker(const ToolChain &TC)
367 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
368 llvm::sys::WEM_UTF8, "-filelist") {}
370 bool hasIntegratedCPP() const override { return false; }
371 bool isLinkJob() const override { return true; }
373 void ConstructJob(Compilation &C, const JobAction &JA,
374 const InputInfo &Output, const InputInfoList &Inputs,
375 const llvm::opt::ArgList &TCArgs,
376 const char *LinkingOutput) const override;
379 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
381 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
383 bool hasIntegratedCPP() const override { return false; }
385 void ConstructJob(Compilation &C, const JobAction &JA,
386 const InputInfo &Output, const InputInfoList &Inputs,
387 const llvm::opt::ArgList &TCArgs,
388 const char *LinkingOutput) const override;
391 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
393 Dsymutil(const ToolChain &TC)
394 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
396 bool hasIntegratedCPP() const override { return false; }
397 bool isDsymutilJob() const override { return true; }
399 void ConstructJob(Compilation &C, const JobAction &JA,
400 const InputInfo &Output, const InputInfoList &Inputs,
401 const llvm::opt::ArgList &TCArgs,
402 const char *LinkingOutput) const override;
405 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
407 VerifyDebug(const ToolChain &TC)
408 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
410 bool hasIntegratedCPP() const override { return false; }
412 void ConstructJob(Compilation &C, const JobAction &JA,
413 const InputInfo &Output, const InputInfoList &Inputs,
414 const llvm::opt::ArgList &TCArgs,
415 const char *LinkingOutput) const override;
417 } // end namespace darwin
419 /// openbsd -- Directly call GNU Binutils assembler and linker
421 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
423 Assembler(const ToolChain &TC)
424 : GnuTool("openbsd::Assembler", "assembler", TC) {}
426 bool hasIntegratedCPP() const override { return false; }
428 void ConstructJob(Compilation &C, const JobAction &JA,
429 const InputInfo &Output, const InputInfoList &Inputs,
430 const llvm::opt::ArgList &TCArgs,
431 const char *LinkingOutput) const override;
434 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
436 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
438 bool hasIntegratedCPP() const override { return false; }
439 bool isLinkJob() const override { return true; }
441 void ConstructJob(Compilation &C, const JobAction &JA,
442 const InputInfo &Output, const InputInfoList &Inputs,
443 const llvm::opt::ArgList &TCArgs,
444 const char *LinkingOutput) const override;
446 } // end namespace openbsd
448 /// bitrig -- Directly call GNU Binutils assembler and linker
450 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
452 Assembler(const ToolChain &TC)
453 : GnuTool("bitrig::Assembler", "assembler", TC) {}
455 bool hasIntegratedCPP() const override { return false; }
457 void ConstructJob(Compilation &C, const JobAction &JA,
458 const InputInfo &Output, const InputInfoList &Inputs,
459 const llvm::opt::ArgList &TCArgs,
460 const char *LinkingOutput) const override;
463 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
465 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
467 bool hasIntegratedCPP() const override { return false; }
468 bool isLinkJob() const override { return true; }
470 void ConstructJob(Compilation &C, const JobAction &JA,
471 const InputInfo &Output, const InputInfoList &Inputs,
472 const llvm::opt::ArgList &TCArgs,
473 const char *LinkingOutput) const override;
475 } // end namespace bitrig
477 /// freebsd -- Directly call GNU Binutils assembler and linker
479 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
481 Assembler(const ToolChain &TC)
482 : GnuTool("freebsd::Assembler", "assembler", TC) {}
484 bool hasIntegratedCPP() const override { return false; }
486 void ConstructJob(Compilation &C, const JobAction &JA,
487 const InputInfo &Output, const InputInfoList &Inputs,
488 const llvm::opt::ArgList &TCArgs,
489 const char *LinkingOutput) const override;
492 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
494 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
496 bool hasIntegratedCPP() const override { return false; }
497 bool isLinkJob() const override { return true; }
499 void ConstructJob(Compilation &C, const JobAction &JA,
500 const InputInfo &Output, const InputInfoList &Inputs,
501 const llvm::opt::ArgList &TCArgs,
502 const char *LinkingOutput) const override;
504 } // end namespace freebsd
506 /// netbsd -- Directly call GNU Binutils assembler and linker
508 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
510 Assembler(const ToolChain &TC)
511 : GnuTool("netbsd::Assembler", "assembler", TC) {}
513 bool hasIntegratedCPP() const override { return false; }
515 void ConstructJob(Compilation &C, const JobAction &JA,
516 const InputInfo &Output, const InputInfoList &Inputs,
517 const llvm::opt::ArgList &TCArgs,
518 const char *LinkingOutput) const override;
521 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
523 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
525 bool hasIntegratedCPP() const override { return false; }
526 bool isLinkJob() const override { return true; }
528 void ConstructJob(Compilation &C, const JobAction &JA,
529 const InputInfo &Output, const InputInfoList &Inputs,
530 const llvm::opt::ArgList &TCArgs,
531 const char *LinkingOutput) const override;
533 } // end namespace netbsd
535 /// Directly call GNU Binutils' assembler and linker.
537 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
539 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
541 bool hasIntegratedCPP() const override { return false; }
543 void ConstructJob(Compilation &C, const JobAction &JA,
544 const InputInfo &Output, const InputInfoList &Inputs,
545 const llvm::opt::ArgList &TCArgs,
546 const char *LinkingOutput) const override;
549 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
551 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
553 bool hasIntegratedCPP() const override { return false; }
554 bool isLinkJob() const override { return true; }
556 void ConstructJob(Compilation &C, const JobAction &JA,
557 const InputInfo &Output, const InputInfoList &Inputs,
558 const llvm::opt::ArgList &TCArgs,
559 const char *LinkingOutput) const override;
561 } // end namespace gnutools
563 namespace nacltools {
564 class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
566 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
568 void ConstructJob(Compilation &C, const JobAction &JA,
569 const InputInfo &Output, const InputInfoList &Inputs,
570 const llvm::opt::ArgList &TCArgs,
571 const char *LinkingOutput) const override;
574 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
576 Linker(const ToolChain &TC) : GnuTool("NaCl::Linker", "linker", TC) {}
578 bool hasIntegratedCPP() const override { return false; }
579 bool isLinkJob() const override { return true; }
581 void ConstructJob(Compilation &C, const JobAction &JA,
582 const InputInfo &Output, const InputInfoList &Inputs,
583 const llvm::opt::ArgList &TCArgs,
584 const char *LinkingOutput) const override;
586 } // end namespace nacltools
588 /// minix -- Directly call GNU Binutils assembler and linker
590 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
592 Assembler(const ToolChain &TC)
593 : GnuTool("minix::Assembler", "assembler", TC) {}
595 bool hasIntegratedCPP() const override { return false; }
597 void ConstructJob(Compilation &C, const JobAction &JA,
598 const InputInfo &Output, const InputInfoList &Inputs,
599 const llvm::opt::ArgList &TCArgs,
600 const char *LinkingOutput) const override;
603 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
605 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
607 bool hasIntegratedCPP() const override { return false; }
608 bool isLinkJob() const override { return true; }
610 void ConstructJob(Compilation &C, const JobAction &JA,
611 const InputInfo &Output, const InputInfoList &Inputs,
612 const llvm::opt::ArgList &TCArgs,
613 const char *LinkingOutput) const override;
615 } // end namespace minix
617 /// solaris -- Directly call Solaris assembler and linker
619 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
621 Assembler(const ToolChain &TC)
622 : Tool("solaris::Assembler", "assembler", TC) {}
624 bool hasIntegratedCPP() const override { return false; }
626 void ConstructJob(Compilation &C, const JobAction &JA,
627 const InputInfo &Output, const InputInfoList &Inputs,
628 const llvm::opt::ArgList &TCArgs,
629 const char *LinkingOutput) const override;
632 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
634 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
636 bool hasIntegratedCPP() const override { return false; }
637 bool isLinkJob() const override { return true; }
639 void ConstructJob(Compilation &C, const JobAction &JA,
640 const InputInfo &Output, const InputInfoList &Inputs,
641 const llvm::opt::ArgList &TCArgs,
642 const char *LinkingOutput) const override;
644 } // end namespace solaris
646 /// dragonfly -- Directly call GNU Binutils assembler and linker
647 namespace dragonfly {
648 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
650 Assembler(const ToolChain &TC)
651 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
653 bool hasIntegratedCPP() const override { return false; }
655 void ConstructJob(Compilation &C, const JobAction &JA,
656 const InputInfo &Output, const InputInfoList &Inputs,
657 const llvm::opt::ArgList &TCArgs,
658 const char *LinkingOutput) const override;
661 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
663 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
665 bool hasIntegratedCPP() const override { return false; }
666 bool isLinkJob() const override { return true; }
668 void ConstructJob(Compilation &C, const JobAction &JA,
669 const InputInfo &Output, const InputInfoList &Inputs,
670 const llvm::opt::ArgList &TCArgs,
671 const char *LinkingOutput) const override;
673 } // end namespace dragonfly
675 /// Visual studio tools.
676 namespace visualstudio {
677 VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
678 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
680 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
682 Linker(const ToolChain &TC)
683 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
684 llvm::sys::WEM_UTF16) {}
686 bool hasIntegratedCPP() const override { return false; }
687 bool isLinkJob() const override { return true; }
689 void ConstructJob(Compilation &C, const JobAction &JA,
690 const InputInfo &Output, const InputInfoList &Inputs,
691 const llvm::opt::ArgList &TCArgs,
692 const char *LinkingOutput) const override;
695 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
697 Compiler(const ToolChain &TC)
698 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
699 llvm::sys::WEM_UTF16) {}
701 bool hasIntegratedAssembler() const override { return true; }
702 bool hasIntegratedCPP() const override { return true; }
703 bool isLinkJob() const override { return false; }
705 void ConstructJob(Compilation &C, const JobAction &JA,
706 const InputInfo &Output, const InputInfoList &Inputs,
707 const llvm::opt::ArgList &TCArgs,
708 const char *LinkingOutput) const override;
710 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
711 const InputInfo &Output,
712 const InputInfoList &Inputs,
713 const llvm::opt::ArgList &TCArgs,
714 const char *LinkingOutput) const;
716 } // end namespace visualstudio
718 /// MinGW -- Directly call GNU Binutils assembler and linker
720 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
722 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
724 bool hasIntegratedCPP() const override { return false; }
726 void ConstructJob(Compilation &C, const JobAction &JA,
727 const InputInfo &Output, const InputInfoList &Inputs,
728 const llvm::opt::ArgList &TCArgs,
729 const char *LinkingOutput) const override;
732 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
734 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
736 bool hasIntegratedCPP() const override { return false; }
737 bool isLinkJob() const override { return true; }
739 void ConstructJob(Compilation &C, const JobAction &JA,
740 const InputInfo &Output, const InputInfoList &Inputs,
741 const llvm::opt::ArgList &TCArgs,
742 const char *LinkingOutput) const override;
745 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
747 } // end namespace MinGW
750 enum class FloatABI {
757 FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
758 } // end namespace arm
761 enum class FloatABI {
767 FloatABI getPPCFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
768 } // end namespace ppc
771 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
773 // We simply use "clang -cc1" for those actions.
774 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
776 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
778 bool hasIntegratedCPP() const override { return false; }
779 void ConstructJob(Compilation &C, const JobAction &JA,
780 const InputInfo &Output, const InputInfoList &Inputs,
781 const llvm::opt::ArgList &TCArgs,
782 const char *LinkingOutput) const override;
785 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
787 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
789 bool hasIntegratedCPP() const override { return false; }
790 bool isLinkJob() const override { return true; }
791 void ConstructJob(Compilation &C, const JobAction &JA,
792 const InputInfo &Output, const InputInfoList &Inputs,
793 const llvm::opt::ArgList &TCArgs,
794 const char *LinkingOutput) const override;
796 } // end namespace XCore.
798 namespace CrossWindows {
799 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
801 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
803 bool hasIntegratedCPP() const override { return false; }
805 void ConstructJob(Compilation &C, const JobAction &JA,
806 const InputInfo &Output, const InputInfoList &Inputs,
807 const llvm::opt::ArgList &TCArgs,
808 const char *LinkingOutput) const override;
811 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
813 Linker(const ToolChain &TC)
814 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
816 bool hasIntegratedCPP() const override { return false; }
817 bool isLinkJob() const override { return true; }
819 void ConstructJob(Compilation &C, const JobAction &JA,
820 const InputInfo &Output, const InputInfoList &Inputs,
821 const llvm::opt::ArgList &TCArgs,
822 const char *LinkingOutput) const override;
824 } // end namespace CrossWindows
826 /// SHAVE tools -- Directly call moviCompile and moviAsm
828 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
830 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
832 bool hasIntegratedCPP() const override { return true; }
834 void ConstructJob(Compilation &C, const JobAction &JA,
835 const InputInfo &Output, const InputInfoList &Inputs,
836 const llvm::opt::ArgList &TCArgs,
837 const char *LinkingOutput) const override;
840 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
842 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
844 bool hasIntegratedCPP() const override { return false; } // not sure.
846 void ConstructJob(Compilation &C, const JobAction &JA,
847 const InputInfo &Output, const InputInfoList &Inputs,
848 const llvm::opt::ArgList &TCArgs,
849 const char *LinkingOutput) const override;
851 } // end namespace SHAVE
853 /// The Myriad toolchain uses tools that are in two different namespaces.
854 /// The Compiler and Assembler as defined above are in the SHAVE namespace,
855 /// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
856 /// is in the Myriad namespace.
858 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
860 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
861 bool hasIntegratedCPP() const override { return false; }
862 bool isLinkJob() const override { return true; }
863 void ConstructJob(Compilation &C, const JobAction &JA,
864 const InputInfo &Output, const InputInfoList &Inputs,
865 const llvm::opt::ArgList &TCArgs,
866 const char *LinkingOutput) const override;
868 } // end namespace Myriad
871 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
873 Assemble(const ToolChain &TC)
874 : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
876 bool hasIntegratedCPP() const override { return false; }
878 void ConstructJob(Compilation &C, const JobAction &JA,
879 const InputInfo &Output,
880 const InputInfoList &Inputs,
881 const llvm::opt::ArgList &TCArgs,
882 const char *LinkingOutput) const override;
885 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
887 Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
889 bool hasIntegratedCPP() const override { return false; }
890 bool isLinkJob() const override { return true; }
892 void ConstructJob(Compilation &C, const JobAction &JA,
893 const InputInfo &Output,
894 const InputInfoList &Inputs,
895 const llvm::opt::ArgList &TCArgs,
896 const char *LinkingOutput) const override;
898 } // end namespace PS4cpu
900 } // end namespace tools
901 } // end namespace driver
902 } // end namespace clang
904 #endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H