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 std::string 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 getArchTypeForDarwinArchName(StringRef Str);
215 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
216 virtual void anchor();
218 void AddDarwinArch(const llvm::opt::ArgList &Args,
219 llvm::opt::ArgStringList &CmdArgs) const;
221 const toolchains::Darwin &getDarwinToolChain() const {
222 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
226 DarwinTool(const char *Name, const char *ShortName,
227 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
230 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
232 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
235 virtual bool hasIntegratedCPP() const { return false; }
237 virtual void ConstructJob(Compilation &C, const JobAction &JA,
238 const InputInfo &Output,
239 const InputInfoList &Inputs,
240 const llvm::opt::ArgList &TCArgs,
241 const char *LinkingOutput) const;
244 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
245 bool NeedsTempPath(const InputInfoList &Inputs) const;
246 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
247 llvm::opt::ArgStringList &CmdArgs,
248 const InputInfoList &Inputs) const;
251 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
253 virtual bool hasIntegratedCPP() const { return false; }
254 virtual bool isLinkJob() const { return true; }
256 virtual void ConstructJob(Compilation &C, const JobAction &JA,
257 const InputInfo &Output,
258 const InputInfoList &Inputs,
259 const llvm::opt::ArgList &TCArgs,
260 const char *LinkingOutput) const;
263 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
265 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
267 virtual bool hasIntegratedCPP() const { return false; }
269 virtual void ConstructJob(Compilation &C, const JobAction &JA,
270 const InputInfo &Output,
271 const InputInfoList &Inputs,
272 const llvm::opt::ArgList &TCArgs,
273 const char *LinkingOutput) const;
276 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
278 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
281 virtual bool hasIntegratedCPP() const { return false; }
282 virtual bool isDsymutilJob() const { return true; }
284 virtual void ConstructJob(Compilation &C, const JobAction &JA,
285 const InputInfo &Output,
286 const InputInfoList &Inputs,
287 const llvm::opt::ArgList &TCArgs,
288 const char *LinkingOutput) const;
291 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
293 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
296 virtual bool hasIntegratedCPP() const { return false; }
298 virtual void ConstructJob(Compilation &C, const JobAction &JA,
299 const InputInfo &Output,
300 const InputInfoList &Inputs,
301 const llvm::opt::ArgList &TCArgs,
302 const char *LinkingOutput) const;
307 /// openbsd -- Directly call GNU Binutils assembler and linker
309 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
311 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
314 virtual bool hasIntegratedCPP() const { return false; }
316 virtual void ConstructJob(Compilation &C, const JobAction &JA,
317 const InputInfo &Output,
318 const InputInfoList &Inputs,
319 const llvm::opt::ArgList &TCArgs,
320 const char *LinkingOutput) const;
322 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
324 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
326 virtual bool hasIntegratedCPP() const { return false; }
327 virtual bool isLinkJob() const { return true; }
329 virtual void ConstructJob(Compilation &C, const JobAction &JA,
330 const InputInfo &Output,
331 const InputInfoList &Inputs,
332 const llvm::opt::ArgList &TCArgs,
333 const char *LinkingOutput) const;
335 } // end namespace openbsd
337 /// bitrig -- Directly call GNU Binutils assembler and linker
339 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
341 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
344 virtual bool hasIntegratedCPP() const { return false; }
346 virtual void ConstructJob(Compilation &C, const JobAction &JA,
347 const InputInfo &Output,
348 const InputInfoList &Inputs,
349 const llvm::opt::ArgList &TCArgs,
350 const char *LinkingOutput) const;
352 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
354 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
356 virtual bool hasIntegratedCPP() const { return false; }
357 virtual bool isLinkJob() const { return true; }
359 virtual void ConstructJob(Compilation &C, const JobAction &JA,
360 const InputInfo &Output,
361 const InputInfoList &Inputs,
362 const llvm::opt::ArgList &TCArgs,
363 const char *LinkingOutput) const;
365 } // end namespace bitrig
367 /// freebsd -- Directly call GNU Binutils assembler and linker
369 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
371 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
374 virtual bool hasIntegratedCPP() const { return false; }
376 virtual void ConstructJob(Compilation &C, const JobAction &JA,
377 const InputInfo &Output,
378 const InputInfoList &Inputs,
379 const llvm::opt::ArgList &TCArgs,
380 const char *LinkingOutput) const;
382 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
384 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
386 virtual bool hasIntegratedCPP() const { return false; }
387 virtual bool isLinkJob() const { return true; }
389 virtual void ConstructJob(Compilation &C, const JobAction &JA,
390 const InputInfo &Output,
391 const InputInfoList &Inputs,
392 const llvm::opt::ArgList &TCArgs,
393 const char *LinkingOutput) const;
395 } // end namespace freebsd
397 /// netbsd -- Directly call GNU Binutils assembler and linker
399 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
402 Assemble(const ToolChain &TC)
403 : Tool("netbsd::Assemble", "assembler", TC) {}
405 virtual bool hasIntegratedCPP() const { return false; }
407 virtual void ConstructJob(Compilation &C, const JobAction &JA,
408 const InputInfo &Output,
409 const InputInfoList &Inputs,
410 const llvm::opt::ArgList &TCArgs,
411 const char *LinkingOutput) const;
413 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
416 Link(const ToolChain &TC)
417 : Tool("netbsd::Link", "linker", TC) {}
419 virtual bool hasIntegratedCPP() const { return false; }
420 virtual bool isLinkJob() const { return true; }
422 virtual void ConstructJob(Compilation &C, const JobAction &JA,
423 const InputInfo &Output,
424 const InputInfoList &Inputs,
425 const llvm::opt::ArgList &TCArgs,
426 const char *LinkingOutput) const;
428 } // end namespace netbsd
430 /// Directly call GNU Binutils' assembler and linker.
432 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
434 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
436 virtual bool hasIntegratedCPP() const { return false; }
438 virtual void ConstructJob(Compilation &C, const JobAction &JA,
439 const InputInfo &Output,
440 const InputInfoList &Inputs,
441 const llvm::opt::ArgList &TCArgs,
442 const char *LinkingOutput) const;
444 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
446 Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
448 virtual bool hasIntegratedCPP() const { return false; }
449 virtual bool isLinkJob() const { return true; }
451 virtual void ConstructJob(Compilation &C, const JobAction &JA,
452 const InputInfo &Output,
453 const InputInfoList &Inputs,
454 const llvm::opt::ArgList &TCArgs,
455 const char *LinkingOutput) const;
458 /// minix -- Directly call GNU Binutils assembler and linker
460 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
462 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
465 virtual bool hasIntegratedCPP() const { return false; }
467 virtual void ConstructJob(Compilation &C, const JobAction &JA,
468 const InputInfo &Output,
469 const InputInfoList &Inputs,
470 const llvm::opt::ArgList &TCArgs,
471 const char *LinkingOutput) const;
473 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
475 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
477 virtual bool hasIntegratedCPP() const { return false; }
478 virtual bool isLinkJob() const { return true; }
480 virtual void ConstructJob(Compilation &C, const JobAction &JA,
481 const InputInfo &Output,
482 const InputInfoList &Inputs,
483 const llvm::opt::ArgList &TCArgs,
484 const char *LinkingOutput) const;
486 } // end namespace minix
488 /// solaris -- Directly call Solaris assembler and linker
490 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
492 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
495 virtual bool hasIntegratedCPP() const { return false; }
497 virtual void ConstructJob(Compilation &C, const JobAction &JA,
498 const InputInfo &Output,
499 const InputInfoList &Inputs,
500 const llvm::opt::ArgList &TCArgs,
501 const char *LinkingOutput) const;
503 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
505 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
507 virtual bool hasIntegratedCPP() const { return false; }
508 virtual bool isLinkJob() const { return true; }
510 virtual void ConstructJob(Compilation &C, const JobAction &JA,
511 const InputInfo &Output,
512 const InputInfoList &Inputs,
513 const llvm::opt::ArgList &TCArgs,
514 const char *LinkingOutput) const;
516 } // end namespace solaris
518 /// auroraux -- Directly call GNU Binutils assembler and linker
520 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
522 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
525 virtual bool hasIntegratedCPP() const { return false; }
527 virtual void ConstructJob(Compilation &C, const JobAction &JA,
528 const InputInfo &Output,
529 const InputInfoList &Inputs,
530 const llvm::opt::ArgList &TCArgs,
531 const char *LinkingOutput) const;
533 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
535 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
537 virtual bool hasIntegratedCPP() const { return false; }
538 virtual bool isLinkJob() const { return true; }
540 virtual void ConstructJob(Compilation &C, const JobAction &JA,
541 const InputInfo &Output,
542 const InputInfoList &Inputs,
543 const llvm::opt::ArgList &TCArgs,
544 const char *LinkingOutput) const;
546 } // end namespace auroraux
548 /// dragonfly -- Directly call GNU Binutils assembler and linker
549 namespace dragonfly {
550 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
552 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
555 virtual bool hasIntegratedCPP() const { return false; }
557 virtual void ConstructJob(Compilation &C, const JobAction &JA,
558 const InputInfo &Output,
559 const InputInfoList &Inputs,
560 const llvm::opt::ArgList &TCArgs,
561 const char *LinkingOutput) const;
563 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
565 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
567 virtual bool hasIntegratedCPP() const { return false; }
568 virtual bool isLinkJob() const { return true; }
570 virtual void ConstructJob(Compilation &C, const JobAction &JA,
571 const InputInfo &Output,
572 const InputInfoList &Inputs,
573 const llvm::opt::ArgList &TCArgs,
574 const char *LinkingOutput) const;
576 } // end namespace dragonfly
578 /// Visual studio tools.
579 namespace visualstudio {
580 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
582 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
584 virtual bool hasIntegratedCPP() const { return false; }
585 virtual bool isLinkJob() const { return true; }
587 virtual void ConstructJob(Compilation &C, const JobAction &JA,
588 const InputInfo &Output,
589 const InputInfoList &Inputs,
590 const llvm::opt::ArgList &TCArgs,
591 const char *LinkingOutput) const;
594 class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
596 Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
598 virtual bool hasIntegratedAssembler() const { return true; }
599 virtual bool hasIntegratedCPP() const { return true; }
600 virtual bool isLinkJob() const { return false; }
602 virtual void ConstructJob(Compilation &C, const JobAction &JA,
603 const InputInfo &Output,
604 const InputInfoList &Inputs,
605 const llvm::opt::ArgList &TCArgs,
606 const char *LinkingOutput) const;
608 Command *GetCommand(Compilation &C, const JobAction &JA,
609 const InputInfo &Output,
610 const InputInfoList &Inputs,
611 const llvm::opt::ArgList &TCArgs,
612 const char *LinkingOutput) const;
614 } // end namespace visualstudio
617 StringRef getARMFloatABI(const Driver &D, const llvm::opt::ArgList &Args,
618 const llvm::Triple &Triple);
621 // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
622 // We simply use "clang -cc1" for those actions.
623 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
625 Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
628 virtual bool hasIntegratedCPP() const { return false; }
629 virtual void ConstructJob(Compilation &C, const JobAction &JA,
630 const InputInfo &Output,
631 const InputInfoList &Inputs,
632 const llvm::opt::ArgList &TCArgs,
633 const char *LinkingOutput) const;
636 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
638 Link(const ToolChain &TC) : Tool("XCore::Link",
641 virtual bool hasIntegratedCPP() const { return false; }
642 virtual bool isLinkJob() const { return true; }
643 virtual void ConstructJob(Compilation &C, const JobAction &JA,
644 const InputInfo &Output,
645 const InputInfoList &Inputs,
646 const llvm::opt::ArgList &TCArgs,
647 const char *LinkingOutput) const;
649 } // end namespace XCore.
652 } // end namespace toolchains
653 } // end namespace driver
654 } // end namespace clang
656 #endif // CLANG_LIB_DRIVER_TOOLS_H_