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"
26 namespace toolchains {
31 using llvm::opt::ArgStringList;
33 /// \brief Clang compiler tool.
34 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
36 static const char *getBaseInputName(const llvm::opt::ArgList &Args,
37 const InputInfoList &Inputs);
38 static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
39 const InputInfoList &Inputs);
40 static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
41 const InputInfoList &Inputs);
44 void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
46 const llvm::opt::ArgList &Args,
47 llvm::opt::ArgStringList &CmdArgs,
48 const InputInfo &Output,
49 const InputInfoList &Inputs) const;
51 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
52 llvm::opt::ArgStringList &CmdArgs,
53 bool KernelOrKext) const;
54 void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
55 llvm::opt::ArgStringList &CmdArgs) const;
56 void AddPPCTargetArgs(const llvm::opt::ArgList &Args,
57 llvm::opt::ArgStringList &CmdArgs) const;
58 void AddR600TargetArgs(const llvm::opt::ArgList &Args,
59 llvm::opt::ArgStringList &CmdArgs) const;
60 void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
61 llvm::opt::ArgStringList &CmdArgs) const;
62 void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
63 llvm::opt::ArgStringList &CmdArgs) const;
64 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
65 llvm::opt::ArgStringList &CmdArgs) const;
66 void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
67 llvm::opt::ArgStringList &CmdArgs) const;
69 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
71 ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
72 llvm::opt::ArgStringList &cmdArgs,
73 RewriteKind rewrite) const;
76 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
78 virtual bool hasGoodDiagnostics() const { return true; }
79 virtual bool hasIntegratedAssembler() const { return true; }
80 virtual bool hasIntegratedCPP() const { return true; }
82 virtual void ConstructJob(Compilation &C, const JobAction &JA,
83 const InputInfo &Output,
84 const InputInfoList &Inputs,
85 const llvm::opt::ArgList &TCArgs,
86 const char *LinkingOutput) const;
89 /// \brief Clang integrated assembler tool.
90 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
91 void AddARMTargetArgs(const llvm::opt::ArgList &Args,
92 llvm::opt::ArgStringList &CmdArgs) const;
93 void AddX86TargetArgs(const llvm::opt::ArgList &Args,
94 llvm::opt::ArgStringList &CmdArgs) const;
97 ClangAs(const ToolChain &TC) : Tool("clang::as",
98 "clang integrated assembler", TC) {}
100 virtual bool hasGoodDiagnostics() const { return true; }
101 virtual bool hasIntegratedAssembler() const { return false; }
102 virtual bool hasIntegratedCPP() const { return false; }
104 virtual void ConstructJob(Compilation &C, const JobAction &JA,
105 const InputInfo &Output,
106 const InputInfoList &Inputs,
107 const llvm::opt::ArgList &TCArgs,
108 const char *LinkingOutput) const;
111 /// gcc - Generic GCC tool implementations.
113 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
115 Common(const char *Name, const char *ShortName,
116 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
118 virtual void ConstructJob(Compilation &C, const JobAction &JA,
119 const InputInfo &Output,
120 const InputInfoList &Inputs,
121 const llvm::opt::ArgList &TCArgs,
122 const char *LinkingOutput) const;
124 /// RenderExtraToolArgs - Render any arguments necessary to force
125 /// the particular tool mode.
127 RenderExtraToolArgs(const JobAction &JA,
128 llvm::opt::ArgStringList &CmdArgs) const = 0;
131 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
133 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
134 "gcc preprocessor", TC) {}
136 virtual bool hasGoodDiagnostics() const { return true; }
137 virtual bool hasIntegratedCPP() const { return false; }
139 virtual void RenderExtraToolArgs(const JobAction &JA,
140 llvm::opt::ArgStringList &CmdArgs) const;
143 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
145 Precompile(const ToolChain &TC) : Common("gcc::Precompile",
146 "gcc precompile", TC) {}
148 virtual bool hasGoodDiagnostics() const { return true; }
149 virtual bool hasIntegratedCPP() const { return true; }
151 virtual void RenderExtraToolArgs(const JobAction &JA,
152 llvm::opt::ArgStringList &CmdArgs) const;
155 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
157 Compile(const ToolChain &TC) : Common("gcc::Compile",
158 "gcc frontend", TC) {}
160 virtual bool hasGoodDiagnostics() const { return true; }
161 virtual bool hasIntegratedCPP() const { return true; }
163 virtual void RenderExtraToolArgs(const JobAction &JA,
164 llvm::opt::ArgStringList &CmdArgs) const;
167 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
169 Assemble(const ToolChain &TC) : Common("gcc::Assemble",
170 "assembler (via gcc)", TC) {}
172 virtual bool hasIntegratedCPP() const { return false; }
174 virtual void RenderExtraToolArgs(const JobAction &JA,
175 llvm::opt::ArgStringList &CmdArgs) const;
178 class LLVM_LIBRARY_VISIBILITY Link : public Common {
180 Link(const ToolChain &TC) : Common("gcc::Link",
181 "linker (via gcc)", TC) {}
183 virtual bool hasIntegratedCPP() const { return false; }
184 virtual bool isLinkJob() const { return true; }
186 virtual void RenderExtraToolArgs(const JobAction &JA,
187 llvm::opt::ArgStringList &CmdArgs) const;
189 } // end namespace gcc
192 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
193 // We simply use "clang -cc1" for those actions.
194 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
196 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
199 virtual bool hasIntegratedCPP() const { return false; }
201 virtual void RenderExtraToolArgs(const JobAction &JA,
202 llvm::opt::ArgStringList &CmdArgs) const;
203 virtual void ConstructJob(Compilation &C, const JobAction &JA,
204 const InputInfo &Output,
205 const InputInfoList &Inputs,
206 const llvm::opt::ArgList &TCArgs,
207 const char *LinkingOutput) const;
210 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
212 Link(const ToolChain &TC) : Tool("hexagon::Link",
215 virtual bool hasIntegratedCPP() const { return false; }
216 virtual bool isLinkJob() const { return true; }
218 virtual void RenderExtraToolArgs(const JobAction &JA,
219 llvm::opt::ArgStringList &CmdArgs) const;
220 virtual void ConstructJob(Compilation &C, const JobAction &JA,
221 const InputInfo &Output,
222 const InputInfoList &Inputs,
223 const llvm::opt::ArgList &TCArgs,
224 const char *LinkingOutput) const;
226 } // end namespace hexagon.
230 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
232 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
233 virtual void anchor();
235 void AddDarwinArch(const llvm::opt::ArgList &Args,
236 llvm::opt::ArgStringList &CmdArgs) const;
238 const toolchains::Darwin &getDarwinToolChain() const {
239 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
243 DarwinTool(const char *Name, const char *ShortName,
244 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
247 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
249 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
252 virtual bool hasIntegratedCPP() const { return false; }
254 virtual void ConstructJob(Compilation &C, const JobAction &JA,
255 const InputInfo &Output,
256 const InputInfoList &Inputs,
257 const llvm::opt::ArgList &TCArgs,
258 const char *LinkingOutput) const;
261 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
262 bool NeedsTempPath(const InputInfoList &Inputs) const;
263 void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
264 llvm::opt::ArgStringList &CmdArgs,
265 const InputInfoList &Inputs) const;
268 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
270 virtual bool hasIntegratedCPP() const { return false; }
271 virtual bool isLinkJob() const { return true; }
273 virtual void ConstructJob(Compilation &C, const JobAction &JA,
274 const InputInfo &Output,
275 const InputInfoList &Inputs,
276 const llvm::opt::ArgList &TCArgs,
277 const char *LinkingOutput) const;
280 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
282 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
284 virtual bool hasIntegratedCPP() const { return false; }
286 virtual void ConstructJob(Compilation &C, const JobAction &JA,
287 const InputInfo &Output,
288 const InputInfoList &Inputs,
289 const llvm::opt::ArgList &TCArgs,
290 const char *LinkingOutput) const;
293 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
295 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
298 virtual bool hasIntegratedCPP() const { return false; }
299 virtual bool isDsymutilJob() const { return true; }
301 virtual void ConstructJob(Compilation &C, const JobAction &JA,
302 const InputInfo &Output,
303 const InputInfoList &Inputs,
304 const llvm::opt::ArgList &TCArgs,
305 const char *LinkingOutput) const;
308 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
310 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
313 virtual bool hasIntegratedCPP() const { return false; }
315 virtual void ConstructJob(Compilation &C, const JobAction &JA,
316 const InputInfo &Output,
317 const InputInfoList &Inputs,
318 const llvm::opt::ArgList &TCArgs,
319 const char *LinkingOutput) const;
324 /// openbsd -- Directly call GNU Binutils assembler and linker
326 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
328 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
331 virtual bool hasIntegratedCPP() const { return false; }
333 virtual void ConstructJob(Compilation &C, const JobAction &JA,
334 const InputInfo &Output,
335 const InputInfoList &Inputs,
336 const llvm::opt::ArgList &TCArgs,
337 const char *LinkingOutput) const;
339 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
341 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
343 virtual bool hasIntegratedCPP() const { return false; }
344 virtual bool isLinkJob() const { return true; }
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 } // end namespace openbsd
354 /// bitrig -- Directly call GNU Binutils assembler and linker
356 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
358 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
361 virtual bool hasIntegratedCPP() const { return false; }
363 virtual void ConstructJob(Compilation &C, const JobAction &JA,
364 const InputInfo &Output,
365 const InputInfoList &Inputs,
366 const llvm::opt::ArgList &TCArgs,
367 const char *LinkingOutput) const;
369 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
371 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
373 virtual bool hasIntegratedCPP() const { return false; }
374 virtual bool isLinkJob() const { return true; }
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 } // end namespace bitrig
384 /// freebsd -- Directly call GNU Binutils assembler and linker
386 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
388 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
391 virtual bool hasIntegratedCPP() const { return false; }
393 virtual void ConstructJob(Compilation &C, const JobAction &JA,
394 const InputInfo &Output,
395 const InputInfoList &Inputs,
396 const llvm::opt::ArgList &TCArgs,
397 const char *LinkingOutput) const;
399 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
401 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
403 virtual bool hasIntegratedCPP() const { return false; }
404 virtual bool isLinkJob() const { return true; }
406 virtual void ConstructJob(Compilation &C, const JobAction &JA,
407 const InputInfo &Output,
408 const InputInfoList &Inputs,
409 const llvm::opt::ArgList &TCArgs,
410 const char *LinkingOutput) const;
412 } // end namespace freebsd
414 /// netbsd -- Directly call GNU Binutils assembler and linker
416 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
419 Assemble(const ToolChain &TC)
420 : Tool("netbsd::Assemble", "assembler", TC) {}
422 virtual bool hasIntegratedCPP() const { return false; }
424 virtual void ConstructJob(Compilation &C, const JobAction &JA,
425 const InputInfo &Output,
426 const InputInfoList &Inputs,
427 const llvm::opt::ArgList &TCArgs,
428 const char *LinkingOutput) const;
430 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
433 Link(const ToolChain &TC)
434 : Tool("netbsd::Link", "linker", TC) {}
436 virtual bool hasIntegratedCPP() const { return false; }
437 virtual bool isLinkJob() const { return true; }
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 } // end namespace netbsd
447 /// Directly call GNU Binutils' assembler and linker.
449 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
451 Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
453 virtual bool hasIntegratedCPP() const { return false; }
455 virtual void ConstructJob(Compilation &C, const JobAction &JA,
456 const InputInfo &Output,
457 const InputInfoList &Inputs,
458 const llvm::opt::ArgList &TCArgs,
459 const char *LinkingOutput) const;
461 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
463 Link(const ToolChain &TC) : Tool("GNU::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 llvm::opt::ArgList &TCArgs,
472 const char *LinkingOutput) const;
475 /// minix -- Directly call GNU Binutils assembler and linker
477 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
479 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
482 virtual bool hasIntegratedCPP() const { return false; }
484 virtual void ConstructJob(Compilation &C, const JobAction &JA,
485 const InputInfo &Output,
486 const InputInfoList &Inputs,
487 const llvm::opt::ArgList &TCArgs,
488 const char *LinkingOutput) const;
490 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
492 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
494 virtual bool hasIntegratedCPP() const { return false; }
495 virtual bool isLinkJob() const { return true; }
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 } // end namespace minix
505 /// solaris -- Directly call Solaris assembler and linker
507 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
509 Assemble(const ToolChain &TC) : Tool("solaris::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 llvm::opt::ArgList &TCArgs,
518 const char *LinkingOutput) const;
520 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
522 Link(const ToolChain &TC) : Tool("solaris::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 llvm::opt::ArgList &TCArgs,
531 const char *LinkingOutput) const;
533 } // end namespace solaris
535 /// auroraux -- Directly call GNU Binutils assembler and linker
537 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
539 Assemble(const ToolChain &TC) : Tool("auroraux::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 llvm::opt::ArgList &TCArgs,
548 const char *LinkingOutput) const;
550 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
552 Link(const ToolChain &TC) : Tool("auroraux::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 llvm::opt::ArgList &TCArgs,
561 const char *LinkingOutput) const;
563 } // end namespace auroraux
565 /// dragonfly -- Directly call GNU Binutils assembler and linker
566 namespace dragonfly {
567 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
569 Assemble(const ToolChain &TC) : Tool("dragonfly::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 llvm::opt::ArgList &TCArgs,
578 const char *LinkingOutput) const;
580 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
582 Link(const ToolChain &TC) : Tool("dragonfly::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;
593 } // end namespace dragonfly
595 /// Visual studio tools.
596 namespace visualstudio {
597 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
599 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
601 virtual bool hasIntegratedCPP() const { return false; }
602 virtual bool isLinkJob() const { return true; }
604 virtual void ConstructJob(Compilation &C, const JobAction &JA,
605 const InputInfo &Output,
606 const InputInfoList &Inputs,
607 const llvm::opt::ArgList &TCArgs,
608 const char *LinkingOutput) const;
610 } // end namespace visualstudio
612 } // end namespace toolchains
613 } // end namespace driver
614 } // end namespace clang
616 #endif // CLANG_LIB_DRIVER_TOOLS_H_