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 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
274 bool isUCLibc(const llvm::opt::ArgList &Args);
275 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
276 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
277 StringRef ABIName, mips::FloatABI FloatABI);
278 bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
279 StringRef CPUName, StringRef ABIName,
280 mips::FloatABI FloatABI);
281 } // end namespace mips
284 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
285 } // end namespace ppc
287 /// cloudabi -- Directly call GNU Binutils linker
289 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
291 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
293 bool hasIntegratedCPP() const override { return false; }
294 bool isLinkJob() const override { return true; }
296 void ConstructJob(Compilation &C, const JobAction &JA,
297 const InputInfo &Output, const InputInfoList &Inputs,
298 const llvm::opt::ArgList &TCArgs,
299 const char *LinkingOutput) const override;
301 } // end namespace cloudabi
304 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
305 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
307 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
308 virtual void anchor();
311 void AddMachOArch(const llvm::opt::ArgList &Args,
312 llvm::opt::ArgStringList &CmdArgs) const;
314 const toolchains::MachO &getMachOToolChain() const {
315 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
320 const char *Name, const char *ShortName, const ToolChain &TC,
321 ResponseFileSupport ResponseSupport = RF_None,
322 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
323 const char *ResponseFlag = "@")
324 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
328 class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
330 Assembler(const ToolChain &TC)
331 : MachOTool("darwin::Assembler", "assembler", TC) {}
333 bool hasIntegratedCPP() const override { return false; }
335 void ConstructJob(Compilation &C, const JobAction &JA,
336 const InputInfo &Output, const InputInfoList &Inputs,
337 const llvm::opt::ArgList &TCArgs,
338 const char *LinkingOutput) const override;
341 class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
342 bool NeedsTempPath(const InputInfoList &Inputs) const;
343 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
344 llvm::opt::ArgStringList &CmdArgs,
345 const InputInfoList &Inputs) const;
348 Linker(const ToolChain &TC)
349 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
350 llvm::sys::WEM_UTF8, "-filelist") {}
352 bool hasIntegratedCPP() const override { return false; }
353 bool isLinkJob() const override { return true; }
355 void ConstructJob(Compilation &C, const JobAction &JA,
356 const InputInfo &Output, const InputInfoList &Inputs,
357 const llvm::opt::ArgList &TCArgs,
358 const char *LinkingOutput) const override;
361 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
363 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
365 bool hasIntegratedCPP() const override { return false; }
367 void ConstructJob(Compilation &C, const JobAction &JA,
368 const InputInfo &Output, const InputInfoList &Inputs,
369 const llvm::opt::ArgList &TCArgs,
370 const char *LinkingOutput) const override;
373 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
375 Dsymutil(const ToolChain &TC)
376 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
378 bool hasIntegratedCPP() const override { return false; }
379 bool isDsymutilJob() const override { return true; }
381 void ConstructJob(Compilation &C, const JobAction &JA,
382 const InputInfo &Output, const InputInfoList &Inputs,
383 const llvm::opt::ArgList &TCArgs,
384 const char *LinkingOutput) const override;
387 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
389 VerifyDebug(const ToolChain &TC)
390 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
392 bool hasIntegratedCPP() const override { return false; }
394 void ConstructJob(Compilation &C, const JobAction &JA,
395 const InputInfo &Output, const InputInfoList &Inputs,
396 const llvm::opt::ArgList &TCArgs,
397 const char *LinkingOutput) const override;
399 } // end namespace darwin
401 /// openbsd -- Directly call GNU Binutils assembler and linker
403 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
405 Assembler(const ToolChain &TC)
406 : GnuTool("openbsd::Assembler", "assembler", TC) {}
408 bool hasIntegratedCPP() const override { return false; }
410 void ConstructJob(Compilation &C, const JobAction &JA,
411 const InputInfo &Output, const InputInfoList &Inputs,
412 const llvm::opt::ArgList &TCArgs,
413 const char *LinkingOutput) const override;
416 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
418 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
420 bool hasIntegratedCPP() const override { return false; }
421 bool isLinkJob() const override { return true; }
423 void ConstructJob(Compilation &C, const JobAction &JA,
424 const InputInfo &Output, const InputInfoList &Inputs,
425 const llvm::opt::ArgList &TCArgs,
426 const char *LinkingOutput) const override;
428 } // end namespace openbsd
430 /// bitrig -- Directly call GNU Binutils assembler and linker
432 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
434 Assembler(const ToolChain &TC)
435 : GnuTool("bitrig::Assembler", "assembler", TC) {}
437 bool hasIntegratedCPP() const override { return false; }
439 void ConstructJob(Compilation &C, const JobAction &JA,
440 const InputInfo &Output, const InputInfoList &Inputs,
441 const llvm::opt::ArgList &TCArgs,
442 const char *LinkingOutput) const override;
445 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
447 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
449 bool hasIntegratedCPP() const override { return false; }
450 bool isLinkJob() const override { return true; }
452 void ConstructJob(Compilation &C, const JobAction &JA,
453 const InputInfo &Output, const InputInfoList &Inputs,
454 const llvm::opt::ArgList &TCArgs,
455 const char *LinkingOutput) const override;
457 } // end namespace bitrig
459 /// freebsd -- Directly call GNU Binutils assembler and linker
461 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
463 Assembler(const ToolChain &TC)
464 : GnuTool("freebsd::Assembler", "assembler", TC) {}
466 bool hasIntegratedCPP() const override { return false; }
468 void ConstructJob(Compilation &C, const JobAction &JA,
469 const InputInfo &Output, const InputInfoList &Inputs,
470 const llvm::opt::ArgList &TCArgs,
471 const char *LinkingOutput) const override;
474 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
476 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
478 bool hasIntegratedCPP() const override { return false; }
479 bool isLinkJob() const override { return true; }
481 void ConstructJob(Compilation &C, const JobAction &JA,
482 const InputInfo &Output, const InputInfoList &Inputs,
483 const llvm::opt::ArgList &TCArgs,
484 const char *LinkingOutput) const override;
486 } // end namespace freebsd
488 /// netbsd -- Directly call GNU Binutils assembler and linker
490 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
492 Assembler(const ToolChain &TC)
493 : GnuTool("netbsd::Assembler", "assembler", TC) {}
495 bool hasIntegratedCPP() const override { return false; }
497 void ConstructJob(Compilation &C, const JobAction &JA,
498 const InputInfo &Output, const InputInfoList &Inputs,
499 const llvm::opt::ArgList &TCArgs,
500 const char *LinkingOutput) const override;
503 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
505 Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
507 bool hasIntegratedCPP() const override { return false; }
508 bool isLinkJob() const override { return true; }
510 void ConstructJob(Compilation &C, const JobAction &JA,
511 const InputInfo &Output, const InputInfoList &Inputs,
512 const llvm::opt::ArgList &TCArgs,
513 const char *LinkingOutput) const override;
515 } // end namespace netbsd
517 /// Directly call GNU Binutils' assembler and linker.
519 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
521 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
523 bool hasIntegratedCPP() const override { return false; }
525 void ConstructJob(Compilation &C, const JobAction &JA,
526 const InputInfo &Output, const InputInfoList &Inputs,
527 const llvm::opt::ArgList &TCArgs,
528 const char *LinkingOutput) const override;
531 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
533 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
535 bool hasIntegratedCPP() const override { return false; }
536 bool isLinkJob() const override { return true; }
538 void ConstructJob(Compilation &C, const JobAction &JA,
539 const InputInfo &Output, const InputInfoList &Inputs,
540 const llvm::opt::ArgList &TCArgs,
541 const char *LinkingOutput) const override;
543 } // end namespace gnutools
545 namespace nacltools {
546 class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
548 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
550 void ConstructJob(Compilation &C, const JobAction &JA,
551 const InputInfo &Output, const InputInfoList &Inputs,
552 const llvm::opt::ArgList &TCArgs,
553 const char *LinkingOutput) const override;
556 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
558 Linker(const ToolChain &TC) : Tool("NaCl::Linker", "linker", TC) {}
560 bool hasIntegratedCPP() const override { return false; }
561 bool isLinkJob() const override { return true; }
563 void ConstructJob(Compilation &C, const JobAction &JA,
564 const InputInfo &Output, const InputInfoList &Inputs,
565 const llvm::opt::ArgList &TCArgs,
566 const char *LinkingOutput) const override;
568 } // end namespace nacltools
570 /// minix -- Directly call GNU Binutils assembler and linker
572 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
574 Assembler(const ToolChain &TC)
575 : GnuTool("minix::Assembler", "assembler", TC) {}
577 bool hasIntegratedCPP() const override { return false; }
579 void ConstructJob(Compilation &C, const JobAction &JA,
580 const InputInfo &Output, const InputInfoList &Inputs,
581 const llvm::opt::ArgList &TCArgs,
582 const char *LinkingOutput) const override;
585 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
587 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
589 bool hasIntegratedCPP() const override { return false; }
590 bool isLinkJob() const override { return true; }
592 void ConstructJob(Compilation &C, const JobAction &JA,
593 const InputInfo &Output, const InputInfoList &Inputs,
594 const llvm::opt::ArgList &TCArgs,
595 const char *LinkingOutput) const override;
597 } // end namespace minix
599 /// solaris -- Directly call Solaris assembler and linker
601 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
603 Assembler(const ToolChain &TC)
604 : Tool("solaris::Assembler", "assembler", TC) {}
606 bool hasIntegratedCPP() const override { return false; }
608 void ConstructJob(Compilation &C, const JobAction &JA,
609 const InputInfo &Output, const InputInfoList &Inputs,
610 const llvm::opt::ArgList &TCArgs,
611 const char *LinkingOutput) const override;
614 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
616 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
618 bool hasIntegratedCPP() const override { return false; }
619 bool isLinkJob() const override { return true; }
621 void ConstructJob(Compilation &C, const JobAction &JA,
622 const InputInfo &Output, const InputInfoList &Inputs,
623 const llvm::opt::ArgList &TCArgs,
624 const char *LinkingOutput) const override;
626 } // end namespace solaris
628 /// dragonfly -- Directly call GNU Binutils assembler and linker
629 namespace dragonfly {
630 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
632 Assembler(const ToolChain &TC)
633 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
635 bool hasIntegratedCPP() const override { return false; }
637 void ConstructJob(Compilation &C, const JobAction &JA,
638 const InputInfo &Output, const InputInfoList &Inputs,
639 const llvm::opt::ArgList &TCArgs,
640 const char *LinkingOutput) const override;
643 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
645 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
647 bool hasIntegratedCPP() const override { return false; }
648 bool isLinkJob() const override { return true; }
650 void ConstructJob(Compilation &C, const JobAction &JA,
651 const InputInfo &Output, const InputInfoList &Inputs,
652 const llvm::opt::ArgList &TCArgs,
653 const char *LinkingOutput) const override;
655 } // end namespace dragonfly
657 /// Visual studio tools.
658 namespace visualstudio {
659 VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
660 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
662 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
664 Linker(const ToolChain &TC)
665 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
666 llvm::sys::WEM_UTF16) {}
668 bool hasIntegratedCPP() const override { return false; }
669 bool isLinkJob() const override { return true; }
671 void ConstructJob(Compilation &C, const JobAction &JA,
672 const InputInfo &Output, const InputInfoList &Inputs,
673 const llvm::opt::ArgList &TCArgs,
674 const char *LinkingOutput) const override;
677 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
679 Compiler(const ToolChain &TC)
680 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
681 llvm::sys::WEM_UTF16) {}
683 bool hasIntegratedAssembler() const override { return true; }
684 bool hasIntegratedCPP() const override { return true; }
685 bool isLinkJob() const override { return false; }
687 void ConstructJob(Compilation &C, const JobAction &JA,
688 const InputInfo &Output, const InputInfoList &Inputs,
689 const llvm::opt::ArgList &TCArgs,
690 const char *LinkingOutput) const override;
692 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
693 const InputInfo &Output,
694 const InputInfoList &Inputs,
695 const llvm::opt::ArgList &TCArgs,
696 const char *LinkingOutput) const;
698 } // end namespace visualstudio
700 /// MinGW -- Directly call GNU Binutils assembler and linker
702 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
704 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
706 bool hasIntegratedCPP() const override { return false; }
708 void ConstructJob(Compilation &C, const JobAction &JA,
709 const InputInfo &Output, const InputInfoList &Inputs,
710 const llvm::opt::ArgList &TCArgs,
711 const char *LinkingOutput) const override;
714 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
716 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
718 bool hasIntegratedCPP() const override { return false; }
719 bool isLinkJob() const override { return true; }
721 void ConstructJob(Compilation &C, const JobAction &JA,
722 const InputInfo &Output, const InputInfoList &Inputs,
723 const llvm::opt::ArgList &TCArgs,
724 const char *LinkingOutput) const override;
727 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
729 } // end namespace MinGW
732 enum class FloatABI {
739 FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
740 } // end namespace arm
743 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
745 // We simply use "clang -cc1" for those actions.
746 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
748 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
750 bool hasIntegratedCPP() const override { return false; }
751 void ConstructJob(Compilation &C, const JobAction &JA,
752 const InputInfo &Output, const InputInfoList &Inputs,
753 const llvm::opt::ArgList &TCArgs,
754 const char *LinkingOutput) const override;
757 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
759 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
761 bool hasIntegratedCPP() const override { return false; }
762 bool isLinkJob() const override { return true; }
763 void ConstructJob(Compilation &C, const JobAction &JA,
764 const InputInfo &Output, const InputInfoList &Inputs,
765 const llvm::opt::ArgList &TCArgs,
766 const char *LinkingOutput) const override;
768 } // end namespace XCore.
770 namespace CrossWindows {
771 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
773 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
775 bool hasIntegratedCPP() const override { return false; }
777 void ConstructJob(Compilation &C, const JobAction &JA,
778 const InputInfo &Output, const InputInfoList &Inputs,
779 const llvm::opt::ArgList &TCArgs,
780 const char *LinkingOutput) const override;
783 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
785 Linker(const ToolChain &TC)
786 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
788 bool hasIntegratedCPP() const override { return false; }
789 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 CrossWindows
798 /// SHAVE tools -- Directly call moviCompile and moviAsm
800 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
802 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
804 bool hasIntegratedCPP() const override { return true; }
806 void ConstructJob(Compilation &C, const JobAction &JA,
807 const InputInfo &Output, const InputInfoList &Inputs,
808 const llvm::opt::ArgList &TCArgs,
809 const char *LinkingOutput) const override;
812 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
814 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
816 bool hasIntegratedCPP() const override { return false; } // not sure.
818 void ConstructJob(Compilation &C, const JobAction &JA,
819 const InputInfo &Output, const InputInfoList &Inputs,
820 const llvm::opt::ArgList &TCArgs,
821 const char *LinkingOutput) const override;
823 } // end namespace SHAVE
825 /// The Myriad toolchain uses tools that are in two different namespaces.
826 /// The Compiler and Assembler as defined above are in the SHAVE namespace,
827 /// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
828 /// is in the Myriad namespace.
830 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
832 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
833 bool hasIntegratedCPP() const override { return false; }
834 bool isLinkJob() const override { return true; }
835 void ConstructJob(Compilation &C, const JobAction &JA,
836 const InputInfo &Output, const InputInfoList &Inputs,
837 const llvm::opt::ArgList &TCArgs,
838 const char *LinkingOutput) const override;
840 } // end namespace Myriad
843 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
845 Assemble(const ToolChain &TC)
846 : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
848 bool hasIntegratedCPP() const override { return false; }
850 void ConstructJob(Compilation &C, const JobAction &JA,
851 const InputInfo &Output,
852 const InputInfoList &Inputs,
853 const llvm::opt::ArgList &TCArgs,
854 const char *LinkingOutput) const override;
857 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
859 Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
861 bool hasIntegratedCPP() const override { return false; }
862 bool isLinkJob() const override { return true; }
864 void ConstructJob(Compilation &C, const JobAction &JA,
865 const InputInfo &Output,
866 const InputInfoList &Inputs,
867 const llvm::opt::ArgList &TCArgs,
868 const char *LinkingOutput) const override;
870 } // end namespace PS4cpu
872 } // end namespace tools
873 } // end namespace driver
874 } // end namespace clang
876 #endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H