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/Support/Compiler.h"
23 namespace toolchains {
29 /// \brief Clang compiler tool.
30 class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
31 void AddPreprocessingOptions(const Driver &D,
33 ArgStringList &CmdArgs,
34 const InputInfo &Output,
35 const InputInfoList &Inputs) const;
37 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
38 void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
39 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
42 Clang(const ToolChain &TC) : Tool("clang", TC) {}
44 virtual bool acceptsPipedInput() const { return true; }
45 virtual bool canPipeOutput() const { return true; }
46 virtual bool hasGoodDiagnostics() const { return true; }
47 virtual bool hasIntegratedAssembler() const { return true; }
48 virtual bool hasIntegratedCPP() const { return true; }
50 virtual void ConstructJob(Compilation &C, const JobAction &JA,
52 const InputInfo &Output,
53 const InputInfoList &Inputs,
54 const ArgList &TCArgs,
55 const char *LinkingOutput) const;
58 /// \brief Clang integrated assembler tool.
59 class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
61 ClangAs(const ToolChain &TC) : Tool("clang::as", TC) {}
63 virtual bool acceptsPipedInput() const { return true; }
64 virtual bool canPipeOutput() const { return true; }
65 virtual bool hasGoodDiagnostics() const { return true; }
66 virtual bool hasIntegratedAssembler() const { return false; }
67 virtual bool hasIntegratedCPP() const { return false; }
69 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 ToolChain &TC) : Tool(Name, TC) {}
83 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", TC) {}
101 virtual bool acceptsPipedInput() const { return true; }
102 virtual bool canPipeOutput() const { return true; }
103 virtual bool hasGoodDiagnostics() const { return true; }
104 virtual bool hasIntegratedCPP() const { return false; }
106 virtual void RenderExtraToolArgs(const JobAction &JA,
107 ArgStringList &CmdArgs) const;
110 class LLVM_LIBRARY_VISIBILITY Precompile : public Common {
112 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
114 virtual bool acceptsPipedInput() const { return true; }
115 virtual bool canPipeOutput() const { return false; }
116 virtual bool hasGoodDiagnostics() const { return true; }
117 virtual bool hasIntegratedCPP() const { return true; }
119 virtual void RenderExtraToolArgs(const JobAction &JA,
120 ArgStringList &CmdArgs) const;
123 class LLVM_LIBRARY_VISIBILITY Compile : public Common {
125 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
127 virtual bool acceptsPipedInput() const { return true; }
128 virtual bool canPipeOutput() const { return true; }
129 virtual bool hasGoodDiagnostics() const { return true; }
130 virtual bool hasIntegratedCPP() const { return true; }
132 virtual void RenderExtraToolArgs(const JobAction &JA,
133 ArgStringList &CmdArgs) const;
136 class LLVM_LIBRARY_VISIBILITY Assemble : public Common {
138 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
140 virtual bool acceptsPipedInput() const { return true; }
141 virtual bool canPipeOutput() const { return false; }
142 virtual bool hasIntegratedCPP() const { return false; }
144 virtual void RenderExtraToolArgs(const JobAction &JA,
145 ArgStringList &CmdArgs) const;
148 class LLVM_LIBRARY_VISIBILITY Link : public Common {
150 Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
152 virtual bool acceptsPipedInput() const { return false; }
153 virtual bool canPipeOutput() const { return false; }
154 virtual bool hasIntegratedCPP() const { return false; }
156 virtual void RenderExtraToolArgs(const JobAction &JA,
157 ArgStringList &CmdArgs) const;
159 } // end namespace gcc
162 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
164 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
166 const toolchains::Darwin &getDarwinToolChain() const {
167 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
171 DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
174 class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool {
176 static const char *getBaseInputName(const ArgList &Args,
177 const InputInfoList &Input);
178 static const char *getBaseInputStem(const ArgList &Args,
179 const InputInfoList &Input);
180 static const char *getDependencyFileName(const ArgList &Args,
181 const InputInfoList &Inputs);
184 const char *getCC1Name(types::ID Type) const;
186 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
187 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
188 const InputInfoList &Inputs,
189 const ArgStringList &OutputArgs) const;
190 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
191 const InputInfoList &Inputs,
192 const ArgStringList &OutputArgs) const;
193 void AddCPPUniqueOptionsArgs(const ArgList &Args,
194 ArgStringList &CmdArgs,
195 const InputInfoList &Inputs) const;
196 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
199 CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
201 virtual bool acceptsPipedInput() const { return true; }
202 virtual bool canPipeOutput() const { return true; }
203 virtual bool hasGoodDiagnostics() const { return true; }
204 virtual bool hasIntegratedCPP() const { return true; }
207 class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1 {
209 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
211 virtual void ConstructJob(Compilation &C, const JobAction &JA,
213 const InputInfo &Output,
214 const InputInfoList &Inputs,
215 const ArgList &TCArgs,
216 const char *LinkingOutput) const;
219 class LLVM_LIBRARY_VISIBILITY Compile : public CC1 {
221 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
223 virtual void ConstructJob(Compilation &C, const JobAction &JA,
225 const InputInfo &Output,
226 const InputInfoList &Inputs,
227 const ArgList &TCArgs,
228 const char *LinkingOutput) const;
231 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool {
233 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
235 virtual bool acceptsPipedInput() const { return true; }
236 virtual bool canPipeOutput() const { return false; }
237 virtual bool hasIntegratedCPP() const { return false; }
239 virtual void ConstructJob(Compilation &C, const JobAction &JA,
241 const InputInfo &Output,
242 const InputInfoList &Inputs,
243 const ArgList &TCArgs,
244 const char *LinkingOutput) const;
247 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool {
248 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
251 Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
253 virtual bool acceptsPipedInput() const { return false; }
254 virtual bool canPipeOutput() const { return false; }
255 virtual bool hasIntegratedCPP() const { return false; }
257 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 Lipo : public DarwinTool {
267 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
269 virtual bool acceptsPipedInput() const { return false; }
270 virtual bool canPipeOutput() const { return false; }
271 virtual bool hasIntegratedCPP() const { return false; }
273 virtual void ConstructJob(Compilation &C, const JobAction &JA,
275 const InputInfo &Output,
276 const InputInfoList &Inputs,
277 const ArgList &TCArgs,
278 const char *LinkingOutput) const;
282 /// openbsd -- Directly call GNU Binutils assembler and linker
284 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
286 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
288 virtual bool acceptsPipedInput() const { return true; }
289 virtual bool canPipeOutput() const { return true; }
290 virtual bool hasIntegratedCPP() const { return false; }
292 virtual void ConstructJob(Compilation &C, const JobAction &JA,
294 const InputInfo &Output,
295 const InputInfoList &Inputs,
296 const ArgList &TCArgs,
297 const char *LinkingOutput) const;
299 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
301 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
303 virtual bool acceptsPipedInput() const { return true; }
304 virtual bool canPipeOutput() const { return true; }
305 virtual bool hasIntegratedCPP() const { return false; }
307 virtual void ConstructJob(Compilation &C, const JobAction &JA,
309 const InputInfo &Output,
310 const InputInfoList &Inputs,
311 const ArgList &TCArgs,
312 const char *LinkingOutput) const;
314 } // end namespace openbsd
316 /// freebsd -- Directly call GNU Binutils assembler and linker
318 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
320 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
322 virtual bool acceptsPipedInput() const { return true; }
323 virtual bool canPipeOutput() const { return true; }
324 virtual bool hasIntegratedCPP() const { return false; }
326 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 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
335 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
337 virtual bool acceptsPipedInput() const { return true; }
338 virtual bool canPipeOutput() const { return true; }
339 virtual bool hasIntegratedCPP() const { return false; }
341 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 } // end namespace freebsd
350 /// auroraux -- Directly call GNU Binutils assembler and linker
352 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
354 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
356 virtual bool acceptsPipedInput() const { return true; }
357 virtual bool canPipeOutput() const { return true; }
358 virtual bool hasIntegratedCPP() const { return false; }
360 virtual void ConstructJob(Compilation &C, const JobAction &JA,
362 const InputInfo &Output,
363 const InputInfoList &Inputs,
364 const ArgList &TCArgs,
365 const char *LinkingOutput) const;
367 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
369 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
371 virtual bool acceptsPipedInput() const { return true; }
372 virtual bool canPipeOutput() const { return true; }
373 virtual bool hasIntegratedCPP() const { return false; }
375 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 } // end namespace auroraux
384 /// dragonfly -- Directly call GNU Binutils assembler and linker
385 namespace dragonfly {
386 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
388 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
390 virtual bool acceptsPipedInput() const { return true; }
391 virtual bool canPipeOutput() const { return true; }
392 virtual bool hasIntegratedCPP() const { return false; }
394 virtual void ConstructJob(Compilation &C, const JobAction &JA,
396 const InputInfo &Output,
397 const InputInfoList &Inputs,
398 const ArgList &TCArgs,
399 const char *LinkingOutput) const;
401 class LLVM_LIBRARY_VISIBILITY Link : public Tool {
403 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
405 virtual bool acceptsPipedInput() const { return true; }
406 virtual bool canPipeOutput() const { return true; }
407 virtual bool hasIntegratedCPP() const { return false; }
409 virtual void ConstructJob(Compilation &C, const JobAction &JA,
411 const InputInfo &Output,
412 const InputInfoList &Inputs,
413 const ArgList &TCArgs,
414 const char *LinkingOutput) const;
416 } // end namespace dragonfly
418 } // end namespace toolchains
419 } // end namespace driver
420 } // end namespace clang
422 #endif // CLANG_LIB_DRIVER_TOOLS_H_