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"
17 #include "llvm/ADT/Triple.h"
18 #include "llvm/Support/Compiler.h"
26 namespace toolchains {
32 /// \brief Clang compiler tool.
33 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
34 void AddPreprocessingOptions(Compilation &C,
37 ArgStringList &CmdArgs,
38 const InputInfo &Output,
39 const InputInfoList &Inputs) const;
41 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
42 bool KernelOrKext) const;
43 void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
44 void AddPPCTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
45 void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
46 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
47 void AddHexagonTargetArgs (const ArgList &Args, ArgStringList &CmdArgs) const;
49 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
51 ObjCRuntime AddObjCRuntimeArgs(const ArgList &args, ArgStringList &cmdArgs,
52 RewriteKind rewrite) const;
55 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
57 virtual bool hasGoodDiagnostics() const { return true; }
58 virtual bool hasIntegratedAssembler() const { return true; }
59 virtual bool hasIntegratedCPP() const { return true; }
61 virtual void ConstructJob(Compilation &C, const JobAction &JA,
62 const InputInfo &Output,
63 const InputInfoList &Inputs,
64 const ArgList &TCArgs,
65 const char *LinkingOutput) const;
68 /// \brief Clang integrated assembler tool.
69 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
70 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
72 ClangAs(const ToolChain &TC) : Tool("clang::as",
73 "clang integrated assembler", TC) {}
75 virtual bool hasGoodDiagnostics() const { return true; }
76 virtual bool hasIntegratedAssembler() const { return false; }
77 virtual bool hasIntegratedCPP() const { return false; }
79 virtual void ConstructJob(Compilation &C, const JobAction &JA,
80 const InputInfo &Output,
81 const InputInfoList &Inputs,
82 const ArgList &TCArgs,
83 const char *LinkingOutput) const;
86 /// gcc - Generic GCC tool implementations.
88 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
90 Common(const char *Name, const char *ShortName,
91 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
93 virtual void ConstructJob(Compilation &C, const JobAction &JA,
94 const InputInfo &Output,
95 const InputInfoList &Inputs,
96 const ArgList &TCArgs,
97 const char *LinkingOutput) const;
99 /// RenderExtraToolArgs - Render any arguments necessary to force
100 /// the particular tool mode.
101 virtual void RenderExtraToolArgs(const JobAction &JA,
102 ArgStringList &CmdArgs) const = 0;
106 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
108 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
109 "gcc preprocessor", TC) {}
111 virtual bool hasGoodDiagnostics() const { return true; }
112 virtual bool hasIntegratedCPP() const { return false; }
114 virtual void RenderExtraToolArgs(const JobAction &JA,
115 ArgStringList &CmdArgs) const;
118 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
120 Precompile(const ToolChain &TC) : Common("gcc::Precompile",
121 "gcc precompile", TC) {}
123 virtual bool hasGoodDiagnostics() const { return true; }
124 virtual bool hasIntegratedCPP() const { return true; }
126 virtual void RenderExtraToolArgs(const JobAction &JA,
127 ArgStringList &CmdArgs) const;
130 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
132 Compile(const ToolChain &TC) : Common("gcc::Compile",
133 "gcc frontend", TC) {}
135 virtual bool hasGoodDiagnostics() const { return true; }
136 virtual bool hasIntegratedCPP() const { return true; }
138 virtual void RenderExtraToolArgs(const JobAction &JA,
139 ArgStringList &CmdArgs) const;
142 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
144 Assemble(const ToolChain &TC) : Common("gcc::Assemble",
145 "assembler (via gcc)", TC) {}
147 virtual bool hasIntegratedCPP() const { return false; }
149 virtual void RenderExtraToolArgs(const JobAction &JA,
150 ArgStringList &CmdArgs) const;
153 class LLVM_LIBRARY_VISIBILITY Link : public Common {
155 Link(const ToolChain &TC) : Common("gcc::Link",
156 "linker (via gcc)", TC) {}
158 virtual bool hasIntegratedCPP() const { return false; }
159 virtual bool isLinkJob() const { return true; }
161 virtual void RenderExtraToolArgs(const JobAction &JA,
162 ArgStringList &CmdArgs) const;
164 } // end namespace gcc
167 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
168 // We simply use "clang -cc1" for those actions.
169 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
171 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
174 virtual bool hasIntegratedCPP() const { return false; }
176 virtual void RenderExtraToolArgs(const JobAction &JA,
177 ArgStringList &CmdArgs) const;
178 virtual void ConstructJob(Compilation &C, const JobAction &JA,
179 const InputInfo &Output,
180 const InputInfoList &Inputs,
181 const ArgList &TCArgs,
182 const char *LinkingOutput) const;
185 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
187 Link(const ToolChain &TC) : Tool("hexagon::Link",
190 virtual bool hasIntegratedCPP() const { return false; }
191 virtual bool isLinkJob() const { return true; }
193 virtual void RenderExtraToolArgs(const JobAction &JA,
194 ArgStringList &CmdArgs) const;
195 virtual void ConstructJob(Compilation &C, const JobAction &JA,
196 const InputInfo &Output,
197 const InputInfoList &Inputs,
198 const ArgList &TCArgs,
199 const char *LinkingOutput) const;
201 } // end namespace hexagon.
205 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
207 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
208 virtual void anchor();
210 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
212 const toolchains::Darwin &getDarwinToolChain() const {
213 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
217 DarwinTool(const char *Name, const char *ShortName,
218 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
221 class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool {
222 virtual void anchor();
224 static const char *getBaseInputName(const ArgList &Args,
225 const InputInfoList &Input);
226 static const char *getBaseInputStem(const ArgList &Args,
227 const InputInfoList &Input);
228 static const char *getDependencyFileName(const ArgList &Args,
229 const InputInfoList &Inputs);
232 const char *getCC1Name(types::ID Type) const;
234 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
235 void RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const;
236 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
237 const InputInfoList &Inputs,
238 const ArgStringList &OutputArgs) const;
239 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
240 const InputInfoList &Inputs,
241 const ArgStringList &OutputArgs) const;
242 void AddCPPUniqueOptionsArgs(const ArgList &Args,
243 ArgStringList &CmdArgs,
244 const InputInfoList &Inputs) const;
245 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
248 CC1(const char *Name, const char *ShortName,
249 const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {}
251 virtual bool hasGoodDiagnostics() const { return true; }
252 virtual bool hasIntegratedCPP() const { return true; }
255 class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1 {
257 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess",
258 "gcc preprocessor", TC) {}
260 virtual void ConstructJob(Compilation &C, const JobAction &JA,
261 const InputInfo &Output,
262 const InputInfoList &Inputs,
263 const ArgList &TCArgs,
264 const char *LinkingOutput) const;
267 class LLVM_LIBRARY_VISIBILITY Compile : public CC1 {
269 Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {}
271 virtual void ConstructJob(Compilation &C, const JobAction &JA,
272 const InputInfo &Output,
273 const InputInfoList &Inputs,
274 const ArgList &TCArgs,
275 const char *LinkingOutput) const;
278 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
280 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
283 virtual bool hasIntegratedCPP() const { return false; }
285 virtual void ConstructJob(Compilation &C, const JobAction &JA,
286 const InputInfo &Output,
287 const InputInfoList &Inputs,
288 const ArgList &TCArgs,
289 const char *LinkingOutput) const;
292 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
293 bool NeedsTempPath(const InputInfoList &Inputs) const;
294 void AddLinkArgs(Compilation &C, const ArgList &Args,
295 ArgStringList &CmdArgs, const InputInfoList &Inputs) const;
298 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
300 virtual bool hasIntegratedCPP() const { return false; }
301 virtual bool isLinkJob() const { return true; }
303 virtual void ConstructJob(Compilation &C, const JobAction &JA,
304 const InputInfo &Output,
305 const InputInfoList &Inputs,
306 const ArgList &TCArgs,
307 const char *LinkingOutput) const;
310 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
312 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
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 ArgList &TCArgs,
320 const char *LinkingOutput) const;
323 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
325 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
328 virtual bool hasIntegratedCPP() const { return false; }
330 virtual void ConstructJob(Compilation &C, const JobAction &JA,
331 const InputInfo &Output,
332 const InputInfoList &Inputs,
333 const ArgList &TCArgs,
334 const char *LinkingOutput) const;
337 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
339 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
342 virtual bool hasIntegratedCPP() const { return false; }
344 virtual void ConstructJob(Compilation &C, const JobAction &JA,
345 const InputInfo &Output,
346 const InputInfoList &Inputs,
347 const ArgList &TCArgs,
348 const char *LinkingOutput) const;
353 /// openbsd -- Directly call GNU Binutils assembler and linker
355 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
357 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
360 virtual bool hasIntegratedCPP() const { return false; }
362 virtual void ConstructJob(Compilation &C, const JobAction &JA,
363 const InputInfo &Output,
364 const InputInfoList &Inputs,
365 const ArgList &TCArgs,
366 const char *LinkingOutput) const;
368 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
370 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
372 virtual bool hasIntegratedCPP() const { return false; }
373 virtual bool isLinkJob() const { return true; }
375 virtual void ConstructJob(Compilation &C, const JobAction &JA,
376 const InputInfo &Output,
377 const InputInfoList &Inputs,
378 const ArgList &TCArgs,
379 const char *LinkingOutput) const;
381 } // end namespace openbsd
383 /// bitrig -- Directly call GNU Binutils assembler and linker
385 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
387 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
390 virtual bool hasIntegratedCPP() const { return false; }
392 virtual void ConstructJob(Compilation &C, const JobAction &JA,
393 const InputInfo &Output,
394 const InputInfoList &Inputs,
395 const ArgList &TCArgs,
396 const char *LinkingOutput) const;
398 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
400 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
402 virtual bool hasIntegratedCPP() const { return false; }
403 virtual bool isLinkJob() const { return true; }
405 virtual void ConstructJob(Compilation &C, const JobAction &JA,
406 const InputInfo &Output,
407 const InputInfoList &Inputs,
408 const ArgList &TCArgs,
409 const char *LinkingOutput) const;
411 } // end namespace bitrig
413 /// freebsd -- Directly call GNU Binutils assembler and linker
415 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
417 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
420 virtual bool hasIntegratedCPP() const { return false; }
422 virtual void ConstructJob(Compilation &C, const JobAction &JA,
423 const InputInfo &Output,
424 const InputInfoList &Inputs,
425 const ArgList &TCArgs,
426 const char *LinkingOutput) const;
428 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
430 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
432 virtual bool hasIntegratedCPP() const { return false; }
433 virtual bool isLinkJob() const { return true; }
435 virtual void ConstructJob(Compilation &C, const JobAction &JA,
436 const InputInfo &Output,
437 const InputInfoList &Inputs,
438 const ArgList &TCArgs,
439 const char *LinkingOutput) const;
441 } // end namespace freebsd
443 /// netbsd -- Directly call GNU Binutils assembler and linker
445 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
448 Assemble(const ToolChain &TC)
449 : Tool("netbsd::Assemble", "assembler", TC) {}
451 virtual bool hasIntegratedCPP() const { return false; }
453 virtual void ConstructJob(Compilation &C, const JobAction &JA,
454 const InputInfo &Output,
455 const InputInfoList &Inputs,
456 const ArgList &TCArgs,
457 const char *LinkingOutput) const;
459 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
462 Link(const ToolChain &TC)
463 : Tool("netbsd::Link", "linker", TC) {}
465 virtual bool hasIntegratedCPP() const { return false; }
466 virtual bool isLinkJob() const { return true; }
468 virtual void ConstructJob(Compilation &C, const JobAction &JA,
469 const InputInfo &Output,
470 const InputInfoList &Inputs,
471 const ArgList &TCArgs,
472 const char *LinkingOutput) const;
474 } // end namespace netbsd
476 /// linux -- Directly call GNU Binutils assembler and linker
477 namespace linuxtools {
478 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
480 Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
483 virtual bool hasIntegratedCPP() const { return false; }
485 virtual void ConstructJob(Compilation &C, const JobAction &JA,
486 const InputInfo &Output,
487 const InputInfoList &Inputs,
488 const ArgList &TCArgs,
489 const char *LinkingOutput) const;
491 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
493 Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {}
495 virtual bool hasIntegratedCPP() const { return false; }
496 virtual bool isLinkJob() const { return true; }
498 virtual void ConstructJob(Compilation &C, const JobAction &JA,
499 const InputInfo &Output,
500 const InputInfoList &Inputs,
501 const ArgList &TCArgs,
502 const char *LinkingOutput) const;
505 /// minix -- Directly call GNU Binutils assembler and linker
507 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
509 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
512 virtual bool hasIntegratedCPP() const { return false; }
514 virtual void ConstructJob(Compilation &C, const JobAction &JA,
515 const InputInfo &Output,
516 const InputInfoList &Inputs,
517 const ArgList &TCArgs,
518 const char *LinkingOutput) const;
520 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
522 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
524 virtual bool hasIntegratedCPP() const { return false; }
525 virtual bool isLinkJob() const { return true; }
527 virtual void ConstructJob(Compilation &C, const JobAction &JA,
528 const InputInfo &Output,
529 const InputInfoList &Inputs,
530 const ArgList &TCArgs,
531 const char *LinkingOutput) const;
533 } // end namespace minix
535 /// solaris -- Directly call Solaris assembler and linker
537 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
539 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
542 virtual bool hasIntegratedCPP() const { return false; }
544 virtual void ConstructJob(Compilation &C, const JobAction &JA,
545 const InputInfo &Output,
546 const InputInfoList &Inputs,
547 const ArgList &TCArgs,
548 const char *LinkingOutput) const;
550 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
552 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
554 virtual bool hasIntegratedCPP() const { return false; }
555 virtual bool isLinkJob() const { return true; }
557 virtual void ConstructJob(Compilation &C, const JobAction &JA,
558 const InputInfo &Output,
559 const InputInfoList &Inputs,
560 const ArgList &TCArgs,
561 const char *LinkingOutput) const;
563 } // end namespace solaris
565 /// auroraux -- Directly call GNU Binutils assembler and linker
567 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
569 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
572 virtual bool hasIntegratedCPP() const { return false; }
574 virtual void ConstructJob(Compilation &C, const JobAction &JA,
575 const InputInfo &Output,
576 const InputInfoList &Inputs,
577 const ArgList &TCArgs,
578 const char *LinkingOutput) const;
580 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
582 Link(const ToolChain &TC) : Tool("auroraux::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 ArgList &TCArgs,
591 const char *LinkingOutput) const;
593 } // end namespace auroraux
595 /// dragonfly -- Directly call GNU Binutils assembler and linker
596 namespace dragonfly {
597 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
599 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
602 virtual bool hasIntegratedCPP() const { return false; }
604 virtual void ConstructJob(Compilation &C, const JobAction &JA,
605 const InputInfo &Output,
606 const InputInfoList &Inputs,
607 const ArgList &TCArgs,
608 const char *LinkingOutput) const;
610 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
612 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
614 virtual bool hasIntegratedCPP() const { return false; }
615 virtual bool isLinkJob() const { return true; }
617 virtual void ConstructJob(Compilation &C, const JobAction &JA,
618 const InputInfo &Output,
619 const InputInfoList &Inputs,
620 const ArgList &TCArgs,
621 const char *LinkingOutput) const;
623 } // end namespace dragonfly
625 /// Visual studio tools.
626 namespace visualstudio {
627 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
629 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
631 virtual bool hasIntegratedCPP() const { return false; }
632 virtual bool isLinkJob() const { return true; }
634 virtual void ConstructJob(Compilation &C, const JobAction &JA,
635 const InputInfo &Output,
636 const InputInfoList &Inputs,
637 const ArgList &TCArgs,
638 const char *LinkingOutput) const;
640 } // end namespace visualstudio
642 } // end namespace toolchains
643 } // end namespace driver
644 } // end namespace clang
646 #endif // CLANG_LIB_DRIVER_TOOLS_H_