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/DebugInfoOptions.h"
14 #include "clang/Basic/VersionTuple.h"
15 #include "clang/Driver/Tool.h"
16 #include "clang/Driver/Types.h"
17 #include "clang/Driver/Util.h"
18 #include "llvm/ADT/Triple.h"
19 #include "llvm/Option/Option.h"
20 #include "llvm/Support/Compiler.h"
29 namespace toolchains {
35 namespace visualstudio {
39 using llvm::opt::ArgStringList;
41 SmallString<128> getCompilerRT(const ToolChain &TC,
42 const llvm::opt::ArgList &Args,
43 StringRef Component, bool Shared = false);
45 /// \brief Clang compiler tool.
46 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
48 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
49 const InputInfo &Input);
50 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
51 const InputInfoList &Inputs);
52 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
53 const InputInfoList &Inputs);
56 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
57 const Driver &D, const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs,
59 const InputInfo &Output,
60 const InputInfoList &Inputs,
61 const ToolChain *AuxToolChain) const;
63 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
64 llvm::opt::ArgStringList &CmdArgs) const;
65 void AddARMTargetArgs(const llvm::Triple &Triple,
66 const llvm::opt::ArgList &Args,
67 llvm::opt::ArgStringList &CmdArgs,
68 bool KernelOrKext) const;
69 void AddARM64TargetArgs(const llvm::opt::ArgList &Args,
70 llvm::opt::ArgStringList &CmdArgs) const;
71 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
72 llvm::opt::ArgStringList &CmdArgs) const;
73 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
74 llvm::opt::ArgStringList &CmdArgs) const;
75 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
76 llvm::opt::ArgStringList &CmdArgs) const;
77 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
78 llvm::opt::ArgStringList &CmdArgs) const;
79 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
80 llvm::opt::ArgStringList &CmdArgs) const;
81 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
82 llvm::opt::ArgStringList &CmdArgs) const;
83 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
84 llvm::opt::ArgStringList &CmdArgs) const;
85 void AddLanaiTargetArgs(const llvm::opt::ArgList &Args,
86 llvm::opt::ArgStringList &CmdArgs) const;
87 void AddWebAssemblyTargetArgs(const llvm::opt::ArgList &Args,
88 llvm::opt::ArgStringList &CmdArgs) const;
90 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
92 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
93 llvm::opt::ArgStringList &cmdArgs,
94 RewriteKind rewrite) const;
96 void AddClangCLArgs(const llvm::opt::ArgList &Args, types::ID InputType,
97 llvm::opt::ArgStringList &CmdArgs,
98 codegenoptions::DebugInfoKind *DebugInfoKind,
99 bool *EmitCodeView) const;
101 visualstudio::Compiler *getCLFallback() const;
103 mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
106 // CAUTION! The first constructor argument ("clang") is not arbitrary,
107 // as it is for other tools. Some operations on a Tool actually test
108 // whether that tool is Clang based on the Tool's Name as a string.
109 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC, RF_Full) {}
111 bool hasGoodDiagnostics() const override { return true; }
112 bool hasIntegratedAssembler() const override { return true; }
113 bool hasIntegratedCPP() const override { return true; }
114 bool canEmitIR() const override { return true; }
116 void ConstructJob(Compilation &C, const JobAction &JA,
117 const InputInfo &Output, const InputInfoList &Inputs,
118 const llvm::opt::ArgList &TCArgs,
119 const char *LinkingOutput) const override;
122 /// \brief Clang integrated assembler tool.
123 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
125 ClangAs(const ToolChain &TC)
126 : Tool("clang::as", "clang integrated assembler", TC, RF_Full) {}
127 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
128 llvm::opt::ArgStringList &CmdArgs) const;
129 bool hasGoodDiagnostics() const override { return true; }
130 bool hasIntegratedAssembler() const override { return false; }
131 bool hasIntegratedCPP() const override { return false; }
133 void ConstructJob(Compilation &C, const JobAction &JA,
134 const InputInfo &Output, const InputInfoList &Inputs,
135 const llvm::opt::ArgList &TCArgs,
136 const char *LinkingOutput) const override;
139 /// \brief Base class for all GNU tools that provide the same behavior when
140 /// it comes to response files support
141 class LLVM_LIBRARY_VISIBILITY GnuTool : public Tool {
142 virtual void anchor();
145 GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
146 : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
149 /// gcc - Generic GCC tool implementations.
151 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
153 Common(const char *Name, const char *ShortName, const ToolChain &TC)
154 : GnuTool(Name, ShortName, TC) {}
156 // A gcc tool has an "integrated" assembler that it will call to produce an
157 // object. Let it use that assembler so that we don't have to deal with
158 // assembly syntax incompatibilities.
159 bool hasIntegratedAssembler() const override { return true; }
160 void ConstructJob(Compilation &C, const JobAction &JA,
161 const InputInfo &Output, const InputInfoList &Inputs,
162 const llvm::opt::ArgList &TCArgs,
163 const char *LinkingOutput) const override;
165 /// RenderExtraToolArgs - Render any arguments necessary to force
166 /// the particular tool mode.
167 virtual void RenderExtraToolArgs(const JobAction &JA,
168 llvm::opt::ArgStringList &CmdArgs) const = 0;
171 class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
173 Preprocessor(const ToolChain &TC)
174 : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
176 bool hasGoodDiagnostics() const override { return true; }
177 bool hasIntegratedCPP() const override { return false; }
179 void RenderExtraToolArgs(const JobAction &JA,
180 llvm::opt::ArgStringList &CmdArgs) const override;
183 class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
185 Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
187 bool hasGoodDiagnostics() const override { return true; }
188 bool hasIntegratedCPP() const override { return true; }
190 void RenderExtraToolArgs(const JobAction &JA,
191 llvm::opt::ArgStringList &CmdArgs) const override;
194 class LLVM_LIBRARY_VISIBILITY Linker : public Common {
196 Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
198 bool hasIntegratedCPP() const override { return false; }
199 bool isLinkJob() const override { return true; }
201 void RenderExtraToolArgs(const JobAction &JA,
202 llvm::opt::ArgStringList &CmdArgs) const override;
204 } // end namespace gcc
207 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
209 // We simply use "clang -cc1" for those actions.
210 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
212 Assembler(const ToolChain &TC)
213 : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
215 bool hasIntegratedCPP() const override { return false; }
217 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;
225 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
227 Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
229 bool hasIntegratedCPP() const override { return false; }
230 bool isLinkJob() const override { return true; }
232 virtual void RenderExtraToolArgs(const JobAction &JA,
233 llvm::opt::ArgStringList &CmdArgs) const;
234 void ConstructJob(Compilation &C, const JobAction &JA,
235 const InputInfo &Output, const InputInfoList &Inputs,
236 const llvm::opt::ArgList &TCArgs,
237 const char *LinkingOutput) const override;
239 } // end namespace hexagon.
243 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
245 Linker(const ToolChain &TC) : GnuTool("amdgpu::Linker", "ld.lld", TC) {}
246 bool isLinkJob() const override { return true; }
247 bool hasIntegratedCPP() const override { return false; }
248 void ConstructJob(Compilation &C, const JobAction &JA,
249 const InputInfo &Output, const InputInfoList &Inputs,
250 const llvm::opt::ArgList &TCArgs,
251 const char *LinkingOutput) const override;
254 } // end namespace amdgpu
258 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
260 explicit Linker(const ToolChain &TC);
261 bool isLinkJob() const override;
262 bool hasIntegratedCPP() const override;
263 void ConstructJob(Compilation &C, const JobAction &JA,
264 const InputInfo &Output, const InputInfoList &Inputs,
265 const llvm::opt::ArgList &TCArgs,
266 const char *LinkingOutput) const override;
269 } // end namespace wasm
272 std::string getARMTargetCPU(StringRef CPU, StringRef Arch,
273 const llvm::Triple &Triple);
274 const std::string getARMArch(StringRef Arch,
275 const llvm::Triple &Triple);
276 StringRef getARMCPUForMArch(StringRef Arch, const llvm::Triple &Triple);
277 StringRef getLLVMArchSuffixForARM(StringRef CPU, StringRef Arch,
278 const llvm::Triple &Triple);
280 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
281 const llvm::Triple &Triple);
282 } // end namespace arm
285 typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
287 enum class FloatABI {
293 NanEncoding getSupportedNanEncoding(StringRef &CPU);
294 bool hasCompactBranches(StringRef &CPU);
295 void getMipsCPUAndABI(const llvm::opt::ArgList &Args,
296 const llvm::Triple &Triple, StringRef &CPUName,
298 std::string getMipsABILibSuffix(const llvm::opt::ArgList &Args,
299 const llvm::Triple &Triple);
300 bool hasMipsAbiArg(const llvm::opt::ArgList &Args, const char *Value);
301 bool isUCLibc(const llvm::opt::ArgList &Args);
302 bool isNaN2008(const llvm::opt::ArgList &Args, const llvm::Triple &Triple);
303 bool isFP64ADefault(const llvm::Triple &Triple, StringRef CPUName);
304 bool isFPXXDefault(const llvm::Triple &Triple, StringRef CPUName,
305 StringRef ABIName, mips::FloatABI FloatABI);
306 bool shouldUseFPXX(const llvm::opt::ArgList &Args, const llvm::Triple &Triple,
307 StringRef CPUName, StringRef ABIName,
308 mips::FloatABI FloatABI);
309 } // end namespace mips
312 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
313 } // end namespace ppc
315 /// cloudabi -- Directly call GNU Binutils linker
317 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
319 Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
321 bool hasIntegratedCPP() const override { return false; }
322 bool isLinkJob() const override { return true; }
324 void ConstructJob(Compilation &C, const JobAction &JA,
325 const InputInfo &Output, const InputInfoList &Inputs,
326 const llvm::opt::ArgList &TCArgs,
327 const char *LinkingOutput) const override;
329 } // end namespace cloudabi
332 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
333 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
335 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
336 virtual void anchor();
339 void AddMachOArch(const llvm::opt::ArgList &Args,
340 llvm::opt::ArgStringList &CmdArgs) const;
342 const toolchains::MachO &getMachOToolChain() const {
343 return reinterpret_cast<const toolchains::MachO &>(getToolChain());
348 const char *Name, const char *ShortName, const ToolChain &TC,
349 ResponseFileSupport ResponseSupport = RF_None,
350 llvm::sys::WindowsEncodingMethod ResponseEncoding = llvm::sys::WEM_UTF8,
351 const char *ResponseFlag = "@")
352 : Tool(Name, ShortName, TC, ResponseSupport, ResponseEncoding,
356 class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
358 Assembler(const ToolChain &TC)
359 : MachOTool("darwin::Assembler", "assembler", TC) {}
361 bool hasIntegratedCPP() const override { return false; }
363 void ConstructJob(Compilation &C, const JobAction &JA,
364 const InputInfo &Output, const InputInfoList &Inputs,
365 const llvm::opt::ArgList &TCArgs,
366 const char *LinkingOutput) const override;
369 class LLVM_LIBRARY_VISIBILITY Linker : public MachOTool {
370 bool NeedsTempPath(const InputInfoList &Inputs) const;
371 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
372 llvm::opt::ArgStringList &CmdArgs,
373 const InputInfoList &Inputs) const;
376 Linker(const ToolChain &TC)
377 : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
378 llvm::sys::WEM_UTF8, "-filelist") {}
380 bool hasIntegratedCPP() const override { return false; }
381 bool isLinkJob() 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 Lipo : public MachOTool {
391 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
393 bool hasIntegratedCPP() const override { return false; }
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;
401 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
403 Dsymutil(const ToolChain &TC)
404 : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
406 bool hasIntegratedCPP() const override { return false; }
407 bool isDsymutilJob() const override { return true; }
409 void ConstructJob(Compilation &C, const JobAction &JA,
410 const InputInfo &Output, const InputInfoList &Inputs,
411 const llvm::opt::ArgList &TCArgs,
412 const char *LinkingOutput) const override;
415 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
417 VerifyDebug(const ToolChain &TC)
418 : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
420 bool hasIntegratedCPP() const override { return false; }
422 void ConstructJob(Compilation &C, const JobAction &JA,
423 const InputInfo &Output, const InputInfoList &Inputs,
424 const llvm::opt::ArgList &TCArgs,
425 const char *LinkingOutput) const override;
427 } // end namespace darwin
429 /// openbsd -- Directly call GNU Binutils assembler and linker
431 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
433 Assembler(const ToolChain &TC)
434 : GnuTool("openbsd::Assembler", "assembler", TC) {}
436 bool hasIntegratedCPP() const override { return false; }
438 void ConstructJob(Compilation &C, const JobAction &JA,
439 const InputInfo &Output, const InputInfoList &Inputs,
440 const llvm::opt::ArgList &TCArgs,
441 const char *LinkingOutput) const override;
444 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
446 Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "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 openbsd
458 /// bitrig -- Directly call GNU Binutils assembler and linker
460 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
462 Assembler(const ToolChain &TC)
463 : GnuTool("bitrig::Assembler", "assembler", TC) {}
465 bool hasIntegratedCPP() const override { return false; }
467 void ConstructJob(Compilation &C, const JobAction &JA,
468 const InputInfo &Output, const InputInfoList &Inputs,
469 const llvm::opt::ArgList &TCArgs,
470 const char *LinkingOutput) const override;
473 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
475 Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
477 bool hasIntegratedCPP() const override { return false; }
478 bool isLinkJob() const override { return true; }
480 void ConstructJob(Compilation &C, const JobAction &JA,
481 const InputInfo &Output, const InputInfoList &Inputs,
482 const llvm::opt::ArgList &TCArgs,
483 const char *LinkingOutput) const override;
485 } // end namespace bitrig
487 /// freebsd -- Directly call GNU Binutils assembler and linker
489 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
491 Assembler(const ToolChain &TC)
492 : GnuTool("freebsd::Assembler", "assembler", TC) {}
494 bool hasIntegratedCPP() const override { return false; }
496 void ConstructJob(Compilation &C, const JobAction &JA,
497 const InputInfo &Output, const InputInfoList &Inputs,
498 const llvm::opt::ArgList &TCArgs,
499 const char *LinkingOutput) const override;
502 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
504 Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
506 bool hasIntegratedCPP() const override { return false; }
507 bool isLinkJob() const override { return true; }
509 void ConstructJob(Compilation &C, const JobAction &JA,
510 const InputInfo &Output, const InputInfoList &Inputs,
511 const llvm::opt::ArgList &TCArgs,
512 const char *LinkingOutput) const override;
514 } // end namespace freebsd
516 /// netbsd -- Directly call GNU Binutils assembler and linker
518 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
520 Assembler(const ToolChain &TC)
521 : GnuTool("netbsd::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("netbsd::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 netbsd
545 /// Directly call GNU Binutils' assembler and linker.
547 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
549 Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
551 bool hasIntegratedCPP() const override { return false; }
553 void ConstructJob(Compilation &C, const JobAction &JA,
554 const InputInfo &Output, const InputInfoList &Inputs,
555 const llvm::opt::ArgList &TCArgs,
556 const char *LinkingOutput) const override;
559 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
561 Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "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, const InputInfoList &Inputs,
568 const llvm::opt::ArgList &TCArgs,
569 const char *LinkingOutput) const override;
571 } // end namespace gnutools
573 namespace nacltools {
574 class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
576 AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
578 void ConstructJob(Compilation &C, const JobAction &JA,
579 const InputInfo &Output, const InputInfoList &Inputs,
580 const llvm::opt::ArgList &TCArgs,
581 const char *LinkingOutput) const override;
584 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
586 Linker(const ToolChain &TC) : GnuTool("NaCl::Linker", "linker", TC) {}
588 bool hasIntegratedCPP() const override { return false; }
589 bool isLinkJob() const override { return true; }
591 void ConstructJob(Compilation &C, const JobAction &JA,
592 const InputInfo &Output, const InputInfoList &Inputs,
593 const llvm::opt::ArgList &TCArgs,
594 const char *LinkingOutput) const override;
596 } // end namespace nacltools
598 /// minix -- Directly call GNU Binutils assembler and linker
600 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
602 Assembler(const ToolChain &TC)
603 : GnuTool("minix::Assembler", "assembler", TC) {}
605 bool hasIntegratedCPP() const override { return false; }
607 void ConstructJob(Compilation &C, const JobAction &JA,
608 const InputInfo &Output, const InputInfoList &Inputs,
609 const llvm::opt::ArgList &TCArgs,
610 const char *LinkingOutput) const override;
613 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
615 Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
617 bool hasIntegratedCPP() const override { return false; }
618 bool isLinkJob() const override { return true; }
620 void ConstructJob(Compilation &C, const JobAction &JA,
621 const InputInfo &Output, const InputInfoList &Inputs,
622 const llvm::opt::ArgList &TCArgs,
623 const char *LinkingOutput) const override;
625 } // end namespace minix
627 /// solaris -- Directly call Solaris assembler and linker
629 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
631 Assembler(const ToolChain &TC)
632 : Tool("solaris::Assembler", "assembler", TC) {}
634 bool hasIntegratedCPP() const override { return false; }
636 void ConstructJob(Compilation &C, const JobAction &JA,
637 const InputInfo &Output, const InputInfoList &Inputs,
638 const llvm::opt::ArgList &TCArgs,
639 const char *LinkingOutput) const override;
642 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
644 Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
646 bool hasIntegratedCPP() const override { return false; }
647 bool isLinkJob() const override { return true; }
649 void ConstructJob(Compilation &C, const JobAction &JA,
650 const InputInfo &Output, const InputInfoList &Inputs,
651 const llvm::opt::ArgList &TCArgs,
652 const char *LinkingOutput) const override;
654 } // end namespace solaris
656 /// dragonfly -- Directly call GNU Binutils assembler and linker
657 namespace dragonfly {
658 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
660 Assembler(const ToolChain &TC)
661 : GnuTool("dragonfly::Assembler", "assembler", TC) {}
663 bool hasIntegratedCPP() const override { return false; }
665 void ConstructJob(Compilation &C, const JobAction &JA,
666 const InputInfo &Output, const InputInfoList &Inputs,
667 const llvm::opt::ArgList &TCArgs,
668 const char *LinkingOutput) const override;
671 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
673 Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
675 bool hasIntegratedCPP() const override { return false; }
676 bool isLinkJob() const override { return true; }
678 void ConstructJob(Compilation &C, const JobAction &JA,
679 const InputInfo &Output, const InputInfoList &Inputs,
680 const llvm::opt::ArgList &TCArgs,
681 const char *LinkingOutput) const override;
683 } // end namespace dragonfly
685 /// Visual studio tools.
686 namespace visualstudio {
687 VersionTuple getMSVCVersion(const Driver *D, const ToolChain &TC,
688 const llvm::Triple &Triple,
689 const llvm::opt::ArgList &Args, bool IsWindowsMSVC);
691 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
693 Linker(const ToolChain &TC)
694 : Tool("visualstudio::Linker", "linker", TC, RF_Full,
695 llvm::sys::WEM_UTF16) {}
697 bool hasIntegratedCPP() const override { return false; }
698 bool isLinkJob() const override { return true; }
700 void ConstructJob(Compilation &C, const JobAction &JA,
701 const InputInfo &Output, const InputInfoList &Inputs,
702 const llvm::opt::ArgList &TCArgs,
703 const char *LinkingOutput) const override;
706 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
708 Compiler(const ToolChain &TC)
709 : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
710 llvm::sys::WEM_UTF16) {}
712 bool hasIntegratedAssembler() const override { return true; }
713 bool hasIntegratedCPP() const override { return true; }
714 bool isLinkJob() 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;
721 std::unique_ptr<Command> GetCommand(Compilation &C, const JobAction &JA,
722 const InputInfo &Output,
723 const InputInfoList &Inputs,
724 const llvm::opt::ArgList &TCArgs,
725 const char *LinkingOutput) const;
727 } // end namespace visualstudio
729 /// MinGW -- Directly call GNU Binutils assembler and linker
731 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
733 Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
735 bool hasIntegratedCPP() const override { return false; }
737 void ConstructJob(Compilation &C, const JobAction &JA,
738 const InputInfo &Output, const InputInfoList &Inputs,
739 const llvm::opt::ArgList &TCArgs,
740 const char *LinkingOutput) const override;
743 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
745 Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
747 bool hasIntegratedCPP() const override { return false; }
748 bool isLinkJob() const override { return true; }
750 void ConstructJob(Compilation &C, const JobAction &JA,
751 const InputInfo &Output, const InputInfoList &Inputs,
752 const llvm::opt::ArgList &TCArgs,
753 const char *LinkingOutput) const override;
756 void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
758 } // end namespace MinGW
761 enum class FloatABI {
768 FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
769 } // end namespace arm
772 enum class FloatABI {
778 FloatABI getPPCFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
779 } // end namespace ppc
782 enum class FloatABI {
788 FloatABI getSparcFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
789 } // end namespace sparc
792 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
794 // We simply use "clang -cc1" for those actions.
795 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
797 Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
799 bool hasIntegratedCPP() const override { return false; }
800 void ConstructJob(Compilation &C, const JobAction &JA,
801 const InputInfo &Output, const InputInfoList &Inputs,
802 const llvm::opt::ArgList &TCArgs,
803 const char *LinkingOutput) const override;
806 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
808 Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
810 bool hasIntegratedCPP() const override { return false; }
811 bool isLinkJob() const override { return true; }
812 void ConstructJob(Compilation &C, const JobAction &JA,
813 const InputInfo &Output, const InputInfoList &Inputs,
814 const llvm::opt::ArgList &TCArgs,
815 const char *LinkingOutput) const override;
817 } // end namespace XCore.
819 namespace CrossWindows {
820 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
822 Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
824 bool hasIntegratedCPP() const override { return false; }
826 void ConstructJob(Compilation &C, const JobAction &JA,
827 const InputInfo &Output, const InputInfoList &Inputs,
828 const llvm::opt::ArgList &TCArgs,
829 const char *LinkingOutput) const override;
832 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
834 Linker(const ToolChain &TC)
835 : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
837 bool hasIntegratedCPP() const override { return false; }
838 bool isLinkJob() const override { return true; }
840 void ConstructJob(Compilation &C, const JobAction &JA,
841 const InputInfo &Output, const InputInfoList &Inputs,
842 const llvm::opt::ArgList &TCArgs,
843 const char *LinkingOutput) const override;
845 } // end namespace CrossWindows
847 /// SHAVE tools -- Directly call moviCompile and moviAsm
849 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
851 Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
853 bool hasIntegratedCPP() const override { return true; }
855 void ConstructJob(Compilation &C, const JobAction &JA,
856 const InputInfo &Output, const InputInfoList &Inputs,
857 const llvm::opt::ArgList &TCArgs,
858 const char *LinkingOutput) const override;
861 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
863 Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
865 bool hasIntegratedCPP() const override { return false; } // not sure.
867 void ConstructJob(Compilation &C, const JobAction &JA,
868 const InputInfo &Output, const InputInfoList &Inputs,
869 const llvm::opt::ArgList &TCArgs,
870 const char *LinkingOutput) const override;
872 } // end namespace SHAVE
874 /// The Myriad toolchain uses tools that are in two different namespaces.
875 /// The Compiler and Assembler as defined above are in the SHAVE namespace,
876 /// whereas the linker, which accepts code for a mixture of Sparc and SHAVE,
877 /// is in the Myriad namespace.
879 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
881 Linker(const ToolChain &TC) : GnuTool("shave::Linker", "ld", TC) {}
882 bool hasIntegratedCPP() const override { return false; }
883 bool isLinkJob() const override { return true; }
884 void ConstructJob(Compilation &C, const JobAction &JA,
885 const InputInfo &Output, const InputInfoList &Inputs,
886 const llvm::opt::ArgList &TCArgs,
887 const char *LinkingOutput) const override;
889 } // end namespace Myriad
892 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
894 Assemble(const ToolChain &TC)
895 : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
897 bool hasIntegratedCPP() const override { return false; }
899 void ConstructJob(Compilation &C, const JobAction &JA,
900 const InputInfo &Output,
901 const InputInfoList &Inputs,
902 const llvm::opt::ArgList &TCArgs,
903 const char *LinkingOutput) const override;
906 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
908 Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
910 bool hasIntegratedCPP() const override { return false; }
911 bool isLinkJob() const override { return true; }
913 void ConstructJob(Compilation &C, const JobAction &JA,
914 const InputInfo &Output,
915 const InputInfoList &Inputs,
916 const llvm::opt::ArgList &TCArgs,
917 const char *LinkingOutput) const override;
919 } // end namespace PS4cpu
923 // Run ptxas, the NVPTX assembler.
924 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
926 Assembler(const ToolChain &TC)
927 : Tool("NVPTX::Assembler", "ptxas", TC, RF_Full, llvm::sys::WEM_UTF8,
930 bool hasIntegratedCPP() const override { return false; }
932 void ConstructJob(Compilation &C, const JobAction &JA,
933 const InputInfo &Output, const InputInfoList &Inputs,
934 const llvm::opt::ArgList &TCArgs,
935 const char *LinkingOutput) const override;
938 // Runs fatbinary, which combines GPU object files ("cubin" files) and/or PTX
939 // assembly into a single output file.
940 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
942 Linker(const ToolChain &TC)
943 : Tool("NVPTX::Linker", "fatbinary", TC, RF_Full, llvm::sys::WEM_UTF8,
946 bool hasIntegratedCPP() const override { return false; }
948 void ConstructJob(Compilation &C, const JobAction &JA,
949 const InputInfo &Output, const InputInfoList &Inputs,
950 const llvm::opt::ArgList &TCArgs,
951 const char *LinkingOutput) const override;
954 } // end namespace NVPTX
956 } // end namespace tools
957 } // end namespace driver
958 } // end namespace clang
960 #endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H