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 CLANG_LIB_DRIVER_TOOLS_H_
11 #define 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 {
32 using llvm::opt::ArgStringList;
34 /// \brief Clang compiler tool.
35 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
37 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
38 const InputInfoList &Inputs);
39 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
40 const InputInfoList &Inputs);
41 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
42 const InputInfoList &Inputs);
45 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
47 const llvm::opt::ArgList &Args,
48 llvm::opt::ArgStringList &CmdArgs,
49 const InputInfo &Output,
50 const InputInfoList &Inputs) const;
52 void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
53 llvm::opt::ArgStringList &CmdArgs) const;
54 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
55 llvm::opt::ArgStringList &CmdArgs,
56 bool KernelOrKext) const;
57 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
58 llvm::opt::ArgStringList &CmdArgs) const;
59 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
60 llvm::opt::ArgStringList &CmdArgs) const;
61 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
62 llvm::opt::ArgStringList &CmdArgs) const;
63 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
64 llvm::opt::ArgStringList &CmdArgs) const;
65 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
66 llvm::opt::ArgStringList &CmdArgs) const;
67 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
68 llvm::opt::ArgStringList &CmdArgs) const;
70 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
72 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
73 llvm::opt::ArgStringList &cmdArgs,
74 RewriteKind rewrite) const;
76 void AddClangCLArgs(const llvm::opt::ArgList &Args,
77 llvm::opt::ArgStringList &CmdArgs) const;
80 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
82 virtual bool hasGoodDiagnostics() const { return true; }
83 virtual bool hasIntegratedAssembler() const { return true; }
84 virtual bool hasIntegratedCPP() const { return true; }
86 virtual void ConstructJob(Compilation &C, const JobAction &JA,
87 const InputInfo &Output,
88 const InputInfoList &Inputs,
89 const llvm::opt::ArgList &TCArgs,
90 const char *LinkingOutput) const;
93 /// \brief Clang integrated assembler tool.
94 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
96 ClangAs(const ToolChain &TC) : Tool("clang::as",
97 "clang integrated assembler", TC) {}
99 virtual bool hasGoodDiagnostics() const { return true; }
100 virtual bool hasIntegratedAssembler() const { return false; }
101 virtual bool hasIntegratedCPP() const { return false; }
103 virtual void ConstructJob(Compilation &C, const JobAction &JA,
104 const InputInfo &Output,
105 const InputInfoList &Inputs,
106 const llvm::opt::ArgList &TCArgs,
107 const char *LinkingOutput) const;
110 /// gcc - Generic GCC tool implementations.
112 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
114 Common(const char *Name, const char *ShortName,
115 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
117 virtual void ConstructJob(Compilation &C, const JobAction &JA,
118 const InputInfo &Output,
119 const InputInfoList &Inputs,
120 const llvm::opt::ArgList &TCArgs,
121 const char *LinkingOutput) const;
123 /// RenderExtraToolArgs - Render any arguments necessary to force
124 /// the particular tool mode.
126 RenderExtraToolArgs(const JobAction &JA,
127 llvm::opt::ArgStringList &CmdArgs) const = 0;
130 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
132 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
133 "gcc preprocessor", TC) {}
135 virtual bool hasGoodDiagnostics() const { return true; }
136 virtual bool hasIntegratedCPP() const { return false; }
138 virtual void RenderExtraToolArgs(const JobAction &JA,
139 llvm::opt::ArgStringList &CmdArgs) const;
142 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
144 Compile(const ToolChain &TC) : Common("gcc::Compile",
145 "gcc frontend", TC) {}
147 virtual bool hasGoodDiagnostics() const { return true; }
148 virtual bool hasIntegratedCPP() const { return true; }
150 virtual void RenderExtraToolArgs(const JobAction &JA,
151 llvm::opt::ArgStringList &CmdArgs) const;
154 class LLVM_LIBRARY_VISIBILITY Link : public Common {
156 Link(const ToolChain &TC) : Common("gcc::Link",
157 "linker (via gcc)", TC) {}
159 virtual bool hasIntegratedCPP() const { return false; }
160 virtual bool isLinkJob() const { return true; }
162 virtual void RenderExtraToolArgs(const JobAction &JA,
163 llvm::opt::ArgStringList &CmdArgs) const;
165 } // end namespace gcc
168 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
169 // We simply use "clang -cc1" for those actions.
170 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
172 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
175 virtual bool hasIntegratedCPP() const { return false; }
177 virtual void RenderExtraToolArgs(const JobAction &JA,
178 llvm::opt::ArgStringList &CmdArgs) const;
179 virtual void ConstructJob(Compilation &C, const JobAction &JA,
180 const InputInfo &Output,
181 const InputInfoList &Inputs,
182 const llvm::opt::ArgList &TCArgs,
183 const char *LinkingOutput) const;
186 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
188 Link(const ToolChain &TC) : Tool("hexagon::Link",
191 virtual bool hasIntegratedCPP() const { return false; }
192 virtual bool isLinkJob() const { return true; }
194 virtual void RenderExtraToolArgs(const JobAction &JA,
195 llvm::opt::ArgStringList &CmdArgs) const;
196 virtual void ConstructJob(Compilation &C, const JobAction &JA,
197 const InputInfo &Output,
198 const InputInfoList &Inputs,
199 const llvm::opt::ArgList &TCArgs,
200 const char *LinkingOutput) const;
202 } // end namespace hexagon.
205 StringRef getARMTargetCPU(const llvm::opt::ArgList &Args,
206 const llvm::Triple &Triple);
207 const char* getARMCPUForMArch(const llvm::opt::ArgList &Args,
208 const llvm::Triple &Triple);
209 const char* getLLVMArchSuffixForARM(StringRef CPU);
213 llvm::Triple::ArchType getArchTypeForMachOArchName(StringRef Str);
214 void setTripleTypeForMachOArchName(llvm::Triple &T, StringRef Str);
216 class LLVM_LIBRARY_VISIBILITY MachOTool : public Tool {
217 virtual void anchor();
219 void AddMachOArch(const llvm::opt::ArgList &Args,
220 llvm::opt::ArgStringList &CmdArgs) const;
222 const toolchains::MachO &getMachOToolChain() const {
223 return reinterpret_cast<const toolchains::MachO&>(getToolChain());
227 MachOTool(const char *Name, const char *ShortName,
228 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
231 class LLVM_LIBRARY_VISIBILITY Assemble : public MachOTool {
233 Assemble(const ToolChain &TC) : MachOTool("darwin::Assemble",
236 virtual bool hasIntegratedCPP() const { return false; }
238 virtual void ConstructJob(Compilation &C, const JobAction &JA,
239 const InputInfo &Output,
240 const InputInfoList &Inputs,
241 const llvm::opt::ArgList &TCArgs,
242 const char *LinkingOutput) const;
245 class LLVM_LIBRARY_VISIBILITY Link : public MachOTool {
246 bool NeedsTempPath(const InputInfoList &Inputs) const;
247 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
248 llvm::opt::ArgStringList &CmdArgs,
249 const InputInfoList &Inputs) const;
252 Link(const ToolChain &TC) : MachOTool("darwin::Link", "linker", TC) {}
254 virtual bool hasIntegratedCPP() const { return false; }
255 virtual bool isLinkJob() const { return true; }
257 virtual void ConstructJob(Compilation &C, const JobAction &JA,
258 const InputInfo &Output,
259 const InputInfoList &Inputs,
260 const llvm::opt::ArgList &TCArgs,
261 const char *LinkingOutput) const;
264 class LLVM_LIBRARY_VISIBILITY Lipo : public MachOTool {
266 Lipo(const ToolChain &TC) : MachOTool("darwin::Lipo", "lipo", TC) {}
268 virtual bool hasIntegratedCPP() const { return false; }
270 virtual void ConstructJob(Compilation &C, const JobAction &JA,
271 const InputInfo &Output,
272 const InputInfoList &Inputs,
273 const llvm::opt::ArgList &TCArgs,
274 const char *LinkingOutput) const;
277 class LLVM_LIBRARY_VISIBILITY Dsymutil : public MachOTool {
279 Dsymutil(const ToolChain &TC) : MachOTool("darwin::Dsymutil",
282 virtual bool hasIntegratedCPP() const { return false; }
283 virtual bool isDsymutilJob() const { return true; }
285 virtual void ConstructJob(Compilation &C, const JobAction &JA,
286 const InputInfo &Output,
287 const InputInfoList &Inputs,
288 const llvm::opt::ArgList &TCArgs,
289 const char *LinkingOutput) const;
292 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public MachOTool {
294 VerifyDebug(const ToolChain &TC) : MachOTool("darwin::VerifyDebug",
297 virtual bool hasIntegratedCPP() const { return false; }
299 virtual void ConstructJob(Compilation &C, const JobAction &JA,
300 const InputInfo &Output,
301 const InputInfoList &Inputs,
302 const llvm::opt::ArgList &TCArgs,
303 const char *LinkingOutput) const;
308 /// openbsd -- Directly call GNU Binutils assembler and linker
310 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
312 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
315 virtual bool hasIntegratedCPP() const { return false; }
317 virtual void ConstructJob(Compilation &C, const JobAction &JA,
318 const InputInfo &Output,
319 const InputInfoList &Inputs,
320 const llvm::opt::ArgList &TCArgs,
321 const char *LinkingOutput) const;
323 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
325 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
327 virtual bool hasIntegratedCPP() const { return false; }
328 virtual bool isLinkJob() const { return true; }
330 virtual void ConstructJob(Compilation &C, const JobAction &JA,
331 const InputInfo &Output,
332 const InputInfoList &Inputs,
333 const llvm::opt::ArgList &TCArgs,
334 const char *LinkingOutput) const;
336 } // end namespace openbsd
338 /// bitrig -- Directly call GNU Binutils assembler and linker
340 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
342 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
345 virtual bool hasIntegratedCPP() const { return false; }
347 virtual void ConstructJob(Compilation &C, const JobAction &JA,
348 const InputInfo &Output,
349 const InputInfoList &Inputs,
350 const llvm::opt::ArgList &TCArgs,
351 const char *LinkingOutput) const;
353 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
355 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
357 virtual bool hasIntegratedCPP() const { return false; }
358 virtual bool isLinkJob() const { return true; }
360 virtual void ConstructJob(Compilation &C, const JobAction &JA,
361 const InputInfo &Output,
362 const InputInfoList &Inputs,
363 const llvm::opt::ArgList &TCArgs,
364 const char *LinkingOutput) const;
366 } // end namespace bitrig
368 /// freebsd -- Directly call GNU Binutils assembler and linker
370 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
372 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
375 virtual bool hasIntegratedCPP() const { return false; }
377 virtual void ConstructJob(Compilation &C, const JobAction &JA,
378 const InputInfo &Output,
379 const InputInfoList &Inputs,
380 const llvm::opt::ArgList &TCArgs,
381 const char *LinkingOutput) const;
383 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
385 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
387 virtual bool hasIntegratedCPP() const { return false; }
388 virtual bool isLinkJob() const { return true; }
390 virtual void ConstructJob(Compilation &C, const JobAction &JA,
391 const InputInfo &Output,
392 const InputInfoList &Inputs,
393 const llvm::opt::ArgList &TCArgs,
394 const char *LinkingOutput) const;
396 } // end namespace freebsd
398 /// netbsd -- Directly call GNU Binutils assembler and linker
400 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
403 Assemble(const ToolChain &TC)
404 : Tool("netbsd::Assemble", "assembler", TC) {}
406 virtual bool hasIntegratedCPP() const { return false; }
408 virtual void ConstructJob(Compilation &C, const JobAction &JA,
409 const InputInfo &Output,
410 const InputInfoList &Inputs,
411 const llvm::opt::ArgList &TCArgs,
412 const char *LinkingOutput) const;
414 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
417 Link(const ToolChain &TC)
418 : Tool("netbsd::Link", "linker", TC) {}
420 virtual bool hasIntegratedCPP() const { return false; }
421 virtual bool isLinkJob() const { return true; }
423 virtual void ConstructJob(Compilation &C, const JobAction &JA,
424 const InputInfo &Output,
425 const InputInfoList &Inputs,
426 const llvm::opt::ArgList &TCArgs,
427 const char *LinkingOutput) const;
429 } // end namespace netbsd
431 /// Directly call GNU Binutils' assembler and linker.
433 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
435 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
437 virtual bool hasIntegratedCPP() const { return false; }
439 virtual void ConstructJob(Compilation &C, const JobAction &JA,
440 const InputInfo &Output,
441 const InputInfoList &Inputs,
442 const llvm::opt::ArgList &TCArgs,
443 const char *LinkingOutput) const;
445 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
447 Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
449 virtual bool hasIntegratedCPP() const { return false; }
450 virtual bool isLinkJob() const { return true; }
452 virtual void ConstructJob(Compilation &C, const JobAction &JA,
453 const InputInfo &Output,
454 const InputInfoList &Inputs,
455 const llvm::opt::ArgList &TCArgs,
456 const char *LinkingOutput) const;
459 /// minix -- Directly call GNU Binutils assembler and linker
461 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
463 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
466 virtual bool hasIntegratedCPP() const { return false; }
468 virtual void ConstructJob(Compilation &C, const JobAction &JA,
469 const InputInfo &Output,
470 const InputInfoList &Inputs,
471 const llvm::opt::ArgList &TCArgs,
472 const char *LinkingOutput) const;
474 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
476 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
478 virtual bool hasIntegratedCPP() const { return false; }
479 virtual bool isLinkJob() const { return true; }
481 virtual void ConstructJob(Compilation &C, const JobAction &JA,
482 const InputInfo &Output,
483 const InputInfoList &Inputs,
484 const llvm::opt::ArgList &TCArgs,
485 const char *LinkingOutput) const;
487 } // end namespace minix
489 /// solaris -- Directly call Solaris assembler and linker
491 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
493 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
496 virtual bool hasIntegratedCPP() const { return false; }
498 virtual void ConstructJob(Compilation &C, const JobAction &JA,
499 const InputInfo &Output,
500 const InputInfoList &Inputs,
501 const llvm::opt::ArgList &TCArgs,
502 const char *LinkingOutput) const;
504 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
506 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
508 virtual bool hasIntegratedCPP() const { return false; }
509 virtual bool isLinkJob() const { return true; }
511 virtual void ConstructJob(Compilation &C, const JobAction &JA,
512 const InputInfo &Output,
513 const InputInfoList &Inputs,
514 const llvm::opt::ArgList &TCArgs,
515 const char *LinkingOutput) const;
517 } // end namespace solaris
519 /// auroraux -- Directly call GNU Binutils assembler and linker
521 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
523 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
526 virtual bool hasIntegratedCPP() const { return false; }
528 virtual void ConstructJob(Compilation &C, const JobAction &JA,
529 const InputInfo &Output,
530 const InputInfoList &Inputs,
531 const llvm::opt::ArgList &TCArgs,
532 const char *LinkingOutput) const;
534 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
536 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
538 virtual bool hasIntegratedCPP() const { return false; }
539 virtual bool isLinkJob() const { return true; }
541 virtual void ConstructJob(Compilation &C, const JobAction &JA,
542 const InputInfo &Output,
543 const InputInfoList &Inputs,
544 const llvm::opt::ArgList &TCArgs,
545 const char *LinkingOutput) const;
547 } // end namespace auroraux
549 /// dragonfly -- Directly call GNU Binutils assembler and linker
550 namespace dragonfly {
551 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
553 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
556 virtual bool hasIntegratedCPP() const { return false; }
558 virtual void ConstructJob(Compilation &C, const JobAction &JA,
559 const InputInfo &Output,
560 const InputInfoList &Inputs,
561 const llvm::opt::ArgList &TCArgs,
562 const char *LinkingOutput) const;
564 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
566 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
568 virtual bool hasIntegratedCPP() const { return false; }
569 virtual bool isLinkJob() const { return true; }
571 virtual void ConstructJob(Compilation &C, const JobAction &JA,
572 const InputInfo &Output,
573 const InputInfoList &Inputs,
574 const llvm::opt::ArgList &TCArgs,
575 const char *LinkingOutput) const;
577 } // end namespace dragonfly
579 /// Visual studio tools.
580 namespace visualstudio {
581 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
583 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
585 virtual bool hasIntegratedCPP() const { return false; }
586 virtual bool isLinkJob() const { return true; }
588 virtual void ConstructJob(Compilation &C, const JobAction &JA,
589 const InputInfo &Output,
590 const InputInfoList &Inputs,
591 const llvm::opt::ArgList &TCArgs,
592 const char *LinkingOutput) const;
595 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
597 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
599 virtual bool hasIntegratedAssembler() const { return true; }
600 virtual bool hasIntegratedCPP() const { return true; }
601 virtual bool isLinkJob() const { return false; }
603 virtual void ConstructJob(Compilation &C, const JobAction &JA,
604 const InputInfo &Output,
605 const InputInfoList &Inputs,
606 const llvm::opt::ArgList &TCArgs,
607 const char *LinkingOutput) const;
609 Command *GetCommand(Compilation &C, const JobAction &JA,
610 const InputInfo &Output,
611 const InputInfoList &Inputs,
612 const llvm::opt::ArgList &TCArgs,
613 const char *LinkingOutput) const;
615 } // end namespace visualstudio
618 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
619 const llvm::Triple &Triple);
622 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
623 // We simply use "clang -cc1" for those actions.
624 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
626 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
629 virtual bool hasIntegratedCPP() const { return false; }
630 virtual void ConstructJob(Compilation &C, const JobAction &JA,
631 const InputInfo &Output,
632 const InputInfoList &Inputs,
633 const llvm::opt::ArgList &TCArgs,
634 const char *LinkingOutput) const;
637 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
639 Link(const ToolChain &TC) : Tool("XCore::Link",
642 virtual bool hasIntegratedCPP() const { return false; }
643 virtual bool isLinkJob() const { return true; }
644 virtual void ConstructJob(Compilation &C, const JobAction &JA,
645 const InputInfo &Output,
646 const InputInfoList &Inputs,
647 const llvm::opt::ArgList &TCArgs,
648 const char *LinkingOutput) const;
650 } // end namespace XCore.
653 } // end namespace toolchains
654 } // end namespace driver
655 } // end namespace clang
657 #endif // CLANG_LIB_DRIVER_TOOLS_H_