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) const;
62 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
63 llvm::opt::ArgStringList &CmdArgs) const;
64 void AddARMTargetArgs(const llvm::Triple &Triple,
65 const llvm::opt::ArgList &Args,
66 llvm::opt::ArgStringList &CmdArgs,
67 bool KernelOrKext) const;
68 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
69 llvm::opt::ArgStringList &CmdArgs) const;
70 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
71 llvm::opt::ArgStringList &CmdArgs) const;
72 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
73 llvm::opt::ArgStringList &CmdArgs) const;
74 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
75 llvm::opt::ArgStringList &CmdArgs) const;
76 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
77 llvm::opt::ArgStringList &CmdArgs) const;
78 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
79 llvm::opt::ArgStringList &CmdArgs) const;
80 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
81 llvm::opt::ArgStringList &CmdArgs) const;
82 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
83 llvm::opt::ArgStringList &CmdArgs) const;
85 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
87 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
88 llvm::opt::ArgStringList &cmdArgs,
89 RewriteKind rewrite) const;
91 void AddClangCLArgs(const llvm::opt::ArgList &Args,
92 llvm::opt::ArgStringList &CmdArgs,
93 enum CodeGenOptions::DebugInfoKind *DebugInfoKind,
94 bool *EmitCodeView) const;
96 visualstudio::Compiler *getCLFallback() const;
98 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
101 // CAUTION! The first constructor argument ("clang") is not arbitrary,
102 // as it is for other tools. Some operations on a Tool actually test
103 // whether that tool is Clang based on the Tool's Name as a string.
104 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
106 bool hasGoodDiagnostics() const override { return true; }
107 bool hasIntegratedAssembler() const override { return true; }
108 bool hasIntegratedCPP() const override { return true; }
109 bool canEmitIR() const override { return true; }
111 void ConstructJob(Compilation &C, const JobAction &JA,
112 const InputInfo &Output, const InputInfoList &Inputs,
113 const llvm::opt::ArgList &TCArgs,
114 const char *LinkingOutput) const override;
117 /// \brief Clang integrated assembler tool.
118 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
120 ClangAs(const ToolChain &TC)
121 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
122 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
123 llvm::opt::ArgStringList &CmdArgs) const;
124 bool hasGoodDiagnostics() const override { return true; }
125 bool hasIntegratedAssembler() const override { return false; }
126 bool hasIntegratedCPP() const override { return false; }
128 void ConstructJob(Compilation &C, const JobAction &JA,
129 const InputInfo &Output, const InputInfoList &Inputs,
130 const llvm::opt::ArgList &TCArgs,
131 const char *LinkingOutput) const override;
134 /// \brief Base class for all GNU tools that provide the same behavior when
135 /// it comes to response files support
136 class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
137 virtual void anchor();
140 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
141 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
144 /// gcc - Generic GCC tool implementations.
146 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
148 Common(const char *Name, const char *ShortName, const ToolChain &TC)
149 : GnuTool(Name, ShortName, TC) {}
151 void ConstructJob(Compilation &C, const JobAction &JA,
152 const InputInfo &Output, const InputInfoList &Inputs,
153 const llvm::opt::ArgList &TCArgs,
154 const char *LinkingOutput) const override;
156 /// RenderExtraToolArgs - Render any arguments necessary to force
157 /// the particular tool mode.
158 virtual void RenderExtraToolArgs(const JobAction &JA,
159 llvm::opt::ArgStringList &CmdArgs) const = 0;
162 class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
164 Preprocessor(const ToolChain &TC)
165 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
167 bool hasGoodDiagnostics() const override { return true; }
168 bool hasIntegratedCPP() const override { return false; }
170 void RenderExtraToolArgs(const JobAction &JA,
171 llvm::opt::ArgStringList &CmdArgs) const override;
174 class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
176 Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
178 bool hasGoodDiagnostics() const override { return true; }
179 bool hasIntegratedCPP() const override { return true; }
181 void RenderExtraToolArgs(const JobAction &JA,
182 llvm::opt::ArgStringList &CmdArgs) const override;
185 class LLVM_LIBRARY_VISIBILITY Linker : public Common {
187 Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
189 bool hasIntegratedCPP() const override { return false; }
190 bool isLinkJob() const override { return true; }
192 void RenderExtraToolArgs(const JobAction &JA,
193 llvm::opt::ArgStringList &CmdArgs) const override;
195 } // end namespace gcc
198 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
200 // We simply use "clang -cc1" for those actions.
201 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
203 Assembler(const ToolChain &TC)
204 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
206 bool hasIntegratedCPP() const override { return false; }
208 void RenderExtraToolArgs(const JobAction &JA,
209 llvm::opt::ArgStringList &CmdArgs) const;
210 void ConstructJob(Compilation &C, const JobAction &JA,
211 const InputInfo &Output, const InputInfoList &Inputs,
212 const llvm::opt::ArgList &TCArgs,
213 const char *LinkingOutput) const override;
216 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
218 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
220 bool hasIntegratedCPP() const override { return false; }
221 bool isLinkJob() const override { return true; }
223 virtual void RenderExtraToolArgs(const JobAction &JA,
224 llvm::opt::ArgStringList &CmdArgs) const;
225 void ConstructJob(Compilation &C, const JobAction &JA,
226 const InputInfo &Output, const InputInfoList &Inputs,
227 const llvm::opt::ArgList &TCArgs,
228 const char *LinkingOutput) const override;
230 } // end namespace hexagon.
234 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
236 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "lld", TC) {}
237 bool isLinkJob() const override { return true; }
238 bool hasIntegratedCPP() const override { return false; }
239 void ConstructJob(Compilation &C, const JobAction &JA,
240 const InputInfo &Output, const InputInfoList &Inputs,
241 const llvm::opt::ArgList &TCArgs,
242 const char *LinkingOutput) const override;
245 } // end namespace amdgpu
248 std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
249 const llvm::Triple &Triple);
250 const std::string getARMArch(StringRef Arch,
251 const llvm::Triple &Triple);
252 StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
253 StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
254 const llvm::Triple &Triple);
256 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
257 const llvm::Triple &Triple);
258 } // end namespace arm
261 typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
263 enum class FloatABI {
269 NanEncoding getSupportedNanEncoding(StringRef &CPU);
270 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
271 const llvm::Triple &Triple, StringRef &CPUName,
273 std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args,
274 const llvm::Triple &Triple);
275 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
276 bool isUCLibc(const llvm::opt::ArgList &Args);
277 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
278 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
279 StringRef ABIName, mips::FloatABI FloatABI);
280 bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
281 StringRef CPUName, StringRef ABIName,
282 mips::FloatABI FloatABI);
283 } // end namespace mips
286 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
287 } // end namespace ppc
289 /// cloudabi -- Directly call GNU Binutils linker
291 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
293 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
295 bool hasIntegratedCPP() const override { return false; }
296 bool isLinkJob() const override { return true; }
298 void ConstructJob(Compilation &C, const JobAction &JA,
299 const InputInfo &Output, const InputInfoList &Inputs,
300 const llvm::opt::ArgList &TCArgs,
301 const char *LinkingOutput) const override;
303 } // end namespace cloudabi
306 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
307 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
309 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
310 virtual void anchor();
313 void AddMachOArch(const llvm::opt::ArgList &Args,
314 llvm::opt::ArgStringList &CmdArgs) const;
316 const toolchains::MachO &getMachOToolChain() const {
317 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
322 const char *Name, const char *ShortName, const ToolChain &TC,
323 ResponseFileSupport ResponseSupport = RF_None,
324 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
325 const char *ResponseFlag = "@")
326 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
330 class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
332 Assembler(const ToolChain &TC)
333 : MachOTool("darwin::Assembler", "assembler", TC) {}
335 bool hasIntegratedCPP() const override { return false; }
337 void ConstructJob(Compilation &C, const JobAction &JA,
338 const InputInfo &Output, const InputInfoList &Inputs,
339 const llvm::opt::ArgList &TCArgs,
340 const char *LinkingOutput) const override;
343 class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
344 bool NeedsTempPath(const InputInfoList &Inputs) const;
345 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
346 llvm::opt::ArgStringList &CmdArgs,
347 const InputInfoList &Inputs) const;
350 Linker(const ToolChain &TC)
351 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
352 llvm::sys::WEM_UTF8, "-filelist") {}
354 bool hasIntegratedCPP() const override { return false; }
355 bool isLinkJob() const override { return true; }
357 void ConstructJob(Compilation &C, const JobAction &JA,
358 const InputInfo &Output, const InputInfoList &Inputs,
359 const llvm::opt::ArgList &TCArgs,
360 const char *LinkingOutput) const override;
363 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
365 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
367 bool hasIntegratedCPP() const override { return false; }
369 void ConstructJob(Compilation &C, const JobAction &JA,
370 const InputInfo &Output, const InputInfoList &Inputs,
371 const llvm::opt::ArgList &TCArgs,
372 const char *LinkingOutput) const override;
375 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
377 Dsymutil(const ToolChain &TC)
378 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
380 bool hasIntegratedCPP() const override { return false; }
381 bool isDsymutilJob() const override { return true; }
383 void ConstructJob(Compilation &C, const JobAction &JA,
384 const InputInfo &Output, const InputInfoList &Inputs,
385 const llvm::opt::ArgList &TCArgs,
386 const char *LinkingOutput) const override;
389 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
391 VerifyDebug(const ToolChain &TC)
392 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
394 bool hasIntegratedCPP() const override { return false; }
396 void ConstructJob(Compilation &C, const JobAction &JA,
397 const InputInfo &Output, const InputInfoList &Inputs,
398 const llvm::opt::ArgList &TCArgs,
399 const char *LinkingOutput) const override;
401 } // end namespace darwin
403 /// openbsd -- Directly call GNU Binutils assembler and linker
405 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
407 Assembler(const ToolChain &TC)
408 : GnuTool("openbsd::Assembler", "assembler", 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;
418 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
420 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
422 bool hasIntegratedCPP() const override { return false; }
423 bool isLinkJob() const override { return true; }
425 void ConstructJob(Compilation &C, const JobAction &JA,
426 const InputInfo &Output, const InputInfoList &Inputs,
427 const llvm::opt::ArgList &TCArgs,
428 const char *LinkingOutput) const override;
430 } // end namespace openbsd
432 /// bitrig -- Directly call GNU Binutils assembler and linker
434 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
436 Assembler(const ToolChain &TC)
437 : GnuTool("bitrig::Assembler", "assembler", TC) {}
439 bool hasIntegratedCPP() const override { return false; }
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;
447 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
449 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
451 bool hasIntegratedCPP() const override { return false; }
452 bool isLinkJob() const override { return true; }
454 void ConstructJob(Compilation &C, const JobAction &JA,
455 const InputInfo &Output, const InputInfoList &Inputs,
456 const llvm::opt::ArgList &TCArgs,
457 const char *LinkingOutput) const override;
459 } // end namespace bitrig
461 /// freebsd -- Directly call GNU Binutils assembler and linker
463 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
465 Assembler(const ToolChain &TC)
466 : GnuTool("freebsd::Assembler", "assembler", TC) {}
468 bool hasIntegratedCPP() const override { return false; }
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;
476 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
478 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
480 bool hasIntegratedCPP() const override { return false; }
481 bool isLinkJob() const override { return true; }
483 void ConstructJob(Compilation &C, const JobAction &JA,
484 const InputInfo &Output, const InputInfoList &Inputs,
485 const llvm::opt::ArgList &TCArgs,
486 const char *LinkingOutput) const override;
488 } // end namespace freebsd
490 /// netbsd -- Directly call GNU Binutils assembler and linker
492 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
494 Assembler(const ToolChain &TC)
495 : GnuTool("netbsd::Assembler", "assembler", TC) {}
497 bool hasIntegratedCPP() const override { return false; }
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;
505 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
507 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
509 bool hasIntegratedCPP() const override { return false; }
510 bool isLinkJob() const override { return true; }
512 void ConstructJob(Compilation &C, const JobAction &JA,
513 const InputInfo &Output, const InputInfoList &Inputs,
514 const llvm::opt::ArgList &TCArgs,
515 const char *LinkingOutput) const override;
517 } // end namespace netbsd
519 /// Directly call GNU Binutils' assembler and linker.
521 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
523 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
525 bool hasIntegratedCPP() const override { return false; }
527 void ConstructJob(Compilation &C, const JobAction &JA,
528 const InputInfo &Output, const InputInfoList &Inputs,
529 const llvm::opt::ArgList &TCArgs,
530 const char *LinkingOutput) const override;
533 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
535 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
537 bool hasIntegratedCPP() const override { return false; }
538 bool isLinkJob() const override { return true; }
540 void ConstructJob(Compilation &C, const JobAction &JA,
541 const InputInfo &Output, const InputInfoList &Inputs,
542 const llvm::opt::ArgList &TCArgs,
543 const char *LinkingOutput) const override;
545 } // end namespace gnutools
547 namespace nacltools {
548 class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
550 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
552 void ConstructJob(Compilation &C, const JobAction &JA,
553 const InputInfo &Output, const InputInfoList &Inputs,
554 const llvm::opt::ArgList &TCArgs,
555 const char *LinkingOutput) const override;
558 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
560 Linker(const ToolChain &TC) : Tool("NaCl::Linker", "linker", TC) {}
562 bool hasIntegratedCPP() const override { return false; }
563 bool isLinkJob() const override { return true; }
565 void ConstructJob(Compilation &C, const JobAction &JA,
566 const InputInfo &Output, const InputInfoList &Inputs,
567 const llvm::opt::ArgList &TCArgs,
568 const char *LinkingOutput) const override;
570 } // end namespace nacltools
572 /// minix -- Directly call GNU Binutils assembler and linker
574 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
576 Assembler(const ToolChain &TC)
577 : GnuTool("minix::Assembler", "assembler", TC) {}
579 bool hasIntegratedCPP() const override { return false; }
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;
587 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
589 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
591 bool hasIntegratedCPP() const override { return false; }
592 bool isLinkJob() const override { return true; }
594 void ConstructJob(Compilation &C, const JobAction &JA,
595 const InputInfo &Output, const InputInfoList &Inputs,
596 const llvm::opt::ArgList &TCArgs,
597 const char *LinkingOutput) const override;
599 } // end namespace minix
601 /// solaris -- Directly call Solaris assembler and linker
603 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
605 Assembler(const ToolChain &TC)
606 : Tool("solaris::Assembler", "assembler", TC) {}
608 bool hasIntegratedCPP() const override { return false; }
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;
616 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
618 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
620 bool hasIntegratedCPP() const override { return false; }
621 bool isLinkJob() const override { return true; }
623 void ConstructJob(Compilation &C, const JobAction &JA,
624 const InputInfo &Output, const InputInfoList &Inputs,
625 const llvm::opt::ArgList &TCArgs,
626 const char *LinkingOutput) const override;
628 } // end namespace solaris
630 /// dragonfly -- Directly call GNU Binutils assembler and linker
631 namespace dragonfly {
632 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
634 Assembler(const ToolChain &TC)
635 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
637 bool hasIntegratedCPP() const override { return false; }
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;
645 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
647 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
649 bool hasIntegratedCPP() const override { return false; }
650 bool isLinkJob() const override { return true; }
652 void ConstructJob(Compilation &C, const JobAction &JA,
653 const InputInfo &Output, const InputInfoList &Inputs,
654 const llvm::opt::ArgList &TCArgs,
655 const char *LinkingOutput) const override;
657 } // end namespace dragonfly
659 /// Visual studio tools.
660 namespace visualstudio {
661 VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
662 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
664 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
666 Linker(const ToolChain &TC)
667 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
668 llvm::sys::WEM_UTF16) {}
670 bool hasIntegratedCPP() const override { return false; }
671 bool isLinkJob() const override { return true; }
673 void ConstructJob(Compilation &C, const JobAction &JA,
674 const InputInfo &Output, const InputInfoList &Inputs,
675 const llvm::opt::ArgList &TCArgs,
676 const char *LinkingOutput) const override;
679 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
681 Compiler(const ToolChain &TC)
682 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
683 llvm::sys::WEM_UTF16) {}
685 bool hasIntegratedAssembler() const override { return true; }
686 bool hasIntegratedCPP() const override { return true; }
687 bool isLinkJob() const override { return false; }
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;
694 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
695 const InputInfo &Output,
696 const InputInfoList &Inputs,
697 const llvm::opt::ArgList &TCArgs,
698 const char *LinkingOutput) const;
700 } // end namespace visualstudio
702 /// MinGW -- Directly call GNU Binutils assembler and linker
704 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
706 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
708 bool hasIntegratedCPP() const override { return false; }
710 void ConstructJob(Compilation &C, const JobAction &JA,
711 const InputInfo &Output, const InputInfoList &Inputs,
712 const llvm::opt::ArgList &TCArgs,
713 const char *LinkingOutput) const override;
716 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
718 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
720 bool hasIntegratedCPP() const override { return false; }
721 bool isLinkJob() const override { return true; }
723 void ConstructJob(Compilation &C, const JobAction &JA,
724 const InputInfo &Output, const InputInfoList &Inputs,
725 const llvm::opt::ArgList &TCArgs,
726 const char *LinkingOutput) const override;
729 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
731 } // end namespace MinGW
734 enum class FloatABI {
741 FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
742 } // end namespace arm
745 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
747 // We simply use "clang -cc1" for those actions.
748 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
750 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
752 bool hasIntegratedCPP() const override { return false; }
753 void ConstructJob(Compilation &C, const JobAction &JA,
754 const InputInfo &Output, const InputInfoList &Inputs,
755 const llvm::opt::ArgList &TCArgs,
756 const char *LinkingOutput) const override;
759 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
761 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
763 bool hasIntegratedCPP() const override { return false; }
764 bool isLinkJob() const override { return true; }
765 void ConstructJob(Compilation &C, const JobAction &JA,
766 const InputInfo &Output, const InputInfoList &Inputs,
767 const llvm::opt::ArgList &TCArgs,
768 const char *LinkingOutput) const override;
770 } // end namespace XCore.
772 namespace CrossWindows {
773 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
775 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
777 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)
788 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
790 bool hasIntegratedCPP() const override { return false; }
791 bool isLinkJob() const override { return true; }
793 void ConstructJob(Compilation &C, const JobAction &JA,
794 const InputInfo &Output, const InputInfoList &Inputs,
795 const llvm::opt::ArgList &TCArgs,
796 const char *LinkingOutput) const override;
798 } // end namespace CrossWindows
800 /// SHAVE tools -- Directly call moviCompile and moviAsm
802 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
804 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
806 bool hasIntegratedCPP() const override { return true; }
808 void ConstructJob(Compilation &C, const JobAction &JA,
809 const InputInfo &Output, const InputInfoList &Inputs,
810 const llvm::opt::ArgList &TCArgs,
811 const char *LinkingOutput) const override;
814 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
816 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
818 bool hasIntegratedCPP() const override { return false; } // not sure.
820 void ConstructJob(Compilation &C, const JobAction &JA,
821 const InputInfo &Output, const InputInfoList &Inputs,
822 const llvm::opt::ArgList &TCArgs,
823 const char *LinkingOutput) const override;
825 } // end namespace SHAVE
827 /// The Myriad toolchain uses tools that are in two different namespaces.
828 /// The Compiler and Assembler as defined above are in the SHAVE namespace,
829 /// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
830 /// is in the Myriad namespace.
832 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
834 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
835 bool hasIntegratedCPP() const override { return false; }
836 bool isLinkJob() const override { return true; }
837 void ConstructJob(Compilation &C, const JobAction &JA,
838 const InputInfo &Output, const InputInfoList &Inputs,
839 const llvm::opt::ArgList &TCArgs,
840 const char *LinkingOutput) const override;
842 } // end namespace Myriad
845 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
847 Assemble(const ToolChain &TC)
848 : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
850 bool hasIntegratedCPP() const override { return false; }
852 void ConstructJob(Compilation &C, const JobAction &JA,
853 const InputInfo &Output,
854 const InputInfoList &Inputs,
855 const llvm::opt::ArgList &TCArgs,
856 const char *LinkingOutput) const override;
859 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
861 Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
863 bool hasIntegratedCPP() const override { return false; }
864 bool isLinkJob() const override { return true; }
866 void ConstructJob(Compilation &C, const JobAction &JA,
867 const InputInfo &Output,
868 const InputInfoList &Inputs,
869 const llvm::opt::ArgList &TCArgs,
870 const char *LinkingOutput) const override;
872 } // end namespace PS4cpu
874 } // end namespace tools
875 } // end namespace driver
876 } // end namespace clang
878 #endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H