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/Support/Compiler.h"
25 namespace toolchains {
31 /// \brief Clang compiler tool.
32 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);
42 void AddPreprocessingOptions(Compilation &C,
46 ArgStringList &CmdArgs,
47 const InputInfo &Output,
48 const InputInfoList &Inputs) const;
50 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
51 bool KernelOrKext) const;
52 void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
53 void AddPPCTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
54 void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
55 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
56 void AddHexagonTargetArgs (const ArgList &Args, ArgStringList &CmdArgs) const;
58 enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
60 ObjCRuntime AddObjCRuntimeArgs(const ArgList &args, ArgStringList &cmdArgs,
61 RewriteKind rewrite) const;
64 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
66 virtual bool hasGoodDiagnostics() const { return true; }
67 virtual bool hasIntegratedAssembler() const { return true; }
68 virtual bool hasIntegratedCPP() const { return true; }
70 virtual void ConstructJob(Compilation &C, const JobAction &JA,
71 const InputInfo &Output,
72 const InputInfoList &Inputs,
73 const ArgList &TCArgs,
74 const char *LinkingOutput) const;
77 /// \brief Clang integrated assembler tool.
78 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
79 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
81 ClangAs(const ToolChain &TC) : Tool("clang::as",
82 "clang integrated assembler", TC) {}
84 virtual bool hasGoodDiagnostics() const { return true; }
85 virtual bool hasIntegratedAssembler() const { return false; }
86 virtual bool hasIntegratedCPP() const { return false; }
88 virtual void ConstructJob(Compilation &C, const JobAction &JA,
89 const InputInfo &Output,
90 const InputInfoList &Inputs,
91 const ArgList &TCArgs,
92 const char *LinkingOutput) const;
95 /// gcc - Generic GCC tool implementations.
97 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
99 Common(const char *Name, const char *ShortName,
100 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
102 virtual void ConstructJob(Compilation &C, const JobAction &JA,
103 const InputInfo &Output,
104 const InputInfoList &Inputs,
105 const ArgList &TCArgs,
106 const char *LinkingOutput) const;
108 /// RenderExtraToolArgs - Render any arguments necessary to force
109 /// the particular tool mode.
110 virtual void RenderExtraToolArgs(const JobAction &JA,
111 ArgStringList &CmdArgs) const = 0;
115 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
117 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
118 "gcc preprocessor", TC) {}
120 virtual bool hasGoodDiagnostics() const { return true; }
121 virtual bool hasIntegratedCPP() const { return false; }
123 virtual void RenderExtraToolArgs(const JobAction &JA,
124 ArgStringList &CmdArgs) const;
127 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
129 Precompile(const ToolChain &TC) : Common("gcc::Precompile",
130 "gcc precompile", TC) {}
132 virtual bool hasGoodDiagnostics() const { return true; }
133 virtual bool hasIntegratedCPP() const { return true; }
135 virtual void RenderExtraToolArgs(const JobAction &JA,
136 ArgStringList &CmdArgs) const;
139 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
141 Compile(const ToolChain &TC) : Common("gcc::Compile",
142 "gcc frontend", TC) {}
144 virtual bool hasGoodDiagnostics() const { return true; }
145 virtual bool hasIntegratedCPP() const { return true; }
147 virtual void RenderExtraToolArgs(const JobAction &JA,
148 ArgStringList &CmdArgs) const;
151 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
153 Assemble(const ToolChain &TC) : Common("gcc::Assemble",
154 "assembler (via gcc)", TC) {}
156 virtual bool hasIntegratedCPP() const { return false; }
158 virtual void RenderExtraToolArgs(const JobAction &JA,
159 ArgStringList &CmdArgs) const;
162 class LLVM_LIBRARY_VISIBILITY Link : public Common {
164 Link(const ToolChain &TC) : Common("gcc::Link",
165 "linker (via gcc)", TC) {}
167 virtual bool hasIntegratedCPP() const { return false; }
168 virtual bool isLinkJob() const { return true; }
170 virtual void RenderExtraToolArgs(const JobAction &JA,
171 ArgStringList &CmdArgs) const;
173 } // end namespace gcc
176 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
177 // We simply use "clang -cc1" for those actions.
178 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
180 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
183 virtual bool hasIntegratedCPP() const { return false; }
185 virtual void RenderExtraToolArgs(const JobAction &JA,
186 ArgStringList &CmdArgs) const;
187 virtual void ConstructJob(Compilation &C, const JobAction &JA,
188 const InputInfo &Output,
189 const InputInfoList &Inputs,
190 const ArgList &TCArgs,
191 const char *LinkingOutput) const;
194 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
196 Link(const ToolChain &TC) : Tool("hexagon::Link",
199 virtual bool hasIntegratedCPP() const { return false; }
200 virtual bool isLinkJob() const { return true; }
202 virtual void RenderExtraToolArgs(const JobAction &JA,
203 ArgStringList &CmdArgs) const;
204 virtual void ConstructJob(Compilation &C, const JobAction &JA,
205 const InputInfo &Output,
206 const InputInfoList &Inputs,
207 const ArgList &TCArgs,
208 const char *LinkingOutput) const;
210 } // end namespace hexagon.
214 llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
216 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
217 virtual void anchor();
219 void AddDarwinArch(const ArgList &Args, 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 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 ArgList &Args,
247 ArgStringList &CmdArgs, const InputInfoList &Inputs) const;
250 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
252 virtual bool hasIntegratedCPP() const { return false; }
253 virtual bool isLinkJob() const { return true; }
255 virtual void ConstructJob(Compilation &C, const JobAction &JA,
256 const InputInfo &Output,
257 const InputInfoList &Inputs,
258 const ArgList &TCArgs,
259 const char *LinkingOutput) const;
262 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
264 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
266 virtual bool hasIntegratedCPP() const { return false; }
268 virtual void ConstructJob(Compilation &C, const JobAction &JA,
269 const InputInfo &Output,
270 const InputInfoList &Inputs,
271 const ArgList &TCArgs,
272 const char *LinkingOutput) const;
275 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
277 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
280 virtual bool hasIntegratedCPP() const { return false; }
281 virtual bool isDsymutilJob() const { return true; }
283 virtual void ConstructJob(Compilation &C, const JobAction &JA,
284 const InputInfo &Output,
285 const InputInfoList &Inputs,
286 const ArgList &TCArgs,
287 const char *LinkingOutput) const;
290 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
292 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
295 virtual bool hasIntegratedCPP() const { return false; }
297 virtual void ConstructJob(Compilation &C, const JobAction &JA,
298 const InputInfo &Output,
299 const InputInfoList &Inputs,
300 const ArgList &TCArgs,
301 const char *LinkingOutput) const;
306 /// openbsd -- Directly call GNU Binutils assembler and linker
308 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
310 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
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 ArgList &TCArgs,
319 const char *LinkingOutput) const;
321 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
323 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
325 virtual bool hasIntegratedCPP() const { return false; }
326 virtual bool isLinkJob() const { return true; }
328 virtual void ConstructJob(Compilation &C, const JobAction &JA,
329 const InputInfo &Output,
330 const InputInfoList &Inputs,
331 const ArgList &TCArgs,
332 const char *LinkingOutput) const;
334 } // end namespace openbsd
336 /// bitrig -- Directly call GNU Binutils assembler and linker
338 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
340 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
343 virtual bool hasIntegratedCPP() const { return false; }
345 virtual void ConstructJob(Compilation &C, const JobAction &JA,
346 const InputInfo &Output,
347 const InputInfoList &Inputs,
348 const ArgList &TCArgs,
349 const char *LinkingOutput) const;
351 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
353 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
355 virtual bool hasIntegratedCPP() const { return false; }
356 virtual bool isLinkJob() const { return true; }
358 virtual void ConstructJob(Compilation &C, const JobAction &JA,
359 const InputInfo &Output,
360 const InputInfoList &Inputs,
361 const ArgList &TCArgs,
362 const char *LinkingOutput) const;
364 } // end namespace bitrig
366 /// freebsd -- Directly call GNU Binutils assembler and linker
368 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
370 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
373 virtual bool hasIntegratedCPP() const { return false; }
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 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
383 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
385 virtual bool hasIntegratedCPP() const { return false; }
386 virtual bool isLinkJob() const { return true; }
388 virtual void ConstructJob(Compilation &C, const JobAction &JA,
389 const InputInfo &Output,
390 const InputInfoList &Inputs,
391 const ArgList &TCArgs,
392 const char *LinkingOutput) const;
394 } // end namespace freebsd
396 /// netbsd -- Directly call GNU Binutils assembler and linker
398 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
401 Assemble(const ToolChain &TC)
402 : Tool("netbsd::Assemble", "assembler", TC) {}
404 virtual bool hasIntegratedCPP() const { return false; }
406 virtual void ConstructJob(Compilation &C, const JobAction &JA,
407 const InputInfo &Output,
408 const InputInfoList &Inputs,
409 const ArgList &TCArgs,
410 const char *LinkingOutput) const;
412 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
415 Link(const ToolChain &TC)
416 : Tool("netbsd::Link", "linker", TC) {}
418 virtual bool hasIntegratedCPP() const { return false; }
419 virtual bool isLinkJob() const { return true; }
421 virtual void ConstructJob(Compilation &C, const JobAction &JA,
422 const InputInfo &Output,
423 const InputInfoList &Inputs,
424 const ArgList &TCArgs,
425 const char *LinkingOutput) const;
427 } // end namespace netbsd
429 /// linux -- Directly call GNU Binutils assembler and linker
430 namespace linuxtools {
431 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
433 Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
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 ArgList &TCArgs,
442 const char *LinkingOutput) const;
444 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
446 Link(const ToolChain &TC) : Tool("linux::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 ArgList &TCArgs,
455 const char *LinkingOutput) const;
458 class LLVM_LIBRARY_VISIBILITY SplitDebug : public Tool {
460 SplitDebug(const ToolChain &TC) : Tool("linuxtools::SplitDebug",
463 virtual bool hasIntegratedCPP() const { return false; }
465 virtual void ConstructJob(Compilation &C, const JobAction &JA,
466 const InputInfo &Output,
467 const InputInfoList &Inputs,
468 const ArgList &TCArgs,
469 const char *LinkingOutput) const;
472 /// minix -- Directly call GNU Binutils assembler and linker
474 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
476 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
479 virtual bool hasIntegratedCPP() const { return false; }
481 virtual void ConstructJob(Compilation &C, const JobAction &JA,
482 const InputInfo &Output,
483 const InputInfoList &Inputs,
484 const ArgList &TCArgs,
485 const char *LinkingOutput) const;
487 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
489 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
491 virtual bool hasIntegratedCPP() const { return false; }
492 virtual bool isLinkJob() const { return true; }
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 } // end namespace minix
502 /// solaris -- Directly call Solaris assembler and linker
504 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
506 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
509 virtual bool hasIntegratedCPP() const { return false; }
511 virtual void ConstructJob(Compilation &C, const JobAction &JA,
512 const InputInfo &Output,
513 const InputInfoList &Inputs,
514 const ArgList &TCArgs,
515 const char *LinkingOutput) const;
517 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
519 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
521 virtual bool hasIntegratedCPP() const { return false; }
522 virtual bool isLinkJob() const { return true; }
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 } // end namespace solaris
532 /// auroraux -- Directly call GNU Binutils assembler and linker
534 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
536 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
539 virtual bool hasIntegratedCPP() const { return false; }
541 virtual void ConstructJob(Compilation &C, const JobAction &JA,
542 const InputInfo &Output,
543 const InputInfoList &Inputs,
544 const ArgList &TCArgs,
545 const char *LinkingOutput) const;
547 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
549 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
551 virtual bool hasIntegratedCPP() const { return false; }
552 virtual bool isLinkJob() const { return true; }
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 } // end namespace auroraux
562 /// dragonfly -- Directly call GNU Binutils assembler and linker
563 namespace dragonfly {
564 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
566 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
569 virtual bool hasIntegratedCPP() const { return false; }
571 virtual void ConstructJob(Compilation &C, const JobAction &JA,
572 const InputInfo &Output,
573 const InputInfoList &Inputs,
574 const ArgList &TCArgs,
575 const char *LinkingOutput) const;
577 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
579 Link(const ToolChain &TC) : Tool("dragonfly::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 dragonfly
592 /// Visual studio tools.
593 namespace visualstudio {
594 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
596 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
598 virtual bool hasIntegratedCPP() const { return false; }
599 virtual bool isLinkJob() const { return true; }
601 virtual void ConstructJob(Compilation &C, const JobAction &JA,
602 const InputInfo &Output,
603 const InputInfoList &Inputs,
604 const ArgList &TCArgs,
605 const char *LinkingOutput) const;
607 } // end namespace visualstudio
609 } // end namespace toolchains
610 } // end namespace driver
611 } // end namespace clang
613 #endif // CLANG_LIB_DRIVER_TOOLS_H_