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 static const char *getBaseInputName(const ArgList &Args,
35 const InputInfoList &Inputs);
36 static const char *getBaseInputStem(const ArgList &Args,
37 const InputInfoList &Inputs);
38 static const char *getDependencyFileName(const ArgList &Args,
39 const InputInfoList &Inputs);
41 void AddPreprocessingOptions(Compilation &C,
44 ArgStringList &CmdArgs,
45 const InputInfo &Output,
46 const InputInfoList &Inputs) const;
48 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
49 bool KernelOrKext) const;
50 void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
51 void AddPPCTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
52 void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
53 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
54 void AddHexagonTargetArgs (const ArgList &Args, ArgStringList &CmdArgs) const;
56 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
58 ObjCRuntime AddObjCRuntimeArgs(const ArgList &args, ArgStringList &cmdArgs,
59 RewriteKind rewrite) const;
62 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
64 virtual bool hasGoodDiagnostics() const { return true; }
65 virtual bool hasIntegratedAssembler() const { return true; }
66 virtual bool hasIntegratedCPP() const { return true; }
68 virtual void ConstructJob(Compilation &C, const JobAction &JA,
69 const InputInfo &Output,
70 const InputInfoList &Inputs,
71 const ArgList &TCArgs,
72 const char *LinkingOutput) const;
75 /// \brief Clang integrated assembler tool.
76 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
77 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
79 ClangAs(const ToolChain &TC) : Tool("clang::as",
80 "clang integrated assembler", TC) {}
82 virtual bool hasGoodDiagnostics() const { return true; }
83 virtual bool hasIntegratedAssembler() const { return false; }
84 virtual bool hasIntegratedCPP() const { return false; }
86 virtual void ConstructJob(Compilation &C, const JobAction &JA,
87 const InputInfo &Output,
88 const InputInfoList &Inputs,
89 const ArgList &TCArgs,
90 const char *LinkingOutput) const;
93 /// gcc - Generic GCC tool implementations.
95 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
97 Common(const char *Name, const char *ShortName,
98 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
100 virtual void ConstructJob(Compilation &C, const JobAction &JA,
101 const InputInfo &Output,
102 const InputInfoList &Inputs,
103 const ArgList &TCArgs,
104 const char *LinkingOutput) const;
106 /// RenderExtraToolArgs - Render any arguments necessary to force
107 /// the particular tool mode.
108 virtual void RenderExtraToolArgs(const JobAction &JA,
109 ArgStringList &CmdArgs) const = 0;
113 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
115 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
116 "gcc preprocessor", TC) {}
118 virtual bool hasGoodDiagnostics() const { return true; }
119 virtual bool hasIntegratedCPP() const { return false; }
121 virtual void RenderExtraToolArgs(const JobAction &JA,
122 ArgStringList &CmdArgs) const;
125 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
127 Precompile(const ToolChain &TC) : Common("gcc::Precompile",
128 "gcc precompile", TC) {}
130 virtual bool hasGoodDiagnostics() const { return true; }
131 virtual bool hasIntegratedCPP() const { return true; }
133 virtual void RenderExtraToolArgs(const JobAction &JA,
134 ArgStringList &CmdArgs) const;
137 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
139 Compile(const ToolChain &TC) : Common("gcc::Compile",
140 "gcc frontend", TC) {}
142 virtual bool hasGoodDiagnostics() const { return true; }
143 virtual bool hasIntegratedCPP() const { return true; }
145 virtual void RenderExtraToolArgs(const JobAction &JA,
146 ArgStringList &CmdArgs) const;
149 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
151 Assemble(const ToolChain &TC) : Common("gcc::Assemble",
152 "assembler (via gcc)", TC) {}
154 virtual bool hasIntegratedCPP() const { return false; }
156 virtual void RenderExtraToolArgs(const JobAction &JA,
157 ArgStringList &CmdArgs) const;
160 class LLVM_LIBRARY_VISIBILITY Link : public Common {
162 Link(const ToolChain &TC) : Common("gcc::Link",
163 "linker (via gcc)", TC) {}
165 virtual bool hasIntegratedCPP() const { return false; }
166 virtual bool isLinkJob() const { return true; }
168 virtual void RenderExtraToolArgs(const JobAction &JA,
169 ArgStringList &CmdArgs) const;
171 } // end namespace gcc
174 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
175 // We simply use "clang -cc1" for those actions.
176 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
178 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
181 virtual bool hasIntegratedCPP() const { return false; }
183 virtual void RenderExtraToolArgs(const JobAction &JA,
184 ArgStringList &CmdArgs) const;
185 virtual void ConstructJob(Compilation &C, const JobAction &JA,
186 const InputInfo &Output,
187 const InputInfoList &Inputs,
188 const ArgList &TCArgs,
189 const char *LinkingOutput) const;
192 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
194 Link(const ToolChain &TC) : Tool("hexagon::Link",
197 virtual bool hasIntegratedCPP() const { return false; }
198 virtual bool isLinkJob() const { return true; }
200 virtual void RenderExtraToolArgs(const JobAction &JA,
201 ArgStringList &CmdArgs) const;
202 virtual void ConstructJob(Compilation &C, const JobAction &JA,
203 const InputInfo &Output,
204 const InputInfoList &Inputs,
205 const ArgList &TCArgs,
206 const char *LinkingOutput) const;
208 } // end namespace hexagon.
212 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
214 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
215 virtual void anchor();
217 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
219 const toolchains::Darwin &getDarwinToolChain() const {
220 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
224 DarwinTool(const char *Name, const char *ShortName,
225 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
228 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
230 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
233 virtual bool hasIntegratedCPP() const { return false; }
235 virtual void ConstructJob(Compilation &C, const JobAction &JA,
236 const InputInfo &Output,
237 const InputInfoList &Inputs,
238 const ArgList &TCArgs,
239 const char *LinkingOutput) const;
242 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
243 bool NeedsTempPath(const InputInfoList &Inputs) const;
244 void AddLinkArgs(Compilation &C, const ArgList &Args,
245 ArgStringList &CmdArgs, const InputInfoList &Inputs) const;
248 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
250 virtual bool hasIntegratedCPP() const { return false; }
251 virtual bool isLinkJob() const { return true; }
253 virtual void ConstructJob(Compilation &C, const JobAction &JA,
254 const InputInfo &Output,
255 const InputInfoList &Inputs,
256 const ArgList &TCArgs,
257 const char *LinkingOutput) const;
260 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
262 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
264 virtual bool hasIntegratedCPP() const { return false; }
266 virtual void ConstructJob(Compilation &C, const JobAction &JA,
267 const InputInfo &Output,
268 const InputInfoList &Inputs,
269 const ArgList &TCArgs,
270 const char *LinkingOutput) const;
273 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
275 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
278 virtual bool hasIntegratedCPP() const { return false; }
280 virtual void ConstructJob(Compilation &C, const JobAction &JA,
281 const InputInfo &Output,
282 const InputInfoList &Inputs,
283 const ArgList &TCArgs,
284 const char *LinkingOutput) const;
287 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
289 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
292 virtual bool hasIntegratedCPP() const { return false; }
294 virtual void ConstructJob(Compilation &C, const JobAction &JA,
295 const InputInfo &Output,
296 const InputInfoList &Inputs,
297 const ArgList &TCArgs,
298 const char *LinkingOutput) const;
303 /// openbsd -- Directly call GNU Binutils assembler and linker
305 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
307 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
310 virtual bool hasIntegratedCPP() const { return false; }
312 virtual void ConstructJob(Compilation &C, const JobAction &JA,
313 const InputInfo &Output,
314 const InputInfoList &Inputs,
315 const ArgList &TCArgs,
316 const char *LinkingOutput) const;
318 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
320 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
322 virtual bool hasIntegratedCPP() const { return false; }
323 virtual bool isLinkJob() const { return true; }
325 virtual void ConstructJob(Compilation &C, const JobAction &JA,
326 const InputInfo &Output,
327 const InputInfoList &Inputs,
328 const ArgList &TCArgs,
329 const char *LinkingOutput) const;
331 } // end namespace openbsd
333 /// bitrig -- Directly call GNU Binutils assembler and linker
335 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
337 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
340 virtual bool hasIntegratedCPP() const { return false; }
342 virtual void ConstructJob(Compilation &C, const JobAction &JA,
343 const InputInfo &Output,
344 const InputInfoList &Inputs,
345 const ArgList &TCArgs,
346 const char *LinkingOutput) const;
348 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
350 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
352 virtual bool hasIntegratedCPP() const { return false; }
353 virtual bool isLinkJob() const { return true; }
355 virtual void ConstructJob(Compilation &C, const JobAction &JA,
356 const InputInfo &Output,
357 const InputInfoList &Inputs,
358 const ArgList &TCArgs,
359 const char *LinkingOutput) const;
361 } // end namespace bitrig
363 /// freebsd -- Directly call GNU Binutils assembler and linker
365 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
367 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
370 virtual bool hasIntegratedCPP() const { return false; }
372 virtual void ConstructJob(Compilation &C, const JobAction &JA,
373 const InputInfo &Output,
374 const InputInfoList &Inputs,
375 const ArgList &TCArgs,
376 const char *LinkingOutput) const;
378 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
380 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
382 virtual bool hasIntegratedCPP() const { return false; }
383 virtual bool isLinkJob() const { return true; }
385 virtual void ConstructJob(Compilation &C, const JobAction &JA,
386 const InputInfo &Output,
387 const InputInfoList &Inputs,
388 const ArgList &TCArgs,
389 const char *LinkingOutput) const;
391 } // end namespace freebsd
393 /// netbsd -- Directly call GNU Binutils assembler and linker
395 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
398 Assemble(const ToolChain &TC)
399 : Tool("netbsd::Assemble", "assembler", TC) {}
401 virtual bool hasIntegratedCPP() const { return false; }
403 virtual void ConstructJob(Compilation &C, const JobAction &JA,
404 const InputInfo &Output,
405 const InputInfoList &Inputs,
406 const ArgList &TCArgs,
407 const char *LinkingOutput) const;
409 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
412 Link(const ToolChain &TC)
413 : Tool("netbsd::Link", "linker", TC) {}
415 virtual bool hasIntegratedCPP() const { return false; }
416 virtual bool isLinkJob() const { return true; }
418 virtual void ConstructJob(Compilation &C, const JobAction &JA,
419 const InputInfo &Output,
420 const InputInfoList &Inputs,
421 const ArgList &TCArgs,
422 const char *LinkingOutput) const;
424 } // end namespace netbsd
426 /// linux -- Directly call GNU Binutils assembler and linker
427 namespace linuxtools {
428 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
430 Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
433 virtual bool hasIntegratedCPP() const { return false; }
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 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
443 Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {}
445 virtual bool hasIntegratedCPP() const { return false; }
446 virtual bool isLinkJob() const { return true; }
448 virtual void ConstructJob(Compilation &C, const JobAction &JA,
449 const InputInfo &Output,
450 const InputInfoList &Inputs,
451 const ArgList &TCArgs,
452 const char *LinkingOutput) const;
455 /// minix -- Directly call GNU Binutils assembler and linker
457 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
459 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
462 virtual bool hasIntegratedCPP() const { return false; }
464 virtual void ConstructJob(Compilation &C, const JobAction &JA,
465 const InputInfo &Output,
466 const InputInfoList &Inputs,
467 const ArgList &TCArgs,
468 const char *LinkingOutput) const;
470 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
472 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
474 virtual bool hasIntegratedCPP() const { return false; }
475 virtual bool isLinkJob() const { return true; }
477 virtual void ConstructJob(Compilation &C, const JobAction &JA,
478 const InputInfo &Output,
479 const InputInfoList &Inputs,
480 const ArgList &TCArgs,
481 const char *LinkingOutput) const;
483 } // end namespace minix
485 /// solaris -- Directly call Solaris assembler and linker
487 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
489 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
492 virtual bool hasIntegratedCPP() const { return false; }
494 virtual void ConstructJob(Compilation &C, const JobAction &JA,
495 const InputInfo &Output,
496 const InputInfoList &Inputs,
497 const ArgList &TCArgs,
498 const char *LinkingOutput) const;
500 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
502 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
504 virtual bool hasIntegratedCPP() const { return false; }
505 virtual bool isLinkJob() const { return true; }
507 virtual void ConstructJob(Compilation &C, const JobAction &JA,
508 const InputInfo &Output,
509 const InputInfoList &Inputs,
510 const ArgList &TCArgs,
511 const char *LinkingOutput) const;
513 } // end namespace solaris
515 /// auroraux -- Directly call GNU Binutils assembler and linker
517 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
519 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
522 virtual bool hasIntegratedCPP() const { return false; }
524 virtual void ConstructJob(Compilation &C, const JobAction &JA,
525 const InputInfo &Output,
526 const InputInfoList &Inputs,
527 const ArgList &TCArgs,
528 const char *LinkingOutput) const;
530 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
532 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
534 virtual bool hasIntegratedCPP() const { return false; }
535 virtual bool isLinkJob() const { return true; }
537 virtual void ConstructJob(Compilation &C, const JobAction &JA,
538 const InputInfo &Output,
539 const InputInfoList &Inputs,
540 const ArgList &TCArgs,
541 const char *LinkingOutput) const;
543 } // end namespace auroraux
545 /// dragonfly -- Directly call GNU Binutils assembler and linker
546 namespace dragonfly {
547 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
549 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
552 virtual bool hasIntegratedCPP() const { return false; }
554 virtual void ConstructJob(Compilation &C, const JobAction &JA,
555 const InputInfo &Output,
556 const InputInfoList &Inputs,
557 const ArgList &TCArgs,
558 const char *LinkingOutput) const;
560 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
562 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
564 virtual bool hasIntegratedCPP() const { return false; }
565 virtual bool isLinkJob() const { return true; }
567 virtual void ConstructJob(Compilation &C, const JobAction &JA,
568 const InputInfo &Output,
569 const InputInfoList &Inputs,
570 const ArgList &TCArgs,
571 const char *LinkingOutput) const;
573 } // end namespace dragonfly
575 /// Visual studio tools.
576 namespace visualstudio {
577 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
579 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
581 virtual bool hasIntegratedCPP() const { return false; }
582 virtual bool isLinkJob() const { return true; }
584 virtual void ConstructJob(Compilation &C, const JobAction &JA,
585 const InputInfo &Output,
586 const InputInfoList &Inputs,
587 const ArgList &TCArgs,
588 const char *LinkingOutput) const;
590 } // end namespace visualstudio
592 } // end namespace toolchains
593 } // end namespace driver
594 } // end namespace clang
596 #endif // CLANG_LIB_DRIVER_TOOLS_H_