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;
37 Clang(const ToolChain &TC) : Tool("clang", TC) {}
39 virtual bool acceptsPipedInput() const { return true; }
40 virtual bool canPipeOutput() const { return true; }
41 virtual bool hasIntegratedCPP() const { return true; }
43 virtual void ConstructJob(Compilation &C, const JobAction &JA,
45 const InputInfo &Output,
46 const InputInfoList &Inputs,
47 const ArgList &TCArgs,
48 const char *LinkingOutput) const;
51 /// gcc - Generic GCC tool implementations.
53 class VISIBILITY_HIDDEN Common : public Tool {
55 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
57 virtual void ConstructJob(Compilation &C, const JobAction &JA,
59 const InputInfo &Output,
60 const InputInfoList &Inputs,
61 const ArgList &TCArgs,
62 const char *LinkingOutput) const;
64 /// RenderExtraToolArgs - Render any arguments necessary to force
65 /// the particular tool mode.
66 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0;
70 class VISIBILITY_HIDDEN Preprocess : public Common {
72 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {}
74 virtual bool acceptsPipedInput() const { return true; }
75 virtual bool canPipeOutput() const { return true; }
76 virtual bool hasIntegratedCPP() const { return false; }
78 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
81 class VISIBILITY_HIDDEN Precompile : public Common {
83 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {}
85 virtual bool acceptsPipedInput() const { return true; }
86 virtual bool canPipeOutput() const { return false; }
87 virtual bool hasIntegratedCPP() const { return true; }
89 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
92 class VISIBILITY_HIDDEN Compile : public Common {
94 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {}
96 virtual bool acceptsPipedInput() const { return true; }
97 virtual bool canPipeOutput() const { return true; }
98 virtual bool hasIntegratedCPP() const { return true; }
100 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
103 class VISIBILITY_HIDDEN Assemble : public Common {
105 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {}
107 virtual bool acceptsPipedInput() const { return true; }
108 virtual bool canPipeOutput() const { return false; }
109 virtual bool hasIntegratedCPP() const { return false; }
111 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
114 class VISIBILITY_HIDDEN Link : public Common {
116 Link(const ToolChain &TC) : Common("gcc::Link", TC) {}
118 virtual bool acceptsPipedInput() const { return false; }
119 virtual bool canPipeOutput() const { return false; }
120 virtual bool hasIntegratedCPP() const { return false; }
122 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const;
124 } // end namespace gcc
127 class VISIBILITY_HIDDEN CC1 : public Tool {
129 static const char *getBaseInputName(const ArgList &Args,
130 const InputInfoList &Input);
131 static const char *getBaseInputStem(const ArgList &Args,
132 const InputInfoList &Input);
133 static const char *getDependencyFileName(const ArgList &Args,
134 const InputInfoList &Inputs);
137 const char *getCC1Name(types::ID Type) const;
139 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
140 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
141 const InputInfoList &Inputs,
142 const ArgStringList &OutputArgs) const;
143 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
144 const InputInfoList &Inputs,
145 const ArgStringList &OutputArgs) const;
146 void AddCPPUniqueOptionsArgs(const ArgList &Args,
147 ArgStringList &CmdArgs,
148 const InputInfoList &Inputs) const;
149 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
152 CC1(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}
154 virtual bool acceptsPipedInput() const { return true; }
155 virtual bool canPipeOutput() const { return true; }
156 virtual bool hasIntegratedCPP() const { return true; }
159 class VISIBILITY_HIDDEN Preprocess : public CC1 {
161 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {}
163 virtual void ConstructJob(Compilation &C, const JobAction &JA,
165 const InputInfo &Output,
166 const InputInfoList &Inputs,
167 const ArgList &TCArgs,
168 const char *LinkingOutput) const;
171 class VISIBILITY_HIDDEN Compile : public CC1 {
173 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {}
175 virtual void ConstructJob(Compilation &C, const JobAction &JA,
177 const InputInfo &Output,
178 const InputInfoList &Inputs,
179 const ArgList &TCArgs,
180 const char *LinkingOutput) const;
183 class VISIBILITY_HIDDEN Assemble : public Tool {
185 Assemble(const ToolChain &TC) : Tool("darwin::Assemble", TC) {}
187 virtual bool acceptsPipedInput() const { return true; }
188 virtual bool canPipeOutput() const { return false; }
189 virtual bool hasIntegratedCPP() const { return false; }
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 Link : public Tool {
200 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
201 void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const;
202 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
204 const toolchains::Darwin &getDarwinToolChain() const {
205 return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
209 Link(const ToolChain &TC)
210 : Tool("darwin::Link", TC) {
213 virtual bool acceptsPipedInput() const { return false; }
214 virtual bool canPipeOutput() const { return false; }
215 virtual bool hasIntegratedCPP() const { return false; }
217 virtual void ConstructJob(Compilation &C, const JobAction &JA,
219 const InputInfo &Output,
220 const InputInfoList &Inputs,
221 const ArgList &TCArgs,
222 const char *LinkingOutput) const;
225 class VISIBILITY_HIDDEN Lipo : public Tool {
227 Lipo(const ToolChain &TC) : Tool("darwin::Lipo", TC) {}
229 virtual bool acceptsPipedInput() const { return false; }
230 virtual bool canPipeOutput() const { return false; }
231 virtual bool hasIntegratedCPP() const { return false; }
233 virtual void ConstructJob(Compilation &C, const JobAction &JA,
235 const InputInfo &Output,
236 const InputInfoList &Inputs,
237 const ArgList &TCArgs,
238 const char *LinkingOutput) const;
242 /// openbsd -- Directly call GNU Binutils assembler and linker
244 class VISIBILITY_HIDDEN Assemble : public Tool {
246 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {}
248 virtual bool acceptsPipedInput() const { return true; }
249 virtual bool canPipeOutput() const { return true; }
250 virtual bool hasIntegratedCPP() const { return false; }
252 virtual void ConstructJob(Compilation &C, const JobAction &JA,
254 const InputInfo &Output,
255 const InputInfoList &Inputs,
256 const ArgList &TCArgs,
257 const char *LinkingOutput) const;
259 class VISIBILITY_HIDDEN Link : public Tool {
261 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {}
263 virtual bool acceptsPipedInput() const { return true; }
264 virtual bool canPipeOutput() const { return true; }
265 virtual bool hasIntegratedCPP() const { return false; }
267 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;
274 } // end namespace openbsd
276 /// freebsd -- Directly call GNU Binutils assembler and linker
278 class VISIBILITY_HIDDEN Assemble : public Tool {
280 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {}
282 virtual bool acceptsPipedInput() const { return true; }
283 virtual bool canPipeOutput() const { return true; }
284 virtual bool hasIntegratedCPP() const { return false; }
286 virtual void ConstructJob(Compilation &C, const JobAction &JA,
288 const InputInfo &Output,
289 const InputInfoList &Inputs,
290 const ArgList &TCArgs,
291 const char *LinkingOutput) const;
293 class VISIBILITY_HIDDEN Link : public Tool {
295 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {}
297 virtual bool acceptsPipedInput() const { return true; }
298 virtual bool canPipeOutput() const { return true; }
299 virtual bool hasIntegratedCPP() const { return false; }
301 virtual void ConstructJob(Compilation &C, const JobAction &JA,
303 const InputInfo &Output,
304 const InputInfoList &Inputs,
305 const ArgList &TCArgs,
306 const char *LinkingOutput) const;
308 } // end namespace freebsd
310 /// auroraux -- Directly call GNU Binutils assembler and linker
312 class VISIBILITY_HIDDEN Assemble : public Tool {
314 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {}
316 virtual bool acceptsPipedInput() const { return true; }
317 virtual bool canPipeOutput() const { return true; }
318 virtual bool hasIntegratedCPP() const { return false; }
320 virtual void ConstructJob(Compilation &C, const JobAction &JA,
322 const InputInfo &Output,
323 const InputInfoList &Inputs,
324 const ArgList &TCArgs,
325 const char *LinkingOutput) const;
327 class VISIBILITY_HIDDEN Link : public Tool {
329 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {}
331 virtual bool acceptsPipedInput() const { return true; }
332 virtual bool canPipeOutput() const { return true; }
333 virtual bool hasIntegratedCPP() const { return false; }
335 virtual void ConstructJob(Compilation &C, const JobAction &JA,
337 const InputInfo &Output,
338 const InputInfoList &Inputs,
339 const ArgList &TCArgs,
340 const char *LinkingOutput) const;
342 } // end namespace auroraux
344 /// dragonfly -- Directly call GNU Binutils assembler and linker
345 namespace dragonfly {
346 class VISIBILITY_HIDDEN Assemble : public Tool {
348 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {}
350 virtual bool acceptsPipedInput() const { return true; }
351 virtual bool canPipeOutput() const { return true; }
352 virtual bool hasIntegratedCPP() const { return false; }
354 virtual void ConstructJob(Compilation &C, const JobAction &JA,
356 const InputInfo &Output,
357 const InputInfoList &Inputs,
358 const ArgList &TCArgs,
359 const char *LinkingOutput) const;
361 class VISIBILITY_HIDDEN Link : public Tool {
363 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {}
365 virtual bool acceptsPipedInput() const { return true; }
366 virtual bool canPipeOutput() const { return true; }
367 virtual bool hasIntegratedCPP() const { return false; }
369 virtual void ConstructJob(Compilation &C, const JobAction &JA,
371 const InputInfo &Output,
372 const InputInfoList &Inputs,
373 const ArgList &TCArgs,
374 const char *LinkingOutput) const;
376 } // end namespace dragonfly
378 } // end namespace toolchains
379 } // end namespace driver
380 } // end namespace clang
382 #endif // CLANG_LIB_DRIVER_TOOLS_H_