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 "llvm/ADT/Triple.h"
18 #include "llvm/Option/Option.h"
19 #include "llvm/Support/Compiler.h"
28 namespace toolchains {
34 namespace visualstudio {
38 using llvm::opt::ArgStringList;
40 /// \brief Clang compiler tool.
41 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
43 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
44 const InputInfo &Input);
45 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
46 const InputInfoList &Inputs);
47 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
48 const InputInfoList &Inputs);
51 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
53 const llvm::opt::ArgList &Args,
54 llvm::opt::ArgStringList &CmdArgs,
55 const InputInfo &Output,
56 const InputInfoList &Inputs) const;
58 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
59 llvm::opt::ArgStringList &CmdArgs) const;
60 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
61 llvm::opt::ArgStringList &CmdArgs,
62 bool KernelOrKext) const;
63 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
64 llvm::opt::ArgStringList &CmdArgs) const;
65 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
66 llvm::opt::ArgStringList &CmdArgs) const;
67 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
68 llvm::opt::ArgStringList &CmdArgs) const;
69 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
70 llvm::opt::ArgStringList &CmdArgs) const;
71 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
72 llvm::opt::ArgStringList &CmdArgs) const;
73 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
74 llvm::opt::ArgStringList &CmdArgs) const;
75 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
76 llvm::opt::ArgStringList &CmdArgs) const;
77 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
78 llvm::opt::ArgStringList &CmdArgs) const;
80 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
82 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
83 llvm::opt::ArgStringList &cmdArgs,
84 RewriteKind rewrite) const;
86 void AddClangCLArgs(const llvm::opt::ArgList &Args,
87 llvm::opt::ArgStringList &CmdArgs) const;
89 visualstudio::Compile *getCLFallback() const;
91 mutable std::unique_ptr<visualstudio::Compile> CLFallback;
94 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
96 bool hasGoodDiagnostics() const override { return true; }
97 bool hasIntegratedAssembler() const override { return true; }
98 bool hasIntegratedCPP() const override { return true; }
99 bool canEmitIR() const override { return true; }
101 void ConstructJob(Compilation &C, const JobAction &JA,
102 const InputInfo &Output, const InputInfoList &Inputs,
103 const llvm::opt::ArgList &TCArgs,
104 const char *LinkingOutput) const override;
107 /// \brief Clang integrated assembler tool.
108 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
110 ClangAs(const ToolChain &TC) : Tool("clang::as",
111 "clang integrated assembler", TC,
113 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
114 llvm::opt::ArgStringList &CmdArgs) const;
115 bool hasGoodDiagnostics() const override { return true; }
116 bool hasIntegratedAssembler() const override { return false; }
117 bool hasIntegratedCPP() const override { return false; }
119 void ConstructJob(Compilation &C, const JobAction &JA,
120 const InputInfo &Output, const InputInfoList &Inputs,
121 const llvm::opt::ArgList &TCArgs,
122 const char *LinkingOutput) const override;
125 /// \brief Base class for all GNU tools that provide the same behavior when
126 /// it comes to response files support
127 class GnuTool : public Tool {
128 virtual void anchor();
131 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
132 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
135 /// gcc - Generic GCC tool implementations.
137 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
139 Common(const char *Name, const char *ShortName,
140 const ToolChain &TC) : GnuTool(Name, ShortName, TC) {}
142 void ConstructJob(Compilation &C, const JobAction &JA,
143 const InputInfo &Output,
144 const InputInfoList &Inputs,
145 const llvm::opt::ArgList &TCArgs,
146 const char *LinkingOutput) const override;
148 /// RenderExtraToolArgs - Render any arguments necessary to force
149 /// the particular tool mode.
151 RenderExtraToolArgs(const JobAction &JA,
152 llvm::opt::ArgStringList &CmdArgs) const = 0;
155 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
157 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
158 "gcc preprocessor", TC) {}
160 bool hasGoodDiagnostics() const override { return true; }
161 bool hasIntegratedCPP() const override { return false; }
163 void RenderExtraToolArgs(const JobAction &JA,
164 llvm::opt::ArgStringList &CmdArgs) const override;
167 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
169 Compile(const ToolChain &TC) : Common("gcc::Compile",
170 "gcc frontend", TC) {}
172 bool hasGoodDiagnostics() const override { return true; }
173 bool hasIntegratedCPP() const override { return true; }
175 void RenderExtraToolArgs(const JobAction &JA,
176 llvm::opt::ArgStringList &CmdArgs) const override;
179 class LLVM_LIBRARY_VISIBILITY Link : public Common {
181 Link(const ToolChain &TC) : Common("gcc::Link",
182 "linker (via gcc)", TC) {}
184 bool hasIntegratedCPP() const override { return false; }
185 bool isLinkJob() const override { return true; }
187 void RenderExtraToolArgs(const JobAction &JA,
188 llvm::opt::ArgStringList &CmdArgs) const override;
190 } // end namespace gcc
193 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
194 // We simply use "clang -cc1" for those actions.
195 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
197 Assemble(const ToolChain &TC) : GnuTool("hexagon::Assemble",
200 bool hasIntegratedCPP() const override { return false; }
202 void RenderExtraToolArgs(const JobAction &JA,
203 llvm::opt::ArgStringList &CmdArgs) const;
204 void ConstructJob(Compilation &C, const JobAction &JA,
205 const InputInfo &Output, const InputInfoList &Inputs,
206 const llvm::opt::ArgList &TCArgs,
207 const char *LinkingOutput) const override;
210 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
212 Link(const ToolChain &TC) : GnuTool("hexagon::Link",
215 bool hasIntegratedCPP() const override { return false; }
216 bool isLinkJob() const override { return true; }
218 virtual void RenderExtraToolArgs(const JobAction &JA,
219 llvm::opt::ArgStringList &CmdArgs) const;
220 void ConstructJob(Compilation &C, const JobAction &JA,
221 const InputInfo &Output, const InputInfoList &Inputs,
222 const llvm::opt::ArgList &TCArgs,
223 const char *LinkingOutput) const override;
225 } // end namespace hexagon.
228 std::string getARMTargetCPU(const llvm::opt::ArgList &Args,
229 const llvm::Triple &Triple);
230 const std::string getARMArch(const llvm::opt::ArgList &Args,
231 const llvm::Triple &Triple);
232 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
233 const llvm::Triple &Triple);
234 const char* getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch);
236 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple);
244 NanEncoding getSupportedNanEncoding(StringRef &CPU);
245 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
246 const llvm::Triple &Triple, StringRef &CPUName,
248 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
249 bool isUCLibc(const llvm::opt::ArgList &Args);
250 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
251 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
252 StringRef ABIName, StringRef FloatABI);
253 bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
254 StringRef CPUName, StringRef ABIName, StringRef FloatABI);
258 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
261 /// cloudabi -- Directly call GNU Binutils linker
263 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
265 Link(const ToolChain &TC) : GnuTool("cloudabi::Link", "linker", TC) {}
267 bool hasIntegratedCPP() const override { return false; }
268 bool isLinkJob() const override { return true; }
270 void ConstructJob(Compilation &C, const JobAction &JA,
271 const InputInfo &Output, const InputInfoList &Inputs,
272 const llvm::opt::ArgList &TCArgs,
273 const char *LinkingOutput) const override;
275 } // end namespace cloudabi
278 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
279 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
281 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
282 virtual void anchor();
284 void AddMachOArch(const llvm::opt::ArgList &Args,
285 llvm::opt::ArgStringList &CmdArgs) const;
287 const toolchains::MachO &getMachOToolChain() const {
288 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
293 const char *Name, const char *ShortName, const ToolChain &TC,
294 ResponseFileSupport ResponseSupport = RF_None,
295 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
296 const char *ResponseFlag = "@")
297 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
301 class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool {
303 Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
306 bool hasIntegratedCPP() const override { return false; }
308 void ConstructJob(Compilation &C, const JobAction &JA,
309 const InputInfo &Output, const InputInfoList &Inputs,
310 const llvm::opt::ArgList &TCArgs,
311 const char *LinkingOutput) const override;
314 class LLVM_LIBRARY_VISIBILITY Link : public MachOTool {
315 bool NeedsTempPath(const InputInfoList &Inputs) const;
316 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
317 llvm::opt::ArgStringList &CmdArgs,
318 const InputInfoList &Inputs) const;
321 Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC,
322 RF_FileList, llvm::sys::WEM_UTF8,
325 bool hasIntegratedCPP() const override { return false; }
326 bool isLinkJob() const override { return true; }
328 void ConstructJob(Compilation &C, const JobAction &JA,
329 const InputInfo &Output, const InputInfoList &Inputs,
330 const llvm::opt::ArgList &TCArgs,
331 const char *LinkingOutput) const override;
334 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
336 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
338 bool hasIntegratedCPP() const override { return false; }
340 void ConstructJob(Compilation &C, const JobAction &JA,
341 const InputInfo &Output, const InputInfoList &Inputs,
342 const llvm::opt::ArgList &TCArgs,
343 const char *LinkingOutput) const override;
346 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
348 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
351 bool hasIntegratedCPP() const override { return false; }
352 bool isDsymutilJob() const override { return true; }
354 void ConstructJob(Compilation &C, const JobAction &JA,
355 const InputInfo &Output,
356 const InputInfoList &Inputs,
357 const llvm::opt::ArgList &TCArgs,
358 const char *LinkingOutput) const override;
361 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
363 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
366 bool hasIntegratedCPP() const override { return false; }
368 void ConstructJob(Compilation &C, const JobAction &JA,
369 const InputInfo &Output, const InputInfoList &Inputs,
370 const llvm::opt::ArgList &TCArgs,
371 const char *LinkingOutput) const override;
376 /// openbsd -- Directly call GNU Binutils assembler and linker
378 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
380 Assemble(const ToolChain &TC) : GnuTool("openbsd::Assemble", "assembler",
383 bool hasIntegratedCPP() const override { return false; }
385 void ConstructJob(Compilation &C, const JobAction &JA,
386 const InputInfo &Output,
387 const InputInfoList &Inputs,
388 const llvm::opt::ArgList &TCArgs,
389 const char *LinkingOutput) const override;
391 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
393 Link(const ToolChain &TC) : GnuTool("openbsd::Link", "linker", TC) {}
395 bool hasIntegratedCPP() const override { return false; }
396 bool isLinkJob() const override { return true; }
398 void ConstructJob(Compilation &C, const JobAction &JA,
399 const InputInfo &Output, const InputInfoList &Inputs,
400 const llvm::opt::ArgList &TCArgs,
401 const char *LinkingOutput) const override;
403 } // end namespace openbsd
405 /// bitrig -- Directly call GNU Binutils assembler and linker
407 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
409 Assemble(const ToolChain &TC) : GnuTool("bitrig::Assemble", "assembler",
412 bool hasIntegratedCPP() const override { return false; }
414 void ConstructJob(Compilation &C, const JobAction &JA,
415 const InputInfo &Output, const InputInfoList &Inputs,
416 const llvm::opt::ArgList &TCArgs,
417 const char *LinkingOutput) const override;
419 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
421 Link(const ToolChain &TC) : GnuTool("bitrig::Link", "linker", TC) {}
423 bool hasIntegratedCPP() const override { return false; }
424 bool isLinkJob() const override { return true; }
426 void ConstructJob(Compilation &C, const JobAction &JA,
427 const InputInfo &Output, const InputInfoList &Inputs,
428 const llvm::opt::ArgList &TCArgs,
429 const char *LinkingOutput) const override;
431 } // end namespace bitrig
433 /// freebsd -- Directly call GNU Binutils assembler and linker
435 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
437 Assemble(const ToolChain &TC) : GnuTool("freebsd::Assemble", "assembler",
440 bool hasIntegratedCPP() const override { return false; }
442 void ConstructJob(Compilation &C, const JobAction &JA,
443 const InputInfo &Output, const InputInfoList &Inputs,
444 const llvm::opt::ArgList &TCArgs,
445 const char *LinkingOutput) const override;
447 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
449 Link(const ToolChain &TC) : GnuTool("freebsd::Link", "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 freebsd
461 /// netbsd -- Directly call GNU Binutils assembler and linker
463 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
466 Assemble(const ToolChain &TC)
467 : GnuTool("netbsd::Assemble", "assembler", TC) {}
469 bool hasIntegratedCPP() const override { return false; }
471 void ConstructJob(Compilation &C, const JobAction &JA,
472 const InputInfo &Output, const InputInfoList &Inputs,
473 const llvm::opt::ArgList &TCArgs,
474 const char *LinkingOutput) const override;
476 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
479 Link(const ToolChain &TC)
480 : GnuTool("netbsd::Link", "linker", TC) {}
482 bool hasIntegratedCPP() const override { return false; }
483 bool isLinkJob() const override { return true; }
485 void ConstructJob(Compilation &C, const JobAction &JA,
486 const InputInfo &Output, const InputInfoList &Inputs,
487 const llvm::opt::ArgList &TCArgs,
488 const char *LinkingOutput) const override;
490 } // end namespace netbsd
492 /// Directly call GNU Binutils' assembler and linker.
494 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
496 Assemble(const ToolChain &TC) : GnuTool("GNU::Assemble", "assembler", TC) {}
498 bool hasIntegratedCPP() const override { return false; }
500 void ConstructJob(Compilation &C, const JobAction &JA,
501 const InputInfo &Output,
502 const InputInfoList &Inputs,
503 const llvm::opt::ArgList &TCArgs,
504 const char *LinkingOutput) const override;
506 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
508 Link(const ToolChain &TC) : GnuTool("GNU::Link", "linker", TC) {}
510 bool hasIntegratedCPP() const override { return false; }
511 bool isLinkJob() const override { return true; }
513 void ConstructJob(Compilation &C, const JobAction &JA,
514 const InputInfo &Output,
515 const InputInfoList &Inputs,
516 const llvm::opt::ArgList &TCArgs,
517 const char *LinkingOutput) const override;
521 namespace nacltools {
522 class LLVM_LIBRARY_VISIBILITY AssembleARM : public gnutools::Assemble {
524 AssembleARM(const ToolChain &TC) : gnutools::Assemble(TC) {}
526 void ConstructJob(Compilation &C, const JobAction &JA,
527 const InputInfo &Output,
528 const InputInfoList &Inputs,
529 const llvm::opt::ArgList &TCArgs,
530 const char *LinkingOutput) const override;
532 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
534 Link(const ToolChain &TC) : Tool("NaCl::Link", "linker", TC) {}
536 bool hasIntegratedCPP() const override { return false; }
537 bool isLinkJob() const override { return true; }
539 void ConstructJob(Compilation &C, const JobAction &JA,
540 const InputInfo &Output,
541 const InputInfoList &Inputs,
542 const llvm::opt::ArgList &TCArgs,
543 const char *LinkingOutput) const override;
547 /// minix -- Directly call GNU Binutils assembler and linker
549 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
551 Assemble(const ToolChain &TC) : GnuTool("minix::Assemble", "assembler",
554 bool hasIntegratedCPP() const override { return false; }
556 void ConstructJob(Compilation &C, const JobAction &JA,
557 const InputInfo &Output,
558 const InputInfoList &Inputs,
559 const llvm::opt::ArgList &TCArgs,
560 const char *LinkingOutput) const override;
562 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
564 Link(const ToolChain &TC) : GnuTool("minix::Link", "linker", TC) {}
566 bool hasIntegratedCPP() const override { return false; }
567 bool isLinkJob() const override { return true; }
569 void ConstructJob(Compilation &C, const JobAction &JA,
570 const InputInfo &Output,
571 const InputInfoList &Inputs,
572 const llvm::opt::ArgList &TCArgs,
573 const char *LinkingOutput) const override;
575 } // end namespace minix
577 /// solaris -- Directly call Solaris assembler and linker
579 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
581 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
584 bool hasIntegratedCPP() const override { return false; }
586 void ConstructJob(Compilation &C, const JobAction &JA,
587 const InputInfo &Output, const InputInfoList &Inputs,
588 const llvm::opt::ArgList &TCArgs,
589 const char *LinkingOutput) const override;
591 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
593 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
595 bool hasIntegratedCPP() const override { return false; }
596 bool isLinkJob() const override { return true; }
598 void ConstructJob(Compilation &C, const JobAction &JA,
599 const InputInfo &Output, const InputInfoList &Inputs,
600 const llvm::opt::ArgList &TCArgs,
601 const char *LinkingOutput) const override;
603 } // end namespace solaris
605 /// dragonfly -- Directly call GNU Binutils assembler and linker
606 namespace dragonfly {
607 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
609 Assemble(const ToolChain &TC) : GnuTool("dragonfly::Assemble", "assembler",
612 bool hasIntegratedCPP() const override { return false; }
614 void ConstructJob(Compilation &C, const JobAction &JA,
615 const InputInfo &Output, const InputInfoList &Inputs,
616 const llvm::opt::ArgList &TCArgs,
617 const char *LinkingOutput) const override;
619 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
621 Link(const ToolChain &TC) : GnuTool("dragonfly::Link", "linker", TC) {}
623 bool hasIntegratedCPP() const override { return false; }
624 bool isLinkJob() const override { return true; }
626 void ConstructJob(Compilation &C, const JobAction &JA,
627 const InputInfo &Output,
628 const InputInfoList &Inputs,
629 const llvm::opt::ArgList &TCArgs,
630 const char *LinkingOutput) const override;
632 } // end namespace dragonfly
634 /// Visual studio tools.
635 namespace visualstudio {
636 VersionTuple getMSVCVersion(const Driver *D, const llvm::Triple &Triple,
637 const llvm::opt::ArgList &Args,
640 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
642 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC,
643 RF_Full, llvm::sys::WEM_UTF16) {}
645 bool hasIntegratedCPP() const override { return false; }
646 bool isLinkJob() const override { return true; }
648 void ConstructJob(Compilation &C, const JobAction &JA,
649 const InputInfo &Output, const InputInfoList &Inputs,
650 const llvm::opt::ArgList &TCArgs,
651 const char *LinkingOutput) const override;
654 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
656 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC,
657 RF_Full, llvm::sys::WEM_UTF16) {}
659 bool hasIntegratedAssembler() const override { return true; }
660 bool hasIntegratedCPP() const override { return true; }
661 bool isLinkJob() const override { return false; }
663 void ConstructJob(Compilation &C, const JobAction &JA,
664 const InputInfo &Output, const InputInfoList &Inputs,
665 const llvm::opt::ArgList &TCArgs,
666 const char *LinkingOutput) const override;
668 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
669 const InputInfo &Output,
670 const InputInfoList &Inputs,
671 const llvm::opt::ArgList &TCArgs,
672 const char *LinkingOutput) const;
674 } // end namespace visualstudio
677 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
678 const llvm::Triple &Triple);
681 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
682 // We simply use "clang -cc1" for those actions.
683 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
685 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
688 bool hasIntegratedCPP() 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;
695 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
697 Link(const ToolChain &TC) : Tool("XCore::Link",
700 bool hasIntegratedCPP() const override { return false; }
701 bool isLinkJob() const override { return true; }
702 void ConstructJob(Compilation &C, const JobAction &JA,
703 const InputInfo &Output, const InputInfoList &Inputs,
704 const llvm::opt::ArgList &TCArgs,
705 const char *LinkingOutput) const override;
707 } // end namespace XCore.
709 namespace CrossWindows {
710 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
712 Assemble(const ToolChain &TC) : Tool("CrossWindows::Assemble", "as", TC) { }
714 bool hasIntegratedCPP() const override { return false; }
716 void ConstructJob(Compilation &C, const JobAction &JA,
717 const InputInfo &Output, const InputInfoList &Inputs,
718 const llvm::opt::ArgList &TCArgs,
719 const char *LinkingOutput) const override;
722 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
724 Link(const ToolChain &TC) : Tool("CrossWindows::Link", "ld", TC, RF_Full) {}
726 bool hasIntegratedCPP() const override { return false; }
727 bool isLinkJob() const override { return true; }
729 void ConstructJob(Compilation &C, const JobAction &JA,
730 const InputInfo &Output, const InputInfoList &Inputs,
731 const llvm::opt::ArgList &TCArgs,
732 const char *LinkingOutput) const override;
736 /// SHAVE tools -- Directly call moviCompile and moviAsm
738 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
740 Compile(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
742 bool hasIntegratedCPP() const override { return true; }
744 void ConstructJob(Compilation &C, const JobAction &JA,
745 const InputInfo &Output, const InputInfoList &Inputs,
746 const llvm::opt::ArgList &TCArgs,
747 const char *LinkingOutput) const override;
750 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
752 Assemble(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
754 bool hasIntegratedCPP() const override { return false; } // not sure.
756 void ConstructJob(Compilation &C, const JobAction &JA,
757 const InputInfo &Output, const InputInfoList &Inputs,
758 const llvm::opt::ArgList &TCArgs,
759 const char *LinkingOutput) const override;
761 } // end namespace SHAVE
763 } // end namespace tools
764 } // end namespace driver
765 } // end namespace clang