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 class VISIBILITY_HIDDEN Clang : public Tool {
30 void AddPreprocessingOptions(const Driver &D,
32 ArgStringList &CmdArgs,
33 const InputInfo &Output,
34 const InputInfoList &Inputs) const;
36 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
37 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
40 Clang(const ToolChain &TC) : Tool("clang", TC) {}
42 virtual bool acceptsPipedInput() const { return true; }
43 virtual bool canPipeOutput() const { return true; }
44 virtual bool hasIntegratedCPP() const { return true; }
46 virtual void ConstructJob(Compilation &C, const JobAction &JA,
48 const InputInfo &Output,
49 const InputInfoList &Inputs,
50 const ArgList &TCArgs,
51 const char *LinkingOutput) const;
54 /// gcc - Generic GCC tool implementations.
56 class VISIBILITY_HIDDEN Common : public Tool {
58 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
60 virtual void ConstructJob(Compilation &C, const JobAction &JA,
62 const InputInfo &Output,
63 const InputInfoList &Inputs,
64 const ArgList &TCArgs,
65 const char *LinkingOutput) const;
67 /// RenderExtraToolArgs - Render any arguments necessary to force
68 /// the particular tool mode.
69 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
73 class VISIBILITY_HIDDEN Preprocess : public Common {
75 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
77 virtual bool acceptsPipedInput() const { return true; }
78 virtual bool canPipeOutput() const { return true; }
79 virtual bool hasIntegratedCPP() const { return false; }
81 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
84 class VISIBILITY_HIDDEN Precompile : public Common {
86 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
88 virtual bool acceptsPipedInput() const { return true; }
89 virtual bool canPipeOutput() const { return false; }
90 virtual bool hasIntegratedCPP() const { return true; }
92 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
95 class VISIBILITY_HIDDEN Compile : public Common {
97 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
99 virtual bool acceptsPipedInput() const { return true; }
100 virtual bool canPipeOutput() const { return true; }
101 virtual bool hasIntegratedCPP() const { return true; }
103 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
106 class VISIBILITY_HIDDEN Assemble : public Common {
108 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
110 virtual bool acceptsPipedInput() const { return true; }
111 virtual bool canPipeOutput() const { return false; }
112 virtual bool hasIntegratedCPP() const { return false; }
114 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
117 class VISIBILITY_HIDDEN Link : public Common {
119 Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
121 virtual bool acceptsPipedInput() const { return false; }
122 virtual bool canPipeOutput() const { return false; }
123 virtual bool hasIntegratedCPP() const { return false; }
125 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
127 } // end namespace gcc
130 class VISIBILITY_HIDDEN DarwinTool : public Tool {
132 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
133 void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const;
135 const toolchains::Darwin &getDarwinToolChain() const {
136 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
140 DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {};
143 class VISIBILITY_HIDDEN CC1 : public DarwinTool {
145 static const char *getBaseInputName(const ArgList &Args,
146 const InputInfoList &Input);
147 static const char *getBaseInputStem(const ArgList &Args,
148 const InputInfoList &Input);
149 static const char *getDependencyFileName(const ArgList &Args,
150 const InputInfoList &Inputs);
153 const char *getCC1Name(types::ID Type) const;
155 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
156 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
157 const InputInfoList &Inputs,
158 const ArgStringList &OutputArgs) const;
159 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
160 const InputInfoList &Inputs,
161 const ArgStringList &OutputArgs) const;
162 void AddCPPUniqueOptionsArgs(const ArgList &Args,
163 ArgStringList &CmdArgs,
164 const InputInfoList &Inputs) const;
165 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
168 CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {}
170 virtual bool acceptsPipedInput() const { return true; }
171 virtual bool canPipeOutput() const { return true; }
172 virtual bool hasIntegratedCPP() const { return true; }
175 class VISIBILITY_HIDDEN Preprocess : public CC1 {
177 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
179 virtual void ConstructJob(Compilation &C, const JobAction &JA,
181 const InputInfo &Output,
182 const InputInfoList &Inputs,
183 const ArgList &TCArgs,
184 const char *LinkingOutput) const;
187 class VISIBILITY_HIDDEN Compile : public CC1 {
189 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
191 virtual void ConstructJob(Compilation &C, const JobAction &JA,
193 const InputInfo &Output,
194 const InputInfoList &Inputs,
195 const ArgList &TCArgs,
196 const char *LinkingOutput) const;
199 class VISIBILITY_HIDDEN Assemble : public DarwinTool {
201 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {}
203 virtual bool acceptsPipedInput() const { return true; }
204 virtual bool canPipeOutput() const { return false; }
205 virtual bool hasIntegratedCPP() const { return false; }
207 virtual void ConstructJob(Compilation &C, const JobAction &JA,
209 const InputInfo &Output,
210 const InputInfoList &Inputs,
211 const ArgList &TCArgs,
212 const char *LinkingOutput) const;
215 class VISIBILITY_HIDDEN Link : public DarwinTool {
216 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
219 Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {}
221 virtual bool acceptsPipedInput() const { return false; }
222 virtual bool canPipeOutput() const { return false; }
223 virtual bool hasIntegratedCPP() const { return false; }
225 virtual void ConstructJob(Compilation &C, const JobAction &JA,
227 const InputInfo &Output,
228 const InputInfoList &Inputs,
229 const ArgList &TCArgs,
230 const char *LinkingOutput) const;
233 class VISIBILITY_HIDDEN Lipo : public DarwinTool {
235 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {}
237 virtual bool acceptsPipedInput() const { return false; }
238 virtual bool canPipeOutput() const { return false; }
239 virtual bool hasIntegratedCPP() const { return false; }
241 virtual void ConstructJob(Compilation &C, const JobAction &JA,
243 const InputInfo &Output,
244 const InputInfoList &Inputs,
245 const ArgList &TCArgs,
246 const char *LinkingOutput) const;
250 /// openbsd -- Directly call GNU Binutils assembler and linker
252 class VISIBILITY_HIDDEN Assemble : public Tool {
254 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
256 virtual bool acceptsPipedInput() const { return true; }
257 virtual bool canPipeOutput() const { return true; }
258 virtual bool hasIntegratedCPP() const { return false; }
260 virtual void ConstructJob(Compilation &C, const JobAction &JA,
262 const InputInfo &Output,
263 const InputInfoList &Inputs,
264 const ArgList &TCArgs,
265 const char *LinkingOutput) const;
267 class VISIBILITY_HIDDEN Link : public Tool {
269 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
271 virtual bool acceptsPipedInput() const { return true; }
272 virtual bool canPipeOutput() const { return true; }
273 virtual bool hasIntegratedCPP() const { return false; }
275 virtual void ConstructJob(Compilation &C, const JobAction &JA,
277 const InputInfo &Output,
278 const InputInfoList &Inputs,
279 const ArgList &TCArgs,
280 const char *LinkingOutput) const;
282 } // end namespace openbsd
284 /// freebsd -- Directly call GNU Binutils assembler and linker
286 class VISIBILITY_HIDDEN Assemble : public Tool {
288 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
290 virtual bool acceptsPipedInput() const { return true; }
291 virtual bool canPipeOutput() const { return true; }
292 virtual bool hasIntegratedCPP() const { return false; }
294 virtual void ConstructJob(Compilation &C, const JobAction &JA,
296 const InputInfo &Output,
297 const InputInfoList &Inputs,
298 const ArgList &TCArgs,
299 const char *LinkingOutput) const;
301 class VISIBILITY_HIDDEN Link : public Tool {
303 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
305 virtual bool acceptsPipedInput() const { return true; }
306 virtual bool canPipeOutput() const { return true; }
307 virtual bool hasIntegratedCPP() const { return false; }
309 virtual void ConstructJob(Compilation &C, const JobAction &JA,
311 const InputInfo &Output,
312 const InputInfoList &Inputs,
313 const ArgList &TCArgs,
314 const char *LinkingOutput) const;
316 } // end namespace freebsd
318 /// auroraux -- Directly call GNU Binutils assembler and linker
320 class VISIBILITY_HIDDEN Assemble : public Tool {
322 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
324 virtual bool acceptsPipedInput() const { return true; }
325 virtual bool canPipeOutput() const { return true; }
326 virtual bool hasIntegratedCPP() const { return false; }
328 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;
335 class VISIBILITY_HIDDEN Link : public Tool {
337 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
339 virtual bool acceptsPipedInput() const { return true; }
340 virtual bool canPipeOutput() const { return true; }
341 virtual bool hasIntegratedCPP() const { return false; }
343 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 } // end namespace auroraux
352 /// dragonfly -- Directly call GNU Binutils assembler and linker
353 namespace dragonfly {
354 class VISIBILITY_HIDDEN Assemble : public Tool {
356 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
358 virtual bool acceptsPipedInput() const { return true; }
359 virtual bool canPipeOutput() const { return true; }
360 virtual bool hasIntegratedCPP() const { return false; }
362 virtual void ConstructJob(Compilation &C, const JobAction &JA,
364 const InputInfo &Output,
365 const InputInfoList &Inputs,
366 const ArgList &TCArgs,
367 const char *LinkingOutput) const;
369 class VISIBILITY_HIDDEN Link : public Tool {
371 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
373 virtual bool acceptsPipedInput() const { return true; }
374 virtual bool canPipeOutput() const { return true; }
375 virtual bool hasIntegratedCPP() const { return false; }
377 virtual void ConstructJob(Compilation &C, const JobAction &JA,
379 const InputInfo &Output,
380 const InputInfoList &Inputs,
381 const ArgList &TCArgs,
382 const char *LinkingOutput) const;
384 } // end namespace dragonfly
386 } // end namespace toolchains
387 } // end namespace driver
388 } // end namespace clang
390 #endif // CLANG_LIB_DRIVER_TOOLS_H_