]> granicus.if.org Git - clang/blob - lib/Driver/Tools.h
[mips] Compact branch policy setting.
[clang] / lib / Driver / Tools.h
1 //===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef LLVM_CLANG_LIB_DRIVER_TOOLS_H
11 #define LLVM_CLANG_LIB_DRIVER_TOOLS_H
12
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"
21
22 namespace clang {
23 class ObjCRuntime;
24
25 namespace driver {
26 class Command;
27 class Driver;
28
29 namespace toolchains {
30 class MachO;
31 }
32
33 namespace tools {
34
35 namespace visualstudio {
36 class Compiler;
37 }
38
39 using llvm::opt::ArgStringList;
40
41 SmallString<128> getCompilerRT(const ToolChain &TC,
42                                const llvm::opt::ArgList &Args,
43                                StringRef Component, bool Shared = false);
44
45 /// \brief Clang compiler tool.
46 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
47 public:
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);
54
55 private:
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;
62
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;
89
90   enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
91
92   ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
93                                  llvm::opt::ArgStringList &cmdArgs,
94                                  RewriteKind rewrite) const;
95
96   void AddClangCLArgs(const llvm::opt::ArgList &Args, types::ID InputType,
97                       llvm::opt::ArgStringList &CmdArgs,
98                       codegenoptions::DebugInfoKind *DebugInfoKind,
99                       bool *EmitCodeView) const;
100
101   visualstudio::Compiler *getCLFallback() const;
102
103   mutable std::unique_ptr<visualstudio::Compiler> CLFallback;
104
105 public:
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) {}
110
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; }
115
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;
120 };
121
122 /// \brief Clang integrated assembler tool.
123 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
124 public:
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; }
132
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;
137 };
138
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();
143
144 public:
145   GnuTool(const char *Name, const char *ShortName, const ToolChain &TC)
146       : Tool(Name, ShortName, TC, RF_Full, llvm::sys::WEM_CurrentCodePage) {}
147 };
148
149 /// gcc - Generic GCC tool implementations.
150 namespace gcc {
151 class LLVM_LIBRARY_VISIBILITY Common : public GnuTool {
152 public:
153   Common(const char *Name, const char *ShortName, const ToolChain &TC)
154       : GnuTool(Name, ShortName, TC) {}
155
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;
164
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;
169 };
170
171 class LLVM_LIBRARY_VISIBILITY Preprocessor : public Common {
172 public:
173   Preprocessor(const ToolChain &TC)
174       : Common("gcc::Preprocessor", "gcc preprocessor", TC) {}
175
176   bool hasGoodDiagnostics() const override { return true; }
177   bool hasIntegratedCPP() const override { return false; }
178
179   void RenderExtraToolArgs(const JobAction &JA,
180                            llvm::opt::ArgStringList &CmdArgs) const override;
181 };
182
183 class LLVM_LIBRARY_VISIBILITY Compiler : public Common {
184 public:
185   Compiler(const ToolChain &TC) : Common("gcc::Compiler", "gcc frontend", TC) {}
186
187   bool hasGoodDiagnostics() const override { return true; }
188   bool hasIntegratedCPP() const override { return true; }
189
190   void RenderExtraToolArgs(const JobAction &JA,
191                            llvm::opt::ArgStringList &CmdArgs) const override;
192 };
193
194 class LLVM_LIBRARY_VISIBILITY Linker : public Common {
195 public:
196   Linker(const ToolChain &TC) : Common("gcc::Linker", "linker (via gcc)", TC) {}
197
198   bool hasIntegratedCPP() const override { return false; }
199   bool isLinkJob() const override { return true; }
200
201   void RenderExtraToolArgs(const JobAction &JA,
202                            llvm::opt::ArgStringList &CmdArgs) const override;
203 };
204 } // end namespace gcc
205
206 namespace hexagon {
207 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile
208 // and Compile.
209 // We simply use "clang -cc1" for those actions.
210 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
211 public:
212   Assembler(const ToolChain &TC)
213       : GnuTool("hexagon::Assembler", "hexagon-as", TC) {}
214
215   bool hasIntegratedCPP() const override { return false; }
216
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;
223 };
224
225 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
226 public:
227   Linker(const ToolChain &TC) : GnuTool("hexagon::Linker", "hexagon-ld", TC) {}
228
229   bool hasIntegratedCPP() const override { return false; }
230   bool isLinkJob() const override { return true; }
231
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;
238 };
239 } // end namespace hexagon.
240
241 namespace amdgpu {
242
243 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
244 public:
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;
252 };
253
254 } // end namespace amdgpu
255
256 namespace wasm {
257
258 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
259 public:
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;
267 };
268
269 } // end namespace wasm
270
271 namespace arm {
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);
279
280 void appendEBLinkFlags(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs,
281                        const llvm::Triple &Triple);
282 } // end namespace arm
283
284 namespace mips {
285 typedef enum { NanLegacy = 1, Nan2008 = 2 } NanEncoding;
286
287 enum class FloatABI {
288   Invalid,
289   Soft,
290   Hard,
291 };
292
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,
297                       StringRef &ABIName);
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
310
311 namespace ppc {
312 bool hasPPCAbiArg(const llvm::opt::ArgList &Args, const char *Value);
313 } // end namespace ppc
314
315 /// cloudabi -- Directly call GNU Binutils linker
316 namespace cloudabi {
317 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
318 public:
319   Linker(const ToolChain &TC) : GnuTool("cloudabi::Linker", "linker", TC) {}
320
321   bool hasIntegratedCPP() const override { return false; }
322   bool isLinkJob() const override { return true; }
323
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;
328 };
329 } // end namespace cloudabi
330
331 namespace darwin {
332 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
333 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
334
335 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
336   virtual void anchor();
337
338 protected:
339   void AddMachOArch(const llvm::opt::ArgList &Args,
340                     llvm::opt::ArgStringList &CmdArgs) const;
341
342   const toolchains::MachO &getMachOToolChain() const {
343     return reinterpret_cast<const toolchains::MachO &>(getToolChain());
344   }
345
346 public:
347   MachOTool(
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,
353              ResponseFlag) {}
354 };
355
356 class LLVM_LIBRARY_VISIBILITY Assembler : public MachOTool {
357 public:
358   Assembler(const ToolChain &TC)
359       : MachOTool("darwin::Assembler", "assembler", TC) {}
360
361   bool hasIntegratedCPP() const override { return false; }
362
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;
367 };
368
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;
374
375 public:
376   Linker(const ToolChain &TC)
377       : MachOTool("darwin::Linker", "linker", TC, RF_FileList,
378                   llvm::sys::WEM_UTF8, "-filelist") {}
379
380   bool hasIntegratedCPP() const override { return false; }
381   bool isLinkJob() const override { return true; }
382
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;
387 };
388
389 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
390 public:
391   Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
392
393   bool hasIntegratedCPP() const override { return false; }
394
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;
399 };
400
401 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
402 public:
403   Dsymutil(const ToolChain &TC)
404       : MachOTool("darwin::Dsymutil", "dsymutil", TC) {}
405
406   bool hasIntegratedCPP() const override { return false; }
407   bool isDsymutilJob() const override { return true; }
408
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;
413 };
414
415 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
416 public:
417   VerifyDebug(const ToolChain &TC)
418       : MachOTool("darwin::VerifyDebug", "dwarfdump", TC) {}
419
420   bool hasIntegratedCPP() const override { return false; }
421
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;
426 };
427 } // end namespace darwin
428
429 /// openbsd -- Directly call GNU Binutils assembler and linker
430 namespace openbsd {
431 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
432 public:
433   Assembler(const ToolChain &TC)
434       : GnuTool("openbsd::Assembler", "assembler", TC) {}
435
436   bool hasIntegratedCPP() const override { return false; }
437
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;
442 };
443
444 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
445 public:
446   Linker(const ToolChain &TC) : GnuTool("openbsd::Linker", "linker", TC) {}
447
448   bool hasIntegratedCPP() const override { return false; }
449   bool isLinkJob() const override { return true; }
450
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;
455 };
456 } // end namespace openbsd
457
458 /// bitrig -- Directly call GNU Binutils assembler and linker
459 namespace bitrig {
460 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
461 public:
462   Assembler(const ToolChain &TC)
463       : GnuTool("bitrig::Assembler", "assembler", TC) {}
464
465   bool hasIntegratedCPP() const override { return false; }
466
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;
471 };
472
473 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
474 public:
475   Linker(const ToolChain &TC) : GnuTool("bitrig::Linker", "linker", TC) {}
476
477   bool hasIntegratedCPP() const override { return false; }
478   bool isLinkJob() const override { return true; }
479
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;
484 };
485 } // end namespace bitrig
486
487 /// freebsd -- Directly call GNU Binutils assembler and linker
488 namespace freebsd {
489 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
490 public:
491   Assembler(const ToolChain &TC)
492       : GnuTool("freebsd::Assembler", "assembler", TC) {}
493
494   bool hasIntegratedCPP() const override { return false; }
495
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;
500 };
501
502 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
503 public:
504   Linker(const ToolChain &TC) : GnuTool("freebsd::Linker", "linker", TC) {}
505
506   bool hasIntegratedCPP() const override { return false; }
507   bool isLinkJob() const override { return true; }
508
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;
513 };
514 } // end namespace freebsd
515
516 /// netbsd -- Directly call GNU Binutils assembler and linker
517 namespace netbsd {
518 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
519 public:
520   Assembler(const ToolChain &TC)
521       : GnuTool("netbsd::Assembler", "assembler", TC) {}
522
523   bool hasIntegratedCPP() const override { return false; }
524
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;
529 };
530
531 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
532 public:
533   Linker(const ToolChain &TC) : GnuTool("netbsd::Linker", "linker", TC) {}
534
535   bool hasIntegratedCPP() const override { return false; }
536   bool isLinkJob() const override { return true; }
537
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;
542 };
543 } // end namespace netbsd
544
545 /// Directly call GNU Binutils' assembler and linker.
546 namespace gnutools {
547 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
548 public:
549   Assembler(const ToolChain &TC) : GnuTool("GNU::Assembler", "assembler", TC) {}
550
551   bool hasIntegratedCPP() const override { return false; }
552
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;
557 };
558
559 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
560 public:
561   Linker(const ToolChain &TC) : GnuTool("GNU::Linker", "linker", TC) {}
562
563   bool hasIntegratedCPP() const override { return false; }
564   bool isLinkJob() const override { return true; }
565
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;
570 };
571 } // end namespace gnutools
572
573 namespace nacltools {
574 class LLVM_LIBRARY_VISIBILITY AssemblerARM : public gnutools::Assembler {
575 public:
576   AssemblerARM(const ToolChain &TC) : gnutools::Assembler(TC) {}
577
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;
582 };
583
584 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
585 public:
586   Linker(const ToolChain &TC) : GnuTool("NaCl::Linker", "linker", TC) {}
587
588   bool hasIntegratedCPP() const override { return false; }
589   bool isLinkJob() const override { return true; }
590
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;
595 };
596 } // end namespace nacltools
597
598 /// minix -- Directly call GNU Binutils assembler and linker
599 namespace minix {
600 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
601 public:
602   Assembler(const ToolChain &TC)
603       : GnuTool("minix::Assembler", "assembler", TC) {}
604
605   bool hasIntegratedCPP() const override { return false; }
606
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;
611 };
612
613 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
614 public:
615   Linker(const ToolChain &TC) : GnuTool("minix::Linker", "linker", TC) {}
616
617   bool hasIntegratedCPP() const override { return false; }
618   bool isLinkJob() const override { return true; }
619
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;
624 };
625 } // end namespace minix
626
627 /// solaris -- Directly call Solaris assembler and linker
628 namespace solaris {
629 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
630 public:
631   Assembler(const ToolChain &TC)
632       : Tool("solaris::Assembler", "assembler", TC) {}
633
634   bool hasIntegratedCPP() const override { return false; }
635
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;
640 };
641
642 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
643 public:
644   Linker(const ToolChain &TC) : Tool("solaris::Linker", "linker", TC) {}
645
646   bool hasIntegratedCPP() const override { return false; }
647   bool isLinkJob() const override { return true; }
648
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;
653 };
654 } // end namespace solaris
655
656 /// dragonfly -- Directly call GNU Binutils assembler and linker
657 namespace dragonfly {
658 class LLVM_LIBRARY_VISIBILITY Assembler : public GnuTool {
659 public:
660   Assembler(const ToolChain &TC)
661       : GnuTool("dragonfly::Assembler", "assembler", TC) {}
662
663   bool hasIntegratedCPP() const override { return false; }
664
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;
669 };
670
671 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
672 public:
673   Linker(const ToolChain &TC) : GnuTool("dragonfly::Linker", "linker", TC) {}
674
675   bool hasIntegratedCPP() const override { return false; }
676   bool isLinkJob() const override { return true; }
677
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;
682 };
683 } // end namespace dragonfly
684
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);
690
691 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
692 public:
693   Linker(const ToolChain &TC)
694       : Tool("visualstudio::Linker", "linker", TC, RF_Full,
695              llvm::sys::WEM_UTF16) {}
696
697   bool hasIntegratedCPP() const override { return false; }
698   bool isLinkJob() const override { return true; }
699
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;
704 };
705
706 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
707 public:
708   Compiler(const ToolChain &TC)
709       : Tool("visualstudio::Compiler", "compiler", TC, RF_Full,
710              llvm::sys::WEM_UTF16) {}
711
712   bool hasIntegratedAssembler() const override { return true; }
713   bool hasIntegratedCPP() const override { return true; }
714   bool isLinkJob() const override { return false; }
715
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;
720
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;
726 };
727 } // end namespace visualstudio
728
729 /// MinGW -- Directly call GNU Binutils assembler and linker
730 namespace MinGW {
731 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
732 public:
733   Assembler(const ToolChain &TC) : Tool("MinGW::Assemble", "assembler", TC) {}
734
735   bool hasIntegratedCPP() const override { return false; }
736
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;
741 };
742
743 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
744 public:
745   Linker(const ToolChain &TC) : Tool("MinGW::Linker", "linker", TC) {}
746
747   bool hasIntegratedCPP() const override { return false; }
748   bool isLinkJob() const override { return true; }
749
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;
754
755 private:
756   void AddLibGCC(const llvm::opt::ArgList &Args, ArgStringList &CmdArgs) const;
757 };
758 } // end namespace MinGW
759
760 namespace arm {
761 enum class FloatABI {
762   Invalid,
763   Soft,
764   SoftFP,
765   Hard,
766 };
767
768 FloatABI getARMFloatABI(const ToolChain &TC, const llvm::opt::ArgList &Args);
769 } // end namespace arm
770
771 namespace ppc {
772 enum class FloatABI {
773   Invalid,
774   Soft,
775   Hard,
776 };
777
778 FloatABI getPPCFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
779 } // end namespace ppc
780
781 namespace sparc {
782 enum class FloatABI {
783   Invalid,
784   Soft,
785   Hard,
786 };
787
788 FloatABI getSparcFloatABI(const Driver &D, const llvm::opt::ArgList &Args);
789 } // end namespace sparc
790
791 namespace XCore {
792 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and
793 // Compile.
794 // We simply use "clang -cc1" for those actions.
795 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
796 public:
797   Assembler(const ToolChain &TC) : Tool("XCore::Assembler", "XCore-as", TC) {}
798
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;
804 };
805
806 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
807 public:
808   Linker(const ToolChain &TC) : Tool("XCore::Linker", "XCore-ld", TC) {}
809
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;
816 };
817 } // end namespace XCore.
818
819 namespace CrossWindows {
820 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
821 public:
822   Assembler(const ToolChain &TC) : Tool("CrossWindows::Assembler", "as", TC) {}
823
824   bool hasIntegratedCPP() const override { return false; }
825
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;
830 };
831
832 class LLVM_LIBRARY_VISIBILITY Linker : public Tool {
833 public:
834   Linker(const ToolChain &TC)
835       : Tool("CrossWindows::Linker", "ld", TC, RF_Full) {}
836
837   bool hasIntegratedCPP() const override { return false; }
838   bool isLinkJob() const override { return true; }
839
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;
844 };
845 } // end namespace CrossWindows
846
847 /// SHAVE tools -- Directly call moviCompile and moviAsm
848 namespace SHAVE {
849 class LLVM_LIBRARY_VISIBILITY Compiler : public Tool {
850 public:
851   Compiler(const ToolChain &TC) : Tool("moviCompile", "movicompile", TC) {}
852
853   bool hasIntegratedCPP() const override { return true; }
854
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;
859 };
860
861 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
862 public:
863   Assembler(const ToolChain &TC) : Tool("moviAsm", "moviAsm", TC) {}
864
865   bool hasIntegratedCPP() const override { return false; } // not sure.
866
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;
871 };
872 } // end namespace SHAVE
873
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.
878 namespace Myriad {
879 class LLVM_LIBRARY_VISIBILITY Linker : public GnuTool {
880 public:
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;
888 };
889 } // end namespace Myriad
890
891 namespace PS4cpu {
892 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
893 public:
894   Assemble(const ToolChain &TC)
895       : Tool("PS4cpu::Assemble", "assembler", TC, RF_Full) {}
896
897   bool hasIntegratedCPP() const override { return false; }
898
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;
904 };
905
906 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
907 public:
908   Link(const ToolChain &TC) : Tool("PS4cpu::Link", "linker", TC, RF_Full) {}
909
910   bool hasIntegratedCPP() const override { return false; }
911   bool isLinkJob() const override { return true; }
912
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;
918 };
919 } // end namespace PS4cpu
920
921 namespace NVPTX {
922
923 // Run ptxas, the NVPTX assembler.
924 class LLVM_LIBRARY_VISIBILITY Assembler : public Tool {
925  public:
926    Assembler(const ToolChain &TC)
927        : Tool("NVPTX::Assembler", "ptxas", TC, RF_Full, llvm::sys::WEM_UTF8,
928               "--options-file") {}
929
930    bool hasIntegratedCPP() const override { return false; }
931
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;
936 };
937
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 {
941  public:
942    Linker(const ToolChain &TC)
943        : Tool("NVPTX::Linker", "fatbinary", TC, RF_Full, llvm::sys::WEM_UTF8,
944               "--options-file") {}
945
946    bool hasIntegratedCPP() const override { return false; }
947
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;
952 };
953
954 }  // end namespace NVPTX
955
956 } // end namespace tools
957 } // end namespace driver
958 } // end namespace clang
959
960 #endif // LLVM_CLANG_LIB_DRIVER_TOOLS_H