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; }
282 virtual void ConstructJob(Compilation &C, const JobAction &JA,
283 const InputInfo &Output,
284 const InputInfoList &Inputs,
285 const ArgList &TCArgs,
286 const char *LinkingOutput) const;
289 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
291 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
294 virtual bool hasIntegratedCPP() const { return false; }
296 virtual void ConstructJob(Compilation &C, const JobAction &JA,
297 const InputInfo &Output,
298 const InputInfoList &Inputs,
299 const ArgList &TCArgs,
300 const char *LinkingOutput) const;
305 /// openbsd -- Directly call GNU Binutils assembler and linker
307 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
309 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
312 virtual bool hasIntegratedCPP() const { return false; }
314 virtual void ConstructJob(Compilation &C, const JobAction &JA,
315 const InputInfo &Output,
316 const InputInfoList &Inputs,
317 const ArgList &TCArgs,
318 const char *LinkingOutput) const;
320 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
322 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
324 virtual bool hasIntegratedCPP() const { return false; }
325 virtual bool isLinkJob() const { return true; }
327 virtual void ConstructJob(Compilation &C, const JobAction &JA,
328 const InputInfo &Output,
329 const InputInfoList &Inputs,
330 const ArgList &TCArgs,
331 const char *LinkingOutput) const;
333 } // end namespace openbsd
335 /// bitrig -- Directly call GNU Binutils assembler and linker
337 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
339 Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
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;
350 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
352 Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
354 virtual bool hasIntegratedCPP() const { return false; }
355 virtual bool isLinkJob() const { return true; }
357 virtual void ConstructJob(Compilation &C, const JobAction &JA,
358 const InputInfo &Output,
359 const InputInfoList &Inputs,
360 const ArgList &TCArgs,
361 const char *LinkingOutput) const;
363 } // end namespace bitrig
365 /// freebsd -- Directly call GNU Binutils assembler and linker
367 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
369 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
372 virtual bool hasIntegratedCPP() const { return false; }
374 virtual void ConstructJob(Compilation &C, const JobAction &JA,
375 const InputInfo &Output,
376 const InputInfoList &Inputs,
377 const ArgList &TCArgs,
378 const char *LinkingOutput) const;
380 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
382 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
384 virtual bool hasIntegratedCPP() const { return false; }
385 virtual bool isLinkJob() const { return true; }
387 virtual void ConstructJob(Compilation &C, const JobAction &JA,
388 const InputInfo &Output,
389 const InputInfoList &Inputs,
390 const ArgList &TCArgs,
391 const char *LinkingOutput) const;
393 } // end namespace freebsd
395 /// netbsd -- Directly call GNU Binutils assembler and linker
397 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
400 Assemble(const ToolChain &TC)
401 : Tool("netbsd::Assemble", "assembler", TC) {}
403 virtual bool hasIntegratedCPP() const { return false; }
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 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
414 Link(const ToolChain &TC)
415 : Tool("netbsd::Link", "linker", TC) {}
417 virtual bool hasIntegratedCPP() const { return false; }
418 virtual bool isLinkJob() const { return true; }
420 virtual void ConstructJob(Compilation &C, const JobAction &JA,
421 const InputInfo &Output,
422 const InputInfoList &Inputs,
423 const ArgList &TCArgs,
424 const char *LinkingOutput) const;
426 } // end namespace netbsd
428 /// linux -- Directly call GNU Binutils assembler and linker
429 namespace linuxtools {
430 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
432 Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
435 virtual bool hasIntegratedCPP() const { return false; }
437 virtual void ConstructJob(Compilation &C, const JobAction &JA,
438 const InputInfo &Output,
439 const InputInfoList &Inputs,
440 const ArgList &TCArgs,
441 const char *LinkingOutput) const;
443 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
445 Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {}
447 virtual bool hasIntegratedCPP() const { return false; }
448 virtual bool isLinkJob() const { return true; }
450 virtual void ConstructJob(Compilation &C, const JobAction &JA,
451 const InputInfo &Output,
452 const InputInfoList &Inputs,
453 const ArgList &TCArgs,
454 const char *LinkingOutput) const;
457 /// minix -- Directly call GNU Binutils assembler and linker
459 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
461 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
464 virtual bool hasIntegratedCPP() const { return false; }
466 virtual void ConstructJob(Compilation &C, const JobAction &JA,
467 const InputInfo &Output,
468 const InputInfoList &Inputs,
469 const ArgList &TCArgs,
470 const char *LinkingOutput) const;
472 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
474 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
476 virtual bool hasIntegratedCPP() const { return false; }
477 virtual bool isLinkJob() const { return true; }
479 virtual void ConstructJob(Compilation &C, const JobAction &JA,
480 const InputInfo &Output,
481 const InputInfoList &Inputs,
482 const ArgList &TCArgs,
483 const char *LinkingOutput) const;
485 } // end namespace minix
487 /// solaris -- Directly call Solaris assembler and linker
489 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
491 Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
494 virtual bool hasIntegratedCPP() const { return false; }
496 virtual void ConstructJob(Compilation &C, const JobAction &JA,
497 const InputInfo &Output,
498 const InputInfoList &Inputs,
499 const ArgList &TCArgs,
500 const char *LinkingOutput) const;
502 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
504 Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
506 virtual bool hasIntegratedCPP() const { return false; }
507 virtual bool isLinkJob() const { return true; }
509 virtual void ConstructJob(Compilation &C, const JobAction &JA,
510 const InputInfo &Output,
511 const InputInfoList &Inputs,
512 const ArgList &TCArgs,
513 const char *LinkingOutput) const;
515 } // end namespace solaris
517 /// auroraux -- Directly call GNU Binutils assembler and linker
519 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
521 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
524 virtual bool hasIntegratedCPP() const { return false; }
526 virtual void ConstructJob(Compilation &C, const JobAction &JA,
527 const InputInfo &Output,
528 const InputInfoList &Inputs,
529 const ArgList &TCArgs,
530 const char *LinkingOutput) const;
532 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
534 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
536 virtual bool hasIntegratedCPP() const { return false; }
537 virtual bool isLinkJob() const { return true; }
539 virtual void ConstructJob(Compilation &C, const JobAction &JA,
540 const InputInfo &Output,
541 const InputInfoList &Inputs,
542 const ArgList &TCArgs,
543 const char *LinkingOutput) const;
545 } // end namespace auroraux
547 /// dragonfly -- Directly call GNU Binutils assembler and linker
548 namespace dragonfly {
549 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
551 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
554 virtual bool hasIntegratedCPP() const { return false; }
556 virtual void ConstructJob(Compilation &C, const JobAction &JA,
557 const InputInfo &Output,
558 const InputInfoList &Inputs,
559 const ArgList &TCArgs,
560 const char *LinkingOutput) const;
562 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
564 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
566 virtual bool hasIntegratedCPP() const { return false; }
567 virtual bool isLinkJob() const { return true; }
569 virtual void ConstructJob(Compilation &C, const JobAction &JA,
570 const InputInfo &Output,
571 const InputInfoList &Inputs,
572 const ArgList &TCArgs,
573 const char *LinkingOutput) const;
575 } // end namespace dragonfly
577 /// Visual studio tools.
578 namespace visualstudio {
579 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
581 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
583 virtual bool hasIntegratedCPP() const { return false; }
584 virtual bool isLinkJob() const { return true; }
586 virtual void ConstructJob(Compilation &C, const JobAction &JA,
587 const InputInfo &Output,
588 const InputInfoList &Inputs,
589 const ArgList &TCArgs,
590 const char *LinkingOutput) const;
592 } // end namespace visualstudio
594 } // end namespace toolchains
595 } // end namespace driver
596 } // end namespace clang
598 #endif // CLANG_LIB_DRIVER_TOOLS_H_