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"
24 namespace toolchains {
30 /// \brief Clang compiler tool.
31 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
32 void AddPreprocessingOptions(Compilation &C,
35 ArgStringList &CmdArgs,
36 const InputInfo &Output,
37 const InputInfoList &Inputs) const;
39 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
40 bool KernelOrKext) const;
41 void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
42 void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
43 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
44 void AddHexagonTargetArgs (const ArgList &Args, ArgStringList &CmdArgs) const;
47 Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
49 virtual bool hasGoodDiagnostics() const { return true; }
50 virtual bool hasIntegratedAssembler() const { return true; }
51 virtual bool hasIntegratedCPP() const { return true; }
53 virtual void ConstructJob(Compilation &C, const JobAction &JA,
54 const InputInfo &Output,
55 const InputInfoList &Inputs,
56 const ArgList &TCArgs,
57 const char *LinkingOutput) const;
60 /// \brief Clang integrated assembler tool.
61 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
63 ClangAs(const ToolChain &TC) : Tool("clang::as",
64 "clang integrated assembler", TC) {}
66 virtual bool hasGoodDiagnostics() const { return true; }
67 virtual bool hasIntegratedAssembler() const { return false; }
68 virtual bool hasIntegratedCPP() const { return false; }
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 /// gcc - Generic GCC tool implementations.
79 class LLVM_LIBRARY_VISIBILITY Common : public Tool {
81 Common(const char *Name, const char *ShortName,
82 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
84 virtual void ConstructJob(Compilation &C, const JobAction &JA,
85 const InputInfo &Output,
86 const InputInfoList &Inputs,
87 const ArgList &TCArgs,
88 const char *LinkingOutput) const;
90 /// RenderExtraToolArgs - Render any arguments necessary to force
91 /// the particular tool mode.
92 virtual void RenderExtraToolArgs(const JobAction &JA,
93 ArgStringList &CmdArgs) const = 0;
97 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
99 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
100 "gcc preprocessor", TC) {}
102 virtual bool hasGoodDiagnostics() const { return true; }
103 virtual bool hasIntegratedCPP() const { return false; }
105 virtual void RenderExtraToolArgs(const JobAction &JA,
106 ArgStringList &CmdArgs) const;
109 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
111 Precompile(const ToolChain &TC) : Common("gcc::Precompile",
112 "gcc precompile", TC) {}
114 virtual bool hasGoodDiagnostics() const { return true; }
115 virtual bool hasIntegratedCPP() const { return true; }
117 virtual void RenderExtraToolArgs(const JobAction &JA,
118 ArgStringList &CmdArgs) const;
121 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
123 Compile(const ToolChain &TC) : Common("gcc::Compile",
124 "gcc frontend", TC) {}
126 virtual bool hasGoodDiagnostics() const { return true; }
127 virtual bool hasIntegratedCPP() const { return true; }
129 virtual void RenderExtraToolArgs(const JobAction &JA,
130 ArgStringList &CmdArgs) const;
133 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
135 Assemble(const ToolChain &TC) : Common("gcc::Assemble",
136 "assembler (via gcc)", TC) {}
138 virtual bool hasIntegratedCPP() const { return false; }
140 virtual void RenderExtraToolArgs(const JobAction &JA,
141 ArgStringList &CmdArgs) const;
144 class LLVM_LIBRARY_VISIBILITY Link : public Common {
146 Link(const ToolChain &TC) : Common("gcc::Link",
147 "linker (via gcc)", TC) {}
149 virtual bool hasIntegratedCPP() const { return false; }
151 virtual void RenderExtraToolArgs(const JobAction &JA,
152 ArgStringList &CmdArgs) const;
154 } // end namespace gcc
157 // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
158 // We simply use "clang -cc1" for those actions.
159 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
161 Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
164 virtual bool hasIntegratedCPP() const { return false; }
166 virtual void RenderExtraToolArgs(const JobAction &JA,
167 ArgStringList &CmdArgs) const;
168 virtual void ConstructJob(Compilation &C, const JobAction &JA,
169 const InputInfo &Output,
170 const InputInfoList &Inputs,
171 const ArgList &TCArgs,
172 const char *LinkingOutput) const;
175 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
177 Link(const ToolChain &TC) : Tool("hexagon::Link",
180 virtual bool hasIntegratedCPP() const { return false; }
182 virtual void RenderExtraToolArgs(const JobAction &JA,
183 ArgStringList &CmdArgs) const;
184 virtual void ConstructJob(Compilation &C, const JobAction &JA,
185 const InputInfo &Output,
186 const InputInfoList &Inputs,
187 const ArgList &TCArgs,
188 const char *LinkingOutput) const;
190 } // end namespace hexagon.
194 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
195 virtual void anchor();
197 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
199 const toolchains::Darwin &getDarwinToolChain() const {
200 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
204 DarwinTool(const char *Name, const char *ShortName,
205 const ToolChain &TC) : Tool(Name, ShortName, TC) {}
208 class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool {
209 virtual void anchor();
211 static const char *getBaseInputName(const ArgList &Args,
212 const InputInfoList &Input);
213 static const char *getBaseInputStem(const ArgList &Args,
214 const InputInfoList &Input);
215 static const char *getDependencyFileName(const ArgList &Args,
216 const InputInfoList &Inputs);
219 const char *getCC1Name(types::ID Type) const;
221 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
222 void RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const;
223 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
224 const InputInfoList &Inputs,
225 const ArgStringList &OutputArgs) const;
226 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
227 const InputInfoList &Inputs,
228 const ArgStringList &OutputArgs) const;
229 void AddCPPUniqueOptionsArgs(const ArgList &Args,
230 ArgStringList &CmdArgs,
231 const InputInfoList &Inputs) const;
232 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
235 CC1(const char *Name, const char *ShortName,
236 const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {}
238 virtual bool hasGoodDiagnostics() const { return true; }
239 virtual bool hasIntegratedCPP() const { return true; }
242 class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1 {
244 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess",
245 "gcc preprocessor", TC) {}
247 virtual void ConstructJob(Compilation &C, const JobAction &JA,
248 const InputInfo &Output,
249 const InputInfoList &Inputs,
250 const ArgList &TCArgs,
251 const char *LinkingOutput) const;
254 class LLVM_LIBRARY_VISIBILITY Compile : public CC1 {
256 Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {}
258 virtual void ConstructJob(Compilation &C, const JobAction &JA,
259 const InputInfo &Output,
260 const InputInfoList &Inputs,
261 const ArgList &TCArgs,
262 const char *LinkingOutput) const;
265 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
267 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
270 virtual bool hasIntegratedCPP() const { return false; }
272 virtual void ConstructJob(Compilation &C, const JobAction &JA,
273 const InputInfo &Output,
274 const InputInfoList &Inputs,
275 const ArgList &TCArgs,
276 const char *LinkingOutput) const;
279 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
280 void AddLinkArgs(Compilation &C, const ArgList &Args,
281 ArgStringList &CmdArgs) const;
284 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
286 virtual bool hasIntegratedCPP() const { return false; }
288 virtual void ConstructJob(Compilation &C, const JobAction &JA,
289 const InputInfo &Output,
290 const InputInfoList &Inputs,
291 const ArgList &TCArgs,
292 const char *LinkingOutput) const;
295 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool {
297 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
299 virtual bool hasIntegratedCPP() const { return false; }
301 virtual void ConstructJob(Compilation &C, const JobAction &JA,
302 const InputInfo &Output,
303 const InputInfoList &Inputs,
304 const ArgList &TCArgs,
305 const char *LinkingOutput) const;
308 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool {
310 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
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;
322 class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool {
324 VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
327 virtual bool hasIntegratedCPP() const { return false; }
329 virtual void ConstructJob(Compilation &C, const JobAction &JA,
330 const InputInfo &Output,
331 const InputInfoList &Inputs,
332 const ArgList &TCArgs,
333 const char *LinkingOutput) const;
338 /// openbsd -- Directly call GNU Binutils assembler and linker
340 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
342 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
345 virtual bool hasIntegratedCPP() const { return false; }
347 virtual void ConstructJob(Compilation &C, const JobAction &JA,
348 const InputInfo &Output,
349 const InputInfoList &Inputs,
350 const ArgList &TCArgs,
351 const char *LinkingOutput) const;
353 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
355 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
357 virtual bool hasIntegratedCPP() const { return false; }
359 virtual void ConstructJob(Compilation &C, const JobAction &JA,
360 const InputInfo &Output,
361 const InputInfoList &Inputs,
362 const ArgList &TCArgs,
363 const char *LinkingOutput) const;
365 } // end namespace openbsd
367 /// freebsd -- Directly call GNU Binutils assembler and linker
369 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
371 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
374 virtual bool hasIntegratedCPP() const { return false; }
376 virtual void ConstructJob(Compilation &C, const JobAction &JA,
377 const InputInfo &Output,
378 const InputInfoList &Inputs,
379 const ArgList &TCArgs,
380 const char *LinkingOutput) const;
382 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
384 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
386 virtual bool hasIntegratedCPP() const { return false; }
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; }
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; }
449 virtual void ConstructJob(Compilation &C, const JobAction &JA,
450 const InputInfo &Output,
451 const InputInfoList &Inputs,
452 const ArgList &TCArgs,
453 const char *LinkingOutput) const;
456 /// minix -- Directly call GNU Binutils assembler and linker
458 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
460 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
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;
471 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
473 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
475 virtual bool hasIntegratedCPP() const { return false; }
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 /// auroraux -- Directly call GNU Binutils assembler and linker
487 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
489 Assemble(const ToolChain &TC) : Tool("auroraux::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("auroraux::Link", "linker", TC) {}
504 virtual bool hasIntegratedCPP() const { return false; }
506 virtual void ConstructJob(Compilation &C, const JobAction &JA,
507 const InputInfo &Output,
508 const InputInfoList &Inputs,
509 const ArgList &TCArgs,
510 const char *LinkingOutput) const;
512 } // end namespace auroraux
514 /// dragonfly -- Directly call GNU Binutils assembler and linker
515 namespace dragonfly {
516 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
518 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
521 virtual bool hasIntegratedCPP() const { return false; }
523 virtual void ConstructJob(Compilation &C, const JobAction &JA,
524 const InputInfo &Output,
525 const InputInfoList &Inputs,
526 const ArgList &TCArgs,
527 const char *LinkingOutput) const;
529 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
531 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
533 virtual bool hasIntegratedCPP() const { return false; }
535 virtual void ConstructJob(Compilation &C, const JobAction &JA,
536 const InputInfo &Output,
537 const InputInfoList &Inputs,
538 const ArgList &TCArgs,
539 const char *LinkingOutput) const;
541 } // end namespace dragonfly
543 /// Visual studio tools.
544 namespace visualstudio {
545 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
547 Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
549 virtual bool hasIntegratedCPP() const { return false; }
551 virtual void ConstructJob(Compilation &C, const JobAction &JA,
552 const InputInfo &Output,
553 const InputInfoList &Inputs,
554 const ArgList &TCArgs,
555 const char *LinkingOutput) const;
557 } // end namespace visualstudio
559 } // end namespace toolchains
560 } // end namespace driver
561 } // end namespace clang
563 #endif // CLANG_LIB_DRIVER_TOOLS_H_