1193326Sed//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
2193326Sed//
3193326Sed//                     The LLVM Compiler Infrastructure
4193326Sed//
5193326Sed// This file is distributed under the University of Illinois Open Source
6193326Sed// License. See LICENSE.TXT for details.
7193326Sed//
8193326Sed//===----------------------------------------------------------------------===//
9193326Sed
10193326Sed#ifndef CLANG_LIB_DRIVER_TOOLS_H_
11193326Sed#define CLANG_LIB_DRIVER_TOOLS_H_
12193326Sed
13193326Sed#include "clang/Driver/Tool.h"
14193326Sed#include "clang/Driver/Types.h"
15193326Sed#include "clang/Driver/Util.h"
16223017Sdim#include "llvm/ADT/Triple.h"
17263509Sdim#include "llvm/Option/Option.h"
18193326Sed#include "llvm/Support/Compiler.h"
19193326Sed
20193326Sednamespace clang {
21245431Sdim  class ObjCRuntime;
22245431Sdim
23193326Sednamespace driver {
24263509Sdim  class Command;
25193326Sed  class Driver;
26193326Sed
27193326Sednamespace toolchains {
28198092Srdivacky  class Darwin;
29193326Sed}
30193326Sed
31193326Sednamespace tools {
32263509Sdimusing llvm::opt::ArgStringList;
33193326Sed
34208600Srdivacky  /// \brief Clang compiler tool.
35208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
36252723Sdim  public:
37263509Sdim    static const char *getBaseInputName(const llvm::opt::ArgList &Args,
38252723Sdim                                        const InputInfoList &Inputs);
39263509Sdim    static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
40252723Sdim                                        const InputInfoList &Inputs);
41263509Sdim    static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
42252723Sdim                                             const InputInfoList &Inputs);
43252723Sdim
44252723Sdim  private:
45263509Sdim    void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
46235633Sdim                                 const Driver &D,
47263509Sdim                                 const llvm::opt::ArgList &Args,
48263509Sdim                                 llvm::opt::ArgStringList &CmdArgs,
49193326Sed                                 const InputInfo &Output,
50193326Sed                                 const InputInfoList &Inputs) const;
51193326Sed
52263509Sdim    void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
53263509Sdim                              llvm::opt::ArgStringList &CmdArgs) const;
54263509Sdim    void AddARMTargetArgs(const llvm::opt::ArgList &Args,
55263509Sdim                          llvm::opt::ArgStringList &CmdArgs,
56221345Sdim                          bool KernelOrKext) const;
57263509Sdim    void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
58263509Sdim                           llvm::opt::ArgStringList &CmdArgs) const;
59263509Sdim    void AddR600TargetArgs(const llvm::opt::ArgList &Args,
60263509Sdim                           llvm::opt::ArgStringList &CmdArgs) const;
61263509Sdim    void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
62263509Sdim                            llvm::opt::ArgStringList &CmdArgs) const;
63263509Sdim    void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
64263509Sdim                              llvm::opt::ArgStringList &CmdArgs) const;
65263509Sdim    void AddX86TargetArgs(const llvm::opt::ArgList &Args,
66263509Sdim                          llvm::opt::ArgStringList &CmdArgs) const;
67263509Sdim    void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
68263509Sdim                              llvm::opt::ArgStringList &CmdArgs) const;
69198092Srdivacky
70245431Sdim    enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
71245431Sdim
72263509Sdim    ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
73263509Sdim                                   llvm::opt::ArgStringList &cmdArgs,
74245431Sdim                                   RewriteKind rewrite) const;
75245431Sdim
76263509Sdim    void AddClangCLArgs(const llvm::opt::ArgList &Args,
77263509Sdim                        llvm::opt::ArgStringList &CmdArgs) const;
78263509Sdim
79193326Sed  public:
80208600Srdivacky    Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
81193326Sed
82207619Srdivacky    virtual bool hasGoodDiagnostics() const { return true; }
83203955Srdivacky    virtual bool hasIntegratedAssembler() const { return true; }
84193326Sed    virtual bool hasIntegratedCPP() const { return true; }
85193326Sed
86193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
87198092Srdivacky                              const InputInfo &Output,
88198092Srdivacky                              const InputInfoList &Inputs,
89263509Sdim                              const llvm::opt::ArgList &TCArgs,
90193326Sed                              const char *LinkingOutput) const;
91193326Sed  };
92193326Sed
93208600Srdivacky  /// \brief Clang integrated assembler tool.
94208600Srdivacky  class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
95208600Srdivacky  public:
96208600Srdivacky    ClangAs(const ToolChain &TC) : Tool("clang::as",
97208600Srdivacky                                        "clang integrated assembler", TC) {}
98208600Srdivacky
99208600Srdivacky    virtual bool hasGoodDiagnostics() const { return true; }
100208600Srdivacky    virtual bool hasIntegratedAssembler() const { return false; }
101208600Srdivacky    virtual bool hasIntegratedCPP() const { return false; }
102208600Srdivacky
103208600Srdivacky    virtual void ConstructJob(Compilation &C, const JobAction &JA,
104208600Srdivacky                              const InputInfo &Output,
105208600Srdivacky                              const InputInfoList &Inputs,
106263509Sdim                              const llvm::opt::ArgList &TCArgs,
107208600Srdivacky                              const char *LinkingOutput) const;
108208600Srdivacky  };
109208600Srdivacky
110193326Sed  /// gcc - Generic GCC tool implementations.
111193326Sednamespace gcc {
112208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Common : public Tool {
113193326Sed  public:
114208600Srdivacky    Common(const char *Name, const char *ShortName,
115208600Srdivacky           const ToolChain &TC) : Tool(Name, ShortName, TC) {}
116193326Sed
117193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
118198092Srdivacky                              const InputInfo &Output,
119198092Srdivacky                              const InputInfoList &Inputs,
120263509Sdim                              const llvm::opt::ArgList &TCArgs,
121193326Sed                              const char *LinkingOutput) const;
122193326Sed
123193326Sed    /// RenderExtraToolArgs - Render any arguments necessary to force
124193326Sed    /// the particular tool mode.
125263509Sdim    virtual void
126263509Sdim        RenderExtraToolArgs(const JobAction &JA,
127263509Sdim                            llvm::opt::ArgStringList &CmdArgs) const = 0;
128193326Sed  };
129193326Sed
130208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
131193326Sed  public:
132208600Srdivacky    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
133208600Srdivacky                                             "gcc preprocessor", TC) {}
134193326Sed
135207619Srdivacky    virtual bool hasGoodDiagnostics() const { return true; }
136193326Sed    virtual bool hasIntegratedCPP() const { return false; }
137193326Sed
138203955Srdivacky    virtual void RenderExtraToolArgs(const JobAction &JA,
139263509Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
140193326Sed  };
141193326Sed
142208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Precompile : public Common  {
143193326Sed  public:
144208600Srdivacky    Precompile(const ToolChain &TC) : Common("gcc::Precompile",
145208600Srdivacky                                             "gcc precompile", TC) {}
146193326Sed
147207619Srdivacky    virtual bool hasGoodDiagnostics() const { return true; }
148193326Sed    virtual bool hasIntegratedCPP() const { return true; }
149193326Sed
150203955Srdivacky    virtual void RenderExtraToolArgs(const JobAction &JA,
151263509Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
152193326Sed  };
153193326Sed
154208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Compile : public Common  {
155193326Sed  public:
156208600Srdivacky    Compile(const ToolChain &TC) : Common("gcc::Compile",
157208600Srdivacky                                          "gcc frontend", TC) {}
158193326Sed
159207619Srdivacky    virtual bool hasGoodDiagnostics() const { return true; }
160193326Sed    virtual bool hasIntegratedCPP() const { return true; }
161193326Sed
162203955Srdivacky    virtual void RenderExtraToolArgs(const JobAction &JA,
163263509Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
164193326Sed  };
165193326Sed
166208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Assemble : public Common  {
167193326Sed  public:
168208600Srdivacky    Assemble(const ToolChain &TC) : Common("gcc::Assemble",
169208600Srdivacky                                           "assembler (via gcc)", TC) {}
170193326Sed
171193326Sed    virtual bool hasIntegratedCPP() const { return false; }
172193326Sed
173203955Srdivacky    virtual void RenderExtraToolArgs(const JobAction &JA,
174263509Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
175193326Sed  };
176193326Sed
177208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Link : public Common  {
178193326Sed  public:
179208600Srdivacky    Link(const ToolChain &TC) : Common("gcc::Link",
180208600Srdivacky                                       "linker (via gcc)", TC) {}
181193326Sed
182193326Sed    virtual bool hasIntegratedCPP() const { return false; }
183235633Sdim    virtual bool isLinkJob() const { return true; }
184193326Sed
185203955Srdivacky    virtual void RenderExtraToolArgs(const JobAction &JA,
186263509Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
187193326Sed  };
188193326Sed} // end namespace gcc
189193326Sed
190235633Sdimnamespace hexagon {
191235633Sdim  // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
192235633Sdim  // We simply use "clang -cc1" for those actions.
193235633Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
194235633Sdim  public:
195235633Sdim    Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
196235633Sdim      "hexagon-as", TC) {}
197235633Sdim
198235633Sdim    virtual bool hasIntegratedCPP() const { return false; }
199235633Sdim
200235633Sdim    virtual void RenderExtraToolArgs(const JobAction &JA,
201263509Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
202235633Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
203235633Sdim                              const InputInfo &Output,
204235633Sdim                              const InputInfoList &Inputs,
205263509Sdim                              const llvm::opt::ArgList &TCArgs,
206235633Sdim                              const char *LinkingOutput) const;
207235633Sdim  };
208235633Sdim
209235633Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
210235633Sdim  public:
211235633Sdim    Link(const ToolChain &TC) : Tool("hexagon::Link",
212235633Sdim      "hexagon-ld", TC) {}
213235633Sdim
214235633Sdim    virtual bool hasIntegratedCPP() const { return false; }
215235633Sdim    virtual bool isLinkJob() const { return true; }
216235633Sdim
217235633Sdim    virtual void RenderExtraToolArgs(const JobAction &JA,
218263509Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
219235633Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
220235633Sdim                              const InputInfo &Output,
221235633Sdim                              const InputInfoList &Inputs,
222263509Sdim                              const llvm::opt::ArgList &TCArgs,
223235633Sdim                              const char *LinkingOutput) const;
224235633Sdim  };
225235633Sdim} // end namespace hexagon.
226235633Sdim
227235633Sdim
228193326Sednamespace darwin {
229245431Sdim  llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
230245431Sdim
231208600Srdivacky  class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
232235633Sdim    virtual void anchor();
233198092Srdivacky  protected:
234263509Sdim    void AddDarwinArch(const llvm::opt::ArgList &Args,
235263509Sdim                       llvm::opt::ArgStringList &CmdArgs) const;
236198092Srdivacky
237198092Srdivacky    const toolchains::Darwin &getDarwinToolChain() const {
238198092Srdivacky      return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
239198092Srdivacky    }
240198092Srdivacky
241193326Sed  public:
242208600Srdivacky    DarwinTool(const char *Name, const char *ShortName,
243208600Srdivacky               const ToolChain &TC) : Tool(Name, ShortName, TC) {}
244198092Srdivacky  };
245198092Srdivacky
246208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool  {
247193326Sed  public:
248208600Srdivacky    Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
249208600Srdivacky                                               "assembler", TC) {}
250193326Sed
251193326Sed    virtual bool hasIntegratedCPP() const { return false; }
252193326Sed
253193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
254198092Srdivacky                              const InputInfo &Output,
255198092Srdivacky                              const InputInfoList &Inputs,
256263509Sdim                              const llvm::opt::ArgList &TCArgs,
257193326Sed                              const char *LinkingOutput) const;
258193326Sed  };
259193326Sed
260208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool  {
261245431Sdim    bool NeedsTempPath(const InputInfoList &Inputs) const;
262263509Sdim    void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
263263509Sdim                     llvm::opt::ArgStringList &CmdArgs,
264263509Sdim                     const InputInfoList &Inputs) const;
265193326Sed
266193326Sed  public:
267208600Srdivacky    Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
268193326Sed
269193326Sed    virtual bool hasIntegratedCPP() const { return false; }
270235633Sdim    virtual bool isLinkJob() const { return true; }
271193326Sed
272193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
273198092Srdivacky                              const InputInfo &Output,
274198092Srdivacky                              const InputInfoList &Inputs,
275263509Sdim                              const llvm::opt::ArgList &TCArgs,
276193326Sed                              const char *LinkingOutput) const;
277193326Sed  };
278193326Sed
279208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool  {
280193326Sed  public:
281208600Srdivacky    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
282193326Sed
283193326Sed    virtual bool hasIntegratedCPP() const { return false; }
284193326Sed
285193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
286198092Srdivacky                              const InputInfo &Output,
287198092Srdivacky                              const InputInfoList &Inputs,
288263509Sdim                              const llvm::opt::ArgList &TCArgs,
289193326Sed                              const char *LinkingOutput) const;
290193326Sed  };
291210299Sed
292210299Sed  class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool  {
293210299Sed  public:
294210299Sed    Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
295210299Sed                                               "dsymutil", TC) {}
296210299Sed
297210299Sed    virtual bool hasIntegratedCPP() const { return false; }
298252723Sdim    virtual bool isDsymutilJob() const { return true; }
299210299Sed
300210299Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
301210299Sed                              const InputInfo &Output,
302210299Sed                              const InputInfoList &Inputs,
303263509Sdim                              const llvm::opt::ArgList &TCArgs,
304210299Sed                              const char *LinkingOutput) const;
305210299Sed  };
306226890Sdim
307226890Sdim  class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool  {
308226890Sdim  public:
309226890Sdim    VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
310252723Sdim                                                  "dwarfdump", TC) {}
311226890Sdim
312226890Sdim    virtual bool hasIntegratedCPP() const { return false; }
313226890Sdim
314226890Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
315252723Sdim                              const InputInfo &Output,
316252723Sdim                              const InputInfoList &Inputs,
317263509Sdim                              const llvm::opt::ArgList &TCArgs,
318252723Sdim                              const char *LinkingOutput) const;
319226890Sdim  };
320226890Sdim
321193326Sed}
322193326Sed
323195341Sed  /// openbsd -- Directly call GNU Binutils assembler and linker
324195341Sednamespace openbsd {
325208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
326195341Sed  public:
327208600Srdivacky    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
328208600Srdivacky                                         TC) {}
329195341Sed
330195341Sed    virtual bool hasIntegratedCPP() const { return false; }
331195341Sed
332195341Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
333198092Srdivacky                              const InputInfo &Output,
334198092Srdivacky                              const InputInfoList &Inputs,
335263509Sdim                              const llvm::opt::ArgList &TCArgs,
336195341Sed                              const char *LinkingOutput) const;
337195341Sed  };
338208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
339195341Sed  public:
340208600Srdivacky    Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
341195341Sed
342195341Sed    virtual bool hasIntegratedCPP() const { return false; }
343235633Sdim    virtual bool isLinkJob() const { return true; }
344195341Sed
345195341Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
346198092Srdivacky                              const InputInfo &Output,
347198092Srdivacky                              const InputInfoList &Inputs,
348263509Sdim                              const llvm::opt::ArgList &TCArgs,
349195341Sed                              const char *LinkingOutput) const;
350195341Sed  };
351198092Srdivacky} // end namespace openbsd
352195341Sed
353245431Sdim  /// bitrig -- Directly call GNU Binutils assembler and linker
354245431Sdimnamespace bitrig {
355245431Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
356245431Sdim  public:
357245431Sdim    Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
358245431Sdim                                         TC) {}
359245431Sdim
360245431Sdim    virtual bool hasIntegratedCPP() const { return false; }
361245431Sdim
362245431Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
363245431Sdim                              const InputInfo &Output,
364245431Sdim                              const InputInfoList &Inputs,
365263509Sdim                              const llvm::opt::ArgList &TCArgs,
366245431Sdim                              const char *LinkingOutput) const;
367245431Sdim  };
368245431Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
369245431Sdim  public:
370245431Sdim    Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
371245431Sdim
372245431Sdim    virtual bool hasIntegratedCPP() const { return false; }
373245431Sdim    virtual bool isLinkJob() const { return true; }
374245431Sdim
375245431Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
376245431Sdim                              const InputInfo &Output,
377245431Sdim                              const InputInfoList &Inputs,
378263509Sdim                              const llvm::opt::ArgList &TCArgs,
379245431Sdim                              const char *LinkingOutput) const;
380245431Sdim  };
381245431Sdim} // end namespace bitrig
382245431Sdim
383193326Sed  /// freebsd -- Directly call GNU Binutils assembler and linker
384193326Sednamespace freebsd {
385208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
386193326Sed  public:
387208600Srdivacky    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
388208600Srdivacky                                         TC) {}
389193326Sed
390193326Sed    virtual bool hasIntegratedCPP() const { return false; }
391193326Sed
392193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
393198092Srdivacky                              const InputInfo &Output,
394198092Srdivacky                              const InputInfoList &Inputs,
395263509Sdim                              const llvm::opt::ArgList &TCArgs,
396193326Sed                              const char *LinkingOutput) const;
397193326Sed  };
398208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
399193326Sed  public:
400208600Srdivacky    Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
401193326Sed
402193326Sed    virtual bool hasIntegratedCPP() const { return false; }
403235633Sdim    virtual bool isLinkJob() const { return true; }
404193326Sed
405193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
406198092Srdivacky                              const InputInfo &Output,
407198092Srdivacky                              const InputInfoList &Inputs,
408263509Sdim                              const llvm::opt::ArgList &TCArgs,
409193326Sed                              const char *LinkingOutput) const;
410193326Sed  };
411198092Srdivacky} // end namespace freebsd
412193326Sed
413218893Sdim  /// netbsd -- Directly call GNU Binutils assembler and linker
414218893Sdimnamespace netbsd {
415218893Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
416223017Sdim
417218893Sdim  public:
418235633Sdim    Assemble(const ToolChain &TC)
419235633Sdim      : Tool("netbsd::Assemble", "assembler", TC) {}
420218893Sdim
421218893Sdim    virtual bool hasIntegratedCPP() const { return false; }
422218893Sdim
423218893Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
424218893Sdim                              const InputInfo &Output,
425218893Sdim                              const InputInfoList &Inputs,
426263509Sdim                              const llvm::opt::ArgList &TCArgs,
427218893Sdim                              const char *LinkingOutput) const;
428218893Sdim  };
429218893Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
430223017Sdim
431218893Sdim  public:
432235633Sdim    Link(const ToolChain &TC)
433235633Sdim      : Tool("netbsd::Link", "linker", TC) {}
434218893Sdim
435218893Sdim    virtual bool hasIntegratedCPP() const { return false; }
436235633Sdim    virtual bool isLinkJob() const { return true; }
437218893Sdim
438218893Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
439218893Sdim                              const InputInfo &Output,
440218893Sdim                              const InputInfoList &Inputs,
441263509Sdim                              const llvm::opt::ArgList &TCArgs,
442218893Sdim                              const char *LinkingOutput) const;
443218893Sdim  };
444218893Sdim} // end namespace netbsd
445218893Sdim
446252723Sdim  /// Directly call GNU Binutils' assembler and linker.
447252723Sdimnamespace gnutools {
448212904Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
449212904Sdim  public:
450252723Sdim    Assemble(const ToolChain &TC) : Tool("GNU::Assemble", "assembler", TC) {}
451212904Sdim
452212904Sdim    virtual bool hasIntegratedCPP() const { return false; }
453212904Sdim
454212904Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
455212904Sdim                              const InputInfo &Output,
456212904Sdim                              const InputInfoList &Inputs,
457263509Sdim                              const llvm::opt::ArgList &TCArgs,
458212904Sdim                              const char *LinkingOutput) const;
459212904Sdim  };
460218893Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
461218893Sdim  public:
462252723Sdim    Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
463218893Sdim
464218893Sdim    virtual bool hasIntegratedCPP() const { return false; }
465235633Sdim    virtual bool isLinkJob() const { return true; }
466218893Sdim
467218893Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
468218893Sdim                              const InputInfo &Output,
469218893Sdim                              const InputInfoList &Inputs,
470263509Sdim                              const llvm::opt::ArgList &TCArgs,
471218893Sdim                              const char *LinkingOutput) const;
472218893Sdim  };
473212904Sdim}
474210299Sed  /// minix -- Directly call GNU Binutils assembler and linker
475210299Sednamespace minix {
476210299Sed  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
477210299Sed  public:
478210299Sed    Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
479210299Sed                                         TC) {}
480210299Sed
481210299Sed    virtual bool hasIntegratedCPP() const { return false; }
482210299Sed
483210299Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
484210299Sed                              const InputInfo &Output,
485210299Sed                              const InputInfoList &Inputs,
486263509Sdim                              const llvm::opt::ArgList &TCArgs,
487210299Sed                              const char *LinkingOutput) const;
488210299Sed  };
489210299Sed  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
490210299Sed  public:
491210299Sed    Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
492210299Sed
493210299Sed    virtual bool hasIntegratedCPP() const { return false; }
494235633Sdim    virtual bool isLinkJob() const { return true; }
495210299Sed
496210299Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
497210299Sed                              const InputInfo &Output,
498210299Sed                              const InputInfoList &Inputs,
499263509Sdim                              const llvm::opt::ArgList &TCArgs,
500210299Sed                              const char *LinkingOutput) const;
501210299Sed  };
502210299Sed} // end namespace minix
503210299Sed
504235633Sdim  /// solaris -- Directly call Solaris assembler and linker
505235633Sdimnamespace solaris {
506235633Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
507235633Sdim  public:
508235633Sdim    Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
509235633Sdim                                         TC) {}
510235633Sdim
511235633Sdim    virtual bool hasIntegratedCPP() const { return false; }
512235633Sdim
513235633Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
514235633Sdim                              const InputInfo &Output,
515235633Sdim                              const InputInfoList &Inputs,
516263509Sdim                              const llvm::opt::ArgList &TCArgs,
517235633Sdim                              const char *LinkingOutput) const;
518235633Sdim  };
519235633Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
520235633Sdim  public:
521235633Sdim    Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
522235633Sdim
523235633Sdim    virtual bool hasIntegratedCPP() const { return false; }
524235633Sdim    virtual bool isLinkJob() const { return true; }
525235633Sdim
526235633Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
527235633Sdim                              const InputInfo &Output,
528235633Sdim                              const InputInfoList &Inputs,
529263509Sdim                              const llvm::opt::ArgList &TCArgs,
530235633Sdim                              const char *LinkingOutput) const;
531235633Sdim  };
532235633Sdim} // end namespace solaris
533235633Sdim
534198092Srdivacky  /// auroraux -- Directly call GNU Binutils assembler and linker
535198092Srdivackynamespace auroraux {
536208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
537198092Srdivacky  public:
538208600Srdivacky    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
539208600Srdivacky                                         TC) {}
540198092Srdivacky
541198092Srdivacky    virtual bool hasIntegratedCPP() const { return false; }
542198092Srdivacky
543198092Srdivacky    virtual void ConstructJob(Compilation &C, const JobAction &JA,
544198092Srdivacky                              const InputInfo &Output,
545198092Srdivacky                              const InputInfoList &Inputs,
546263509Sdim                              const llvm::opt::ArgList &TCArgs,
547198092Srdivacky                              const char *LinkingOutput) const;
548198092Srdivacky  };
549208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
550198092Srdivacky  public:
551208600Srdivacky    Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
552198092Srdivacky
553198092Srdivacky    virtual bool hasIntegratedCPP() const { return false; }
554235633Sdim    virtual bool isLinkJob() const { return true; }
555198092Srdivacky
556198092Srdivacky    virtual void ConstructJob(Compilation &C, const JobAction &JA,
557198092Srdivacky                              const InputInfo &Output,
558198092Srdivacky                              const InputInfoList &Inputs,
559263509Sdim                              const llvm::opt::ArgList &TCArgs,
560198092Srdivacky                              const char *LinkingOutput) const;
561198092Srdivacky  };
562198092Srdivacky} // end namespace auroraux
563198092Srdivacky
564193326Sed  /// dragonfly -- Directly call GNU Binutils assembler and linker
565193326Sednamespace dragonfly {
566208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
567193326Sed  public:
568208600Srdivacky    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
569208600Srdivacky                                         TC) {}
570193326Sed
571193326Sed    virtual bool hasIntegratedCPP() const { return false; }
572193326Sed
573193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
574198092Srdivacky                              const InputInfo &Output,
575198092Srdivacky                              const InputInfoList &Inputs,
576263509Sdim                              const llvm::opt::ArgList &TCArgs,
577193326Sed                              const char *LinkingOutput) const;
578193326Sed  };
579208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
580193326Sed  public:
581208600Srdivacky    Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
582193326Sed
583193326Sed    virtual bool hasIntegratedCPP() const { return false; }
584235633Sdim    virtual bool isLinkJob() const { return true; }
585193326Sed
586193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
587198092Srdivacky                              const InputInfo &Output,
588198092Srdivacky                              const InputInfoList &Inputs,
589263509Sdim                              const llvm::opt::ArgList &TCArgs,
590193326Sed                              const char *LinkingOutput) const;
591193326Sed  };
592198092Srdivacky} // end namespace dragonfly
593193326Sed
594212904Sdim  /// Visual studio tools.
595212904Sdimnamespace visualstudio {
596263509Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
597212904Sdim  public:
598212904Sdim    Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
599212904Sdim
600212904Sdim    virtual bool hasIntegratedCPP() const { return false; }
601235633Sdim    virtual bool isLinkJob() const { return true; }
602212904Sdim
603212904Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
604212904Sdim                              const InputInfo &Output,
605212904Sdim                              const InputInfoList &Inputs,
606263509Sdim                              const llvm::opt::ArgList &TCArgs,
607212904Sdim                              const char *LinkingOutput) const;
608212904Sdim  };
609263509Sdim
610263509Sdim  class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
611263509Sdim  public:
612263509Sdim    Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
613263509Sdim
614263509Sdim    virtual bool hasIntegratedAssembler() const { return true; }
615263509Sdim    virtual bool hasIntegratedCPP() const { return true; }
616263509Sdim    virtual bool isLinkJob() const { return false; }
617263509Sdim
618263509Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
619263509Sdim                              const InputInfo &Output,
620263509Sdim                              const InputInfoList &Inputs,
621263509Sdim                              const llvm::opt::ArgList &TCArgs,
622263509Sdim                              const char *LinkingOutput) const;
623263509Sdim
624263509Sdim    Command *GetCommand(Compilation &C, const JobAction &JA,
625263509Sdim                        const InputInfo &Output,
626263509Sdim                        const InputInfoList &Inputs,
627263509Sdim                        const llvm::opt::ArgList &TCArgs,
628263509Sdim                        const char *LinkingOutput) const;
629263509Sdim  };
630212904Sdim} // end namespace visualstudio
631212904Sdim
632263509Sdimnamespace XCore {
633263509Sdim  // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
634263509Sdim  // We simply use "clang -cc1" for those actions.
635263509Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
636263509Sdim  public:
637263509Sdim    Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
638263509Sdim      "XCore-as", TC) {}
639263509Sdim
640263509Sdim    virtual bool hasIntegratedCPP() const { return false; }
641263509Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
642263509Sdim                              const InputInfo &Output,
643263509Sdim                              const InputInfoList &Inputs,
644263509Sdim                              const llvm::opt::ArgList &TCArgs,
645263509Sdim                              const char *LinkingOutput) const;
646263509Sdim  };
647263509Sdim
648263509Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
649263509Sdim  public:
650263509Sdim    Link(const ToolChain &TC) : Tool("XCore::Link",
651263509Sdim      "XCore-ld", TC) {}
652263509Sdim
653263509Sdim    virtual bool hasIntegratedCPP() const { return false; }
654263509Sdim    virtual bool isLinkJob() const { return true; }
655263509Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
656263509Sdim                              const InputInfo &Output,
657263509Sdim                              const InputInfoList &Inputs,
658263509Sdim                              const llvm::opt::ArgList &TCArgs,
659263509Sdim                              const char *LinkingOutput) const;
660263509Sdim  };
661263509Sdim} // end namespace XCore.
662263509Sdim
663263509Sdim
664193326Sed} // end namespace toolchains
665193326Sed} // end namespace driver
666193326Sed} // end namespace clang
667193326Sed
668198092Srdivacky#endif // CLANG_LIB_DRIVER_TOOLS_H_
669