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/Driver/Tool.h"
14 #include "clang/Driver/Types.h"
15 #include "clang/Driver/Util.h"
16 #include "llvm/ADT/Triple.h"
17 #include "llvm/Option/Option.h"
18 #include "llvm/Support/Compiler.h"
27 namespace toolchains {
33 namespace visualstudio {
37 using llvm::opt::ArgStringList;
39 /// \brief Clang compiler tool.
40 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
42 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
43 const InputInfo &Input);
44 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
45 const InputInfoList &Inputs);
46 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
47 const InputInfoList &Inputs);
50 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
52 const llvm::opt::ArgList &Args,
53 llvm::opt::ArgStringList &CmdArgs,
54 const InputInfo &Output,
55 const InputInfoList &Inputs) const;
57 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs) const;
59 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
60 llvm::opt::ArgStringList &CmdArgs,
61 bool KernelOrKext) const;
62 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
63 llvm::opt::ArgStringList &CmdArgs) const;
64 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
65 llvm::opt::ArgStringList &CmdArgs) const;
66 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
67 llvm::opt::ArgStringList &CmdArgs) const;
68 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
69 llvm::opt::ArgStringList &CmdArgs) const;
70 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
71 llvm::opt::ArgStringList &CmdArgs) const;
72 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
73 llvm::opt::ArgStringList &CmdArgs) const;
74 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
75 llvm::opt::ArgStringList &CmdArgs) const;
76 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
77 llvm::opt::ArgStringList &CmdArgs) const;
79 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
81 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
82 llvm::opt::ArgStringList &cmdArgs,
83 RewriteKind rewrite) const;
85 void AddClangCLArgs(const llvm::opt::ArgList &Args,
86 llvm::opt::ArgStringList &CmdArgs) const;
88 visualstudio::Compile *getCLFallback() const;
90 mutable std::unique_ptr<visualstudio::Compile> CLFallback;
93 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
95 bool hasGoodDiagnostics() const override { return true; }
96 bool hasIntegratedAssembler() const override { return true; }
97 bool hasIntegratedCPP() const override { return true; }
98 bool canEmitIR() const override { return true; }
100 void ConstructJob(Compilation &C, const JobAction &JA,
101 const InputInfo &Output, const InputInfoList &Inputs,
102 const llvm::opt::ArgList &TCArgs,
103 const char *LinkingOutput) const override;
106 /// \brief Clang integrated assembler tool.
107 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
109 ClangAs(const ToolChain &TC) : Tool("clang::as",
110 "clang integrated assembler", TC,
112 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
113 llvm::opt::ArgStringList &CmdArgs) const;
114 bool hasGoodDiagnostics() const override { return true; }
115 bool hasIntegratedAssembler() const override { return false; }
116 bool hasIntegratedCPP() const override { return false; }
118 void ConstructJob(Compilation &C, const JobAction &JA,
119 const InputInfo &Output, const InputInfoList &Inputs,
120 const llvm::opt::ArgList &TCArgs,
121 const char *LinkingOutput) const override;
124 /// \brief Base class for all GNU tools that provide the same behavior when
125 /// it comes to response files support
126 class GnuTool : public Tool {
127 virtual void anchor();
130 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
131 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
134 /// gcc - Generic GCC tool implementations.
136 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
138 Common(const char *Name, const char *ShortName,
139 const ToolChain &TC) : GnuTool(Name, ShortName, TC) {}
141 void ConstructJob(Compilation &C, const JobAction &JA,
142 const InputInfo &Output,
143 const InputInfoList &Inputs,
144 const llvm::opt::ArgList &TCArgs,
145 const char *LinkingOutput) const override;
147 /// RenderExtraToolArgs - Render any arguments necessary to force
148 /// the particular tool mode.
150 RenderExtraToolArgs(const JobAction &JA,
151 llvm::opt::ArgStringList &CmdArgs) const = 0;
154 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
156 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
157 "gcc preprocessor", TC) {}
159 bool hasGoodDiagnostics() const override { return true; }
160 bool hasIntegratedCPP() const override { return false; }
162 void RenderExtraToolArgs(const JobAction &JA,
163 llvm::opt::ArgStringList &CmdArgs) const override;
166 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
168 Compile(const ToolChain &TC) : Common("gcc::Compile",
169 "gcc frontend", TC) {}
171 bool hasGoodDiagnostics() const override { return true; }
172 bool hasIntegratedCPP() const override { return true; }
174 void RenderExtraToolArgs(const JobAction &JA,
175 llvm::opt::ArgStringList &CmdArgs) const override;
178 class LLVM_LIBRARY_VISIBILITY Link : public Common {
180 Link(const ToolChain &TC) : Common("gcc::Link",
181 "linker (via gcc)", TC) {}
183 bool hasIntegratedCPP() const override { return false; }
184 bool isLinkJob() const override { return true; }
186 void RenderExtraToolArgs(const JobAction &JA,
187 llvm::opt::ArgStringList &CmdArgs) const override;
189 } // end namespace gcc
192 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
193 // We simply use "clang -cc1" for those actions.
194 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
196 Assemble(const ToolChain &TC) : GnuTool("hexagon::Assemble",
199 bool hasIntegratedCPP() const override { return false; }
201 void RenderExtraToolArgs(const JobAction &JA,
202 llvm::opt::ArgStringList &CmdArgs) const;
203 void ConstructJob(Compilation &C, const JobAction &JA,
204 const InputInfo &Output, const InputInfoList &Inputs,
205 const llvm::opt::ArgList &TCArgs,
206 const char *LinkingOutput) const override;
209 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
211 Link(const ToolChain &TC) : GnuTool("hexagon::Link",
214 bool hasIntegratedCPP() const override { return false; }
215 bool isLinkJob() const override { return true; }
217 virtual void RenderExtraToolArgs(const JobAction &JA,
218 llvm::opt::ArgStringList &CmdArgs) const;
219 void ConstructJob(Compilation &C, const JobAction &JA,
220 const InputInfo &Output, const InputInfoList &Inputs,
221 const llvm::opt::ArgList &TCArgs,
222 const char *LinkingOutput) const override;
224 } // end namespace hexagon.
227 StringRef getARMTargetCPU(const llvm::opt::ArgList &Args,
228 const llvm::Triple &Triple);
229 const StringRef getARMArch(const llvm::opt::ArgList &Args,
230 const llvm::Triple &Triple);
231 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
232 const llvm::Triple &Triple);
233 const char* getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch);
235 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs, const llvm::Triple &Triple);
243 NanEncoding getSupportedNanEncoding(StringRef &CPU);
244 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
245 const llvm::Triple &Triple, StringRef &CPUName,
247 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
248 bool isUCLibc(const llvm::opt::ArgList &Args);
249 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
250 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
255 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
258 /// cloudabi -- Directly call GNU Binutils linker
260 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
262 Link(const ToolChain &TC) : GnuTool("cloudabi::Link", "linker", TC) {}
264 bool hasIntegratedCPP() const override { return false; }
265 bool isLinkJob() const override { return true; }
267 void ConstructJob(Compilation &C, const JobAction &JA,
268 const InputInfo &Output, const InputInfoList &Inputs,
269 const llvm::opt::ArgList &TCArgs,
270 const char *LinkingOutput) const override;
272 } // end namespace cloudabi
275 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
276 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
278 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
279 virtual void anchor();
281 void AddMachOArch(const llvm::opt::ArgList &Args,
282 llvm::opt::ArgStringList &CmdArgs) const;
284 const toolchains::MachO &getMachOToolChain() const {
285 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
290 const char *Name, const char *ShortName, const ToolChain &TC,
291 ResponseFileSupport ResponseSupport = RF_None,
292 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
293 const char *ResponseFlag = "@")
294 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
298 class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool {
300 Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
303 bool hasIntegratedCPP() const override { return false; }
305 void ConstructJob(Compilation &C, const JobAction &JA,
306 const InputInfo &Output, const InputInfoList &Inputs,
307 const llvm::opt::ArgList &TCArgs,
308 const char *LinkingOutput) const override;
311 class LLVM_LIBRARY_VISIBILITY Link : public MachOTool {
312 bool NeedsTempPath(const InputInfoList &Inputs) const;
313 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
314 llvm::opt::ArgStringList &CmdArgs,
315 const InputInfoList &Inputs) const;
318 Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC,
319 RF_FileList, llvm::sys::WEM_UTF8,
322 bool hasIntegratedCPP() const override { return false; }
323 bool isLinkJob() const override { return true; }
325 void ConstructJob(Compilation &C, const JobAction &JA,
326 const InputInfo &Output, const InputInfoList &Inputs,
327 const llvm::opt::ArgList &TCArgs,
328 const char *LinkingOutput) const override;
331 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
333 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", 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 Dsymutil : public MachOTool {
345 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
348 bool hasIntegratedCPP() const override { return false; }
349 bool isDsymutilJob() const override { return true; }
351 void ConstructJob(Compilation &C, const JobAction &JA,
352 const InputInfo &Output,
353 const InputInfoList &Inputs,
354 const llvm::opt::ArgList &TCArgs,
355 const char *LinkingOutput) const override;
358 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
360 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
363 bool hasIntegratedCPP() const override { return false; }
365 void ConstructJob(Compilation &C, const JobAction &JA,
366 const InputInfo &Output, const InputInfoList &Inputs,
367 const llvm::opt::ArgList &TCArgs,
368 const char *LinkingOutput) const override;
373 /// openbsd -- Directly call GNU Binutils assembler and linker
375 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
377 Assemble(const ToolChain &TC) : GnuTool("openbsd::Assemble", "assembler",
380 bool hasIntegratedCPP() const override { return false; }
382 void ConstructJob(Compilation &C, const JobAction &JA,
383 const InputInfo &Output,
384 const InputInfoList &Inputs,
385 const llvm::opt::ArgList &TCArgs,
386 const char *LinkingOutput) const override;
388 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
390 Link(const ToolChain &TC) : GnuTool("openbsd::Link", "linker", TC) {}
392 bool hasIntegratedCPP() const override { return false; }
393 bool isLinkJob() const override { return true; }
395 void ConstructJob(Compilation &C, const JobAction &JA,
396 const InputInfo &Output, const InputInfoList &Inputs,
397 const llvm::opt::ArgList &TCArgs,
398 const char *LinkingOutput) const override;
400 } // end namespace openbsd
402 /// bitrig -- Directly call GNU Binutils assembler and linker
404 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
406 Assemble(const ToolChain &TC) : GnuTool("bitrig::Assemble", "assembler",
409 bool hasIntegratedCPP() const override { return false; }
411 void ConstructJob(Compilation &C, const JobAction &JA,
412 const InputInfo &Output, const InputInfoList &Inputs,
413 const llvm::opt::ArgList &TCArgs,
414 const char *LinkingOutput) const override;
416 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
418 Link(const ToolChain &TC) : GnuTool("bitrig::Link", "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 bitrig
430 /// freebsd -- Directly call GNU Binutils assembler and linker
432 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
434 Assemble(const ToolChain &TC) : GnuTool("freebsd::Assemble", "assembler",
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;
444 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
446 Link(const ToolChain &TC) : GnuTool("freebsd::Link", "linker", TC) {}
448 bool hasIntegratedCPP() const override { return false; }
449 bool isLinkJob() const override { return true; }
451 void ConstructJob(Compilation &C, const JobAction &JA,
452 const InputInfo &Output, const InputInfoList &Inputs,
453 const llvm::opt::ArgList &TCArgs,
454 const char *LinkingOutput) const override;
456 } // end namespace freebsd
458 /// netbsd -- Directly call GNU Binutils assembler and linker
460 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
463 Assemble(const ToolChain &TC)
464 : GnuTool("netbsd::Assemble", "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;
473 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
476 Link(const ToolChain &TC)
477 : GnuTool("netbsd::Link", "linker", TC) {}
479 bool hasIntegratedCPP() const override { return false; }
480 bool isLinkJob() const override { return true; }
482 void ConstructJob(Compilation &C, const JobAction &JA,
483 const InputInfo &Output, const InputInfoList &Inputs,
484 const llvm::opt::ArgList &TCArgs,
485 const char *LinkingOutput) const override;
487 } // end namespace netbsd
489 /// Directly call GNU Binutils' assembler and linker.
491 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
493 Assemble(const ToolChain &TC) : GnuTool("GNU::Assemble", "assembler", TC) {}
495 bool hasIntegratedCPP() const override { return false; }
497 void ConstructJob(Compilation &C, const JobAction &JA,
498 const InputInfo &Output,
499 const InputInfoList &Inputs,
500 const llvm::opt::ArgList &TCArgs,
501 const char *LinkingOutput) const override;
503 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
505 Link(const ToolChain &TC) : GnuTool("GNU::Link", "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,
512 const InputInfoList &Inputs,
513 const llvm::opt::ArgList &TCArgs,
514 const char *LinkingOutput) const override;
518 namespace nacltools {
519 class LLVM_LIBRARY_VISIBILITY AssembleARM : public gnutools::Assemble {
521 AssembleARM(const ToolChain &TC) : gnutools::Assemble(TC) {}
523 void ConstructJob(Compilation &C, const JobAction &JA,
524 const InputInfo &Output,
525 const InputInfoList &Inputs,
526 const llvm::opt::ArgList &TCArgs,
527 const char *LinkingOutput) const override;
529 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
531 Link(const ToolChain &TC) : Tool("NaCl::Link", "linker", TC) {}
533 bool hasIntegratedCPP() const override { return false; }
534 bool isLinkJob() const override { return true; }
536 void ConstructJob(Compilation &C, const JobAction &JA,
537 const InputInfo &Output,
538 const InputInfoList &Inputs,
539 const llvm::opt::ArgList &TCArgs,
540 const char *LinkingOutput) const override;
544 /// minix -- Directly call GNU Binutils assembler and linker
546 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
548 Assemble(const ToolChain &TC) : GnuTool("minix::Assemble", "assembler",
551 bool hasIntegratedCPP() const override { return false; }
553 void ConstructJob(Compilation &C, const JobAction &JA,
554 const InputInfo &Output,
555 const InputInfoList &Inputs,
556 const llvm::opt::ArgList &TCArgs,
557 const char *LinkingOutput) const override;
559 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
561 Link(const ToolChain &TC) : GnuTool("minix::Link", "linker", TC) {}
563 bool hasIntegratedCPP() const override { return false; }
564 bool isLinkJob() const override { return true; }
566 void ConstructJob(Compilation &C, const JobAction &JA,
567 const InputInfo &Output,
568 const InputInfoList &Inputs,
569 const llvm::opt::ArgList &TCArgs,
570 const char *LinkingOutput) const override;
572 } // end namespace minix
574 /// solaris -- Directly call Solaris assembler and linker
576 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
578 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
581 bool hasIntegratedCPP() const override { return false; }
583 void ConstructJob(Compilation &C, const JobAction &JA,
584 const InputInfo &Output, const InputInfoList &Inputs,
585 const llvm::opt::ArgList &TCArgs,
586 const char *LinkingOutput) const override;
588 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
590 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
592 bool hasIntegratedCPP() const override { return false; }
593 bool isLinkJob() const override { return true; }
595 void ConstructJob(Compilation &C, const JobAction &JA,
596 const InputInfo &Output, const InputInfoList &Inputs,
597 const llvm::opt::ArgList &TCArgs,
598 const char *LinkingOutput) const override;
600 } // end namespace solaris
602 /// dragonfly -- Directly call GNU Binutils assembler and linker
603 namespace dragonfly {
604 class LLVM_LIBRARY_VISIBILITY Assemble : public GnuTool {
606 Assemble(const ToolChain &TC) : GnuTool("dragonfly::Assemble", "assembler",
609 bool hasIntegratedCPP() const override { return false; }
611 void ConstructJob(Compilation &C, const JobAction &JA,
612 const InputInfo &Output, const InputInfoList &Inputs,
613 const llvm::opt::ArgList &TCArgs,
614 const char *LinkingOutput) const override;
616 class LLVM_LIBRARY_VISIBILITY Link : public GnuTool {
618 Link(const ToolChain &TC) : GnuTool("dragonfly::Link", "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,
625 const InputInfoList &Inputs,
626 const llvm::opt::ArgList &TCArgs,
627 const char *LinkingOutput) const override;
629 } // end namespace dragonfly
631 /// Visual studio tools.
632 namespace visualstudio {
633 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
635 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC,
636 RF_Full, llvm::sys::WEM_UTF16) {}
638 bool hasIntegratedCPP() const override { return false; }
639 bool isLinkJob() const override { return true; }
641 void ConstructJob(Compilation &C, const JobAction &JA,
642 const InputInfo &Output, const InputInfoList &Inputs,
643 const llvm::opt::ArgList &TCArgs,
644 const char *LinkingOutput) const override;
647 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
649 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC,
650 RF_Full, llvm::sys::WEM_UTF16) {}
652 bool hasIntegratedAssembler() const override { return true; }
653 bool hasIntegratedCPP() const override { return true; }
654 bool isLinkJob() const override { return false; }
656 void ConstructJob(Compilation &C, const JobAction &JA,
657 const InputInfo &Output, const InputInfoList &Inputs,
658 const llvm::opt::ArgList &TCArgs,
659 const char *LinkingOutput) const override;
661 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
662 const InputInfo &Output,
663 const InputInfoList &Inputs,
664 const llvm::opt::ArgList &TCArgs,
665 const char *LinkingOutput) const;
667 } // end namespace visualstudio
670 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
671 const llvm::Triple &Triple);
674 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
675 // We simply use "clang -cc1" for those actions.
676 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
678 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
681 bool hasIntegratedCPP() const override { return false; }
682 void ConstructJob(Compilation &C, const JobAction &JA,
683 const InputInfo &Output, const InputInfoList &Inputs,
684 const llvm::opt::ArgList &TCArgs,
685 const char *LinkingOutput) const override;
688 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
690 Link(const ToolChain &TC) : Tool("XCore::Link",
693 bool hasIntegratedCPP() const override { return false; }
694 bool isLinkJob() const override { return true; }
695 void ConstructJob(Compilation &C, const JobAction &JA,
696 const InputInfo &Output, const InputInfoList &Inputs,
697 const llvm::opt::ArgList &TCArgs,
698 const char *LinkingOutput) const override;
700 } // end namespace XCore.
702 namespace CrossWindows {
703 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
705 Assemble(const ToolChain &TC) : Tool("CrossWindows::Assemble", "as", TC) { }
707 bool hasIntegratedCPP() const override { return false; }
709 void ConstructJob(Compilation &C, const JobAction &JA,
710 const InputInfo &Output, const InputInfoList &Inputs,
711 const llvm::opt::ArgList &TCArgs,
712 const char *LinkingOutput) const override;
715 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
717 Link(const ToolChain &TC) : Tool("CrossWindows::Link", "ld", TC, RF_Full) {}
719 bool hasIntegratedCPP() const override { return false; }
720 bool isLinkJob() const override { return true; }
722 void ConstructJob(Compilation &C, const JobAction &JA,
723 const InputInfo &Output, const InputInfoList &Inputs,
724 const llvm::opt::ArgList &TCArgs,
725 const char *LinkingOutput) const override;
729 } // end namespace toolchains
730 } // end namespace driver
731 } // end namespace clang