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"
17263508Sdim#include "llvm/Option/Option.h"
18193326Sed#include "llvm/Support/Compiler.h"
19193326Sed
20193326Sednamespace clang {
21239462Sdim  class ObjCRuntime;
22239462Sdim
23193326Sednamespace driver {
24263508Sdim  class Command;
25193326Sed  class Driver;
26193326Sed
27193326Sednamespace toolchains {
28198092Srdivacky  class Darwin;
29193326Sed}
30193326Sed
31193326Sednamespace tools {
32263508Sdimusing llvm::opt::ArgStringList;
33193326Sed
34208600Srdivacky  /// \brief Clang compiler tool.
35208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
36249423Sdim  public:
37263508Sdim    static const char *getBaseInputName(const llvm::opt::ArgList &Args,
38249423Sdim                                        const InputInfoList &Inputs);
39263508Sdim    static const char *getBaseInputStem(const llvm::opt::ArgList &Args,
40249423Sdim                                        const InputInfoList &Inputs);
41263508Sdim    static const char *getDependencyFileName(const llvm::opt::ArgList &Args,
42249423Sdim                                             const InputInfoList &Inputs);
43249423Sdim
44249423Sdim  private:
45263508Sdim    void AddPreprocessingOptions(Compilation &C, const JobAction &JA,
46234353Sdim                                 const Driver &D,
47263508Sdim                                 const llvm::opt::ArgList &Args,
48263508Sdim                                 llvm::opt::ArgStringList &CmdArgs,
49193326Sed                                 const InputInfo &Output,
50193326Sed                                 const InputInfoList &Inputs) const;
51193326Sed
52263508Sdim    void AddAArch64TargetArgs(const llvm::opt::ArgList &Args,
53263508Sdim                              llvm::opt::ArgStringList &CmdArgs) const;
54263508Sdim    void AddARMTargetArgs(const llvm::opt::ArgList &Args,
55263508Sdim                          llvm::opt::ArgStringList &CmdArgs,
56221345Sdim                          bool KernelOrKext) const;
57263508Sdim    void AddMIPSTargetArgs(const llvm::opt::ArgList &Args,
58263508Sdim                           llvm::opt::ArgStringList &CmdArgs) const;
59263508Sdim    void AddR600TargetArgs(const llvm::opt::ArgList &Args,
60263508Sdim                           llvm::opt::ArgStringList &CmdArgs) const;
61263508Sdim    void AddSparcTargetArgs(const llvm::opt::ArgList &Args,
62263508Sdim                            llvm::opt::ArgStringList &CmdArgs) const;
63263508Sdim    void AddSystemZTargetArgs(const llvm::opt::ArgList &Args,
64263508Sdim                              llvm::opt::ArgStringList &CmdArgs) const;
65263508Sdim    void AddX86TargetArgs(const llvm::opt::ArgList &Args,
66263508Sdim                          llvm::opt::ArgStringList &CmdArgs) const;
67263508Sdim    void AddHexagonTargetArgs(const llvm::opt::ArgList &Args,
68263508Sdim                              llvm::opt::ArgStringList &CmdArgs) const;
69198092Srdivacky
70239462Sdim    enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
71239462Sdim
72263508Sdim    ObjCRuntime AddObjCRuntimeArgs(const llvm::opt::ArgList &args,
73263508Sdim                                   llvm::opt::ArgStringList &cmdArgs,
74239462Sdim                                   RewriteKind rewrite) const;
75239462Sdim
76263508Sdim    void AddClangCLArgs(const llvm::opt::ArgList &Args,
77263508Sdim                        llvm::opt::ArgStringList &CmdArgs) const;
78263508Sdim
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,
89263508Sdim                              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,
106263508Sdim                              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,
120263508Sdim                              const llvm::opt::ArgList &TCArgs,
121193326Sed                              const char *LinkingOutput) const;
122193326Sed
123193326Sed    /// RenderExtraToolArgs - Render any arguments necessary to force
124193326Sed    /// the particular tool mode.
125263508Sdim    virtual void
126263508Sdim        RenderExtraToolArgs(const JobAction &JA,
127263508Sdim                            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,
139263508Sdim                                     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,
151263508Sdim                                     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,
163263508Sdim                                     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,
174263508Sdim                                     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; }
183234353Sdim    virtual bool isLinkJob() const { return true; }
184193326Sed
185203955Srdivacky    virtual void RenderExtraToolArgs(const JobAction &JA,
186263508Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
187193326Sed  };
188193326Sed} // end namespace gcc
189193326Sed
190234353Sdimnamespace hexagon {
191234353Sdim  // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
192234353Sdim  // We simply use "clang -cc1" for those actions.
193234353Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
194234353Sdim  public:
195234353Sdim    Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
196234353Sdim      "hexagon-as", TC) {}
197234353Sdim
198234353Sdim    virtual bool hasIntegratedCPP() const { return false; }
199234353Sdim
200234353Sdim    virtual void RenderExtraToolArgs(const JobAction &JA,
201263508Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
202234353Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
203234353Sdim                              const InputInfo &Output,
204234353Sdim                              const InputInfoList &Inputs,
205263508Sdim                              const llvm::opt::ArgList &TCArgs,
206234353Sdim                              const char *LinkingOutput) const;
207234353Sdim  };
208234353Sdim
209234353Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
210234353Sdim  public:
211234353Sdim    Link(const ToolChain &TC) : Tool("hexagon::Link",
212234353Sdim      "hexagon-ld", TC) {}
213234353Sdim
214234353Sdim    virtual bool hasIntegratedCPP() const { return false; }
215234353Sdim    virtual bool isLinkJob() const { return true; }
216234353Sdim
217234353Sdim    virtual void RenderExtraToolArgs(const JobAction &JA,
218263508Sdim                                     llvm::opt::ArgStringList &CmdArgs) const;
219234353Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
220234353Sdim                              const InputInfo &Output,
221234353Sdim                              const InputInfoList &Inputs,
222263508Sdim                              const llvm::opt::ArgList &TCArgs,
223234353Sdim                              const char *LinkingOutput) const;
224234353Sdim  };
225234353Sdim} // end namespace hexagon.
226234353Sdim
227234353Sdim
228193326Sednamespace darwin {
229243830Sdim  llvm::Triple::ArchType getArchTypeForDarwinArchName(StringRef Str);
230243830Sdim
231208600Srdivacky  class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
232234353Sdim    virtual void anchor();
233198092Srdivacky  protected:
234263508Sdim    void AddDarwinArch(const llvm::opt::ArgList &Args,
235263508Sdim                       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,
256263508Sdim                              const llvm::opt::ArgList &TCArgs,
257193326Sed                              const char *LinkingOutput) const;
258193326Sed  };
259193326Sed
260208600Srdivacky  class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool  {
261243830Sdim    bool NeedsTempPath(const InputInfoList &Inputs) const;
262263508Sdim    void AddLinkArgs(Compilation &C, const llvm::opt::ArgList &Args,
263263508Sdim                     llvm::opt::ArgStringList &CmdArgs,
264263508Sdim                     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; }
270234353Sdim    virtual bool isLinkJob() const { return true; }
271193326Sed
272193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
273198092Srdivacky                              const InputInfo &Output,
274198092Srdivacky                              const InputInfoList &Inputs,
275263508Sdim                              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,
288263508Sdim                              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; }
298249423Sdim    virtual bool isDsymutilJob() const { return true; }
299210299Sed
300210299Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
301210299Sed                              const InputInfo &Output,
302210299Sed                              const InputInfoList &Inputs,
303263508Sdim                              const llvm::opt::ArgList &TCArgs,
304210299Sed                              const char *LinkingOutput) const;
305210299Sed  };
306226633Sdim
307226633Sdim  class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool  {
308226633Sdim  public:
309226633Sdim    VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
310249423Sdim                                                  "dwarfdump", TC) {}
311226633Sdim
312226633Sdim    virtual bool hasIntegratedCPP() const { return false; }
313226633Sdim
314226633Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
315249423Sdim                              const InputInfo &Output,
316249423Sdim                              const InputInfoList &Inputs,
317263508Sdim                              const llvm::opt::ArgList &TCArgs,
318249423Sdim                              const char *LinkingOutput) const;
319226633Sdim  };
320226633Sdim
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,
335263508Sdim                              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; }
343234353Sdim    virtual bool isLinkJob() const { return true; }
344195341Sed
345195341Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
346198092Srdivacky                              const InputInfo &Output,
347198092Srdivacky                              const InputInfoList &Inputs,
348263508Sdim                              const llvm::opt::ArgList &TCArgs,
349195341Sed                              const char *LinkingOutput) const;
350195341Sed  };
351198092Srdivacky} // end namespace openbsd
352195341Sed
353239462Sdim  /// bitrig -- Directly call GNU Binutils assembler and linker
354239462Sdimnamespace bitrig {
355239462Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
356239462Sdim  public:
357239462Sdim    Assemble(const ToolChain &TC) : Tool("bitrig::Assemble", "assembler",
358239462Sdim                                         TC) {}
359239462Sdim
360239462Sdim    virtual bool hasIntegratedCPP() const { return false; }
361239462Sdim
362239462Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
363239462Sdim                              const InputInfo &Output,
364239462Sdim                              const InputInfoList &Inputs,
365263508Sdim                              const llvm::opt::ArgList &TCArgs,
366239462Sdim                              const char *LinkingOutput) const;
367239462Sdim  };
368239462Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
369239462Sdim  public:
370239462Sdim    Link(const ToolChain &TC) : Tool("bitrig::Link", "linker", TC) {}
371239462Sdim
372239462Sdim    virtual bool hasIntegratedCPP() const { return false; }
373239462Sdim    virtual bool isLinkJob() const { return true; }
374239462Sdim
375239462Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
376239462Sdim                              const InputInfo &Output,
377239462Sdim                              const InputInfoList &Inputs,
378263508Sdim                              const llvm::opt::ArgList &TCArgs,
379239462Sdim                              const char *LinkingOutput) const;
380239462Sdim  };
381239462Sdim} // end namespace bitrig
382239462Sdim
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,
395263508Sdim                              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; }
403234353Sdim    virtual bool isLinkJob() const { return true; }
404193326Sed
405193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
406198092Srdivacky                              const InputInfo &Output,
407198092Srdivacky                              const InputInfoList &Inputs,
408263508Sdim                              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:
418234353Sdim    Assemble(const ToolChain &TC)
419234353Sdim      : 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,
426263508Sdim                              const llvm::opt::ArgList &TCArgs,
427218893Sdim                              const char *LinkingOutput) const;
428218893Sdim  };
429218893Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
430223017Sdim
431218893Sdim  public:
432234353Sdim    Link(const ToolChain &TC)
433234353Sdim      : Tool("netbsd::Link", "linker", TC) {}
434218893Sdim
435218893Sdim    virtual bool hasIntegratedCPP() const { return false; }
436234353Sdim    virtual bool isLinkJob() const { return true; }
437218893Sdim
438218893Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
439218893Sdim                              const InputInfo &Output,
440218893Sdim                              const InputInfoList &Inputs,
441263508Sdim                              const llvm::opt::ArgList &TCArgs,
442218893Sdim                              const char *LinkingOutput) const;
443218893Sdim  };
444218893Sdim} // end namespace netbsd
445218893Sdim
446249423Sdim  /// Directly call GNU Binutils' assembler and linker.
447249423Sdimnamespace gnutools {
448212904Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
449212904Sdim  public:
450249423Sdim    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,
457263508Sdim                              const llvm::opt::ArgList &TCArgs,
458212904Sdim                              const char *LinkingOutput) const;
459212904Sdim  };
460218893Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
461218893Sdim  public:
462249423Sdim    Link(const ToolChain &TC) : Tool("GNU::Link", "linker", TC) {}
463218893Sdim
464218893Sdim    virtual bool hasIntegratedCPP() const { return false; }
465234353Sdim    virtual bool isLinkJob() const { return true; }
466218893Sdim
467218893Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
468218893Sdim                              const InputInfo &Output,
469218893Sdim                              const InputInfoList &Inputs,
470263508Sdim                              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,
486263508Sdim                              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; }
494234353Sdim    virtual bool isLinkJob() const { return true; }
495210299Sed
496210299Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
497210299Sed                              const InputInfo &Output,
498210299Sed                              const InputInfoList &Inputs,
499263508Sdim                              const llvm::opt::ArgList &TCArgs,
500210299Sed                              const char *LinkingOutput) const;
501210299Sed  };
502210299Sed} // end namespace minix
503210299Sed
504234353Sdim  /// solaris -- Directly call Solaris assembler and linker
505234353Sdimnamespace solaris {
506234353Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
507234353Sdim  public:
508234353Sdim    Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
509234353Sdim                                         TC) {}
510234353Sdim
511234353Sdim    virtual bool hasIntegratedCPP() const { return false; }
512234353Sdim
513234353Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
514234353Sdim                              const InputInfo &Output,
515234353Sdim                              const InputInfoList &Inputs,
516263508Sdim                              const llvm::opt::ArgList &TCArgs,
517234353Sdim                              const char *LinkingOutput) const;
518234353Sdim  };
519234353Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
520234353Sdim  public:
521234353Sdim    Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
522234353Sdim
523234353Sdim    virtual bool hasIntegratedCPP() const { return false; }
524234353Sdim    virtual bool isLinkJob() const { return true; }
525234353Sdim
526234353Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
527234353Sdim                              const InputInfo &Output,
528234353Sdim                              const InputInfoList &Inputs,
529263508Sdim                              const llvm::opt::ArgList &TCArgs,
530234353Sdim                              const char *LinkingOutput) const;
531234353Sdim  };
532234353Sdim} // end namespace solaris
533234353Sdim
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,
546263508Sdim                              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; }
554234353Sdim    virtual bool isLinkJob() const { return true; }
555198092Srdivacky
556198092Srdivacky    virtual void ConstructJob(Compilation &C, const JobAction &JA,
557198092Srdivacky                              const InputInfo &Output,
558198092Srdivacky                              const InputInfoList &Inputs,
559263508Sdim                              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,
576263508Sdim                              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; }
584234353Sdim    virtual bool isLinkJob() const { return true; }
585193326Sed
586193326Sed    virtual void ConstructJob(Compilation &C, const JobAction &JA,
587198092Srdivacky                              const InputInfo &Output,
588198092Srdivacky                              const InputInfoList &Inputs,
589263508Sdim                              const llvm::opt::ArgList &TCArgs,
590193326Sed                              const char *LinkingOutput) const;
591193326Sed  };
592198092Srdivacky} // end namespace dragonfly
593193326Sed
594212904Sdim  /// Visual studio tools.
595212904Sdimnamespace visualstudio {
596263508Sdim  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; }
601234353Sdim    virtual bool isLinkJob() const { return true; }
602212904Sdim
603212904Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
604212904Sdim                              const InputInfo &Output,
605212904Sdim                              const InputInfoList &Inputs,
606263508Sdim                              const llvm::opt::ArgList &TCArgs,
607212904Sdim                              const char *LinkingOutput) const;
608212904Sdim  };
609263508Sdim
610263508Sdim  class LLVM_LIBRARY_VISIBILITY Compile : public Tool {
611263508Sdim  public:
612263508Sdim    Compile(const ToolChain &TC) : Tool("visualstudio::Compile", "compiler", TC) {}
613263508Sdim
614263508Sdim    virtual bool hasIntegratedAssembler() const { return true; }
615263508Sdim    virtual bool hasIntegratedCPP() const { return true; }
616263508Sdim    virtual bool isLinkJob() const { return false; }
617263508Sdim
618263508Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
619263508Sdim                              const InputInfo &Output,
620263508Sdim                              const InputInfoList &Inputs,
621263508Sdim                              const llvm::opt::ArgList &TCArgs,
622263508Sdim                              const char *LinkingOutput) const;
623263508Sdim
624263508Sdim    Command *GetCommand(Compilation &C, const JobAction &JA,
625263508Sdim                        const InputInfo &Output,
626263508Sdim                        const InputInfoList &Inputs,
627263508Sdim                        const llvm::opt::ArgList &TCArgs,
628263508Sdim                        const char *LinkingOutput) const;
629263508Sdim  };
630212904Sdim} // end namespace visualstudio
631212904Sdim
632263508Sdimnamespace XCore {
633263508Sdim  // For XCore, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
634263508Sdim  // We simply use "clang -cc1" for those actions.
635263508Sdim  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
636263508Sdim  public:
637263508Sdim    Assemble(const ToolChain &TC) : Tool("XCore::Assemble",
638263508Sdim      "XCore-as", TC) {}
639263508Sdim
640263508Sdim    virtual bool hasIntegratedCPP() const { return false; }
641263508Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
642263508Sdim                              const InputInfo &Output,
643263508Sdim                              const InputInfoList &Inputs,
644263508Sdim                              const llvm::opt::ArgList &TCArgs,
645263508Sdim                              const char *LinkingOutput) const;
646263508Sdim  };
647263508Sdim
648263508Sdim  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
649263508Sdim  public:
650263508Sdim    Link(const ToolChain &TC) : Tool("XCore::Link",
651263508Sdim      "XCore-ld", TC) {}
652263508Sdim
653263508Sdim    virtual bool hasIntegratedCPP() const { return false; }
654263508Sdim    virtual bool isLinkJob() const { return true; }
655263508Sdim    virtual void ConstructJob(Compilation &C, const JobAction &JA,
656263508Sdim                              const InputInfo &Output,
657263508Sdim                              const InputInfoList &Inputs,
658263508Sdim                              const llvm::opt::ArgList &TCArgs,
659263508Sdim                              const char *LinkingOutput) const;
660263508Sdim  };
661263508Sdim} // end namespace XCore.
662263508Sdim
663263508Sdim
664193326Sed} // end namespace toolchains
665193326Sed} // end namespace driver
666193326Sed} // end namespace clang
667193326Sed
668198092Srdivacky#endif // CLANG_LIB_DRIVER_TOOLS_H_
669