Tools.h revision 260611a32535c851237926bfcf78869b13c07d5b
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===//
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//                     The LLVM Compiler Infrastructure
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// This file is distributed under the University of Illinois Open Source
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details.
7868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)//
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)//===----------------------------------------------------------------------===//
91320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef CLANG_LIB_DRIVER_TOOLS_H_
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define CLANG_LIB_DRIVER_TOOLS_H_
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "clang/Driver/Tool.h"
14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "clang/Driver/Types.h"
15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "clang/Driver/Util.h"
16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "llvm/ADT/Triple.h"
187d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "llvm/Support/Compiler.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
20effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace clang {
21effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  class ObjCRuntime;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace driver {
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Driver;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace toolchains {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class Darwin;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace tools {
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Clang compiler tool.
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class LLVM_LIBRARY_VISIBILITY Clang : public Tool {
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddPreprocessingOptions(Compilation &C,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const Driver &D,
36a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)                                 const ArgList &Args,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 ArgStringList &CmdArgs,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const InputInfo &Output,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                 const InputInfoList &Inputs) const;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs,
422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                          bool KernelOrKext) const;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
4458537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)    void AddPPCTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddSparcTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
46effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddHexagonTargetArgs (const ArgList &Args, ArgStringList &CmdArgs) const;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    enum RewriteKind { RK_None, RK_Fragile, RK_NonFragile };
502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ObjCRuntime AddObjCRuntimeArgs(const ArgList &args, ArgStringList &cmdArgs,
522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                   RewriteKind rewrite) const;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {}
56f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool hasGoodDiagnostics() const { return true; }
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool hasIntegratedAssembler() const { return true; }
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool hasIntegratedCPP() const { return true; }
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual void ConstructJob(Compilation &C, const JobAction &JA,
62effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              const InputInfo &Output,
63effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              const InputInfoList &Inputs,
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const ArgList &TCArgs,
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const char *LinkingOutput) const;
66effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  };
67effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /// \brief Clang integrated assembler tool.
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool {
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    ClangAs(const ToolChain &TC) : Tool("clang::as",
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                        "clang integrated assembler", TC) {}
74f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool hasGoodDiagnostics() const { return true; }
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual bool hasIntegratedAssembler() const { return false; }
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool hasIntegratedCPP() const { return false; }
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void ConstructJob(Compilation &C, const JobAction &JA,
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const InputInfo &Output,
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const InputInfoList &Inputs,
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const ArgList &TCArgs,
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const char *LinkingOutput) const;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)  /// gcc - Generic GCC tool implementations.
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gcc {
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class LLVM_LIBRARY_VISIBILITY Common : public Tool {
89effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  public:
90effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    Common(const char *Name, const char *ShortName,
91effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch           const ToolChain &TC) : Tool(Name, ShortName, TC) {}
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void ConstructJob(Compilation &C, const JobAction &JA,
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const InputInfo &Output,
9558537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)                              const InputInfoList &Inputs,
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const ArgList &TCArgs,
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const char *LinkingOutput) const;
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /// RenderExtraToolArgs - Render any arguments necessary to force
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    /// the particular tool mode.
101effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual void RenderExtraToolArgs(const JobAction &JA,
102effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     ArgStringList &CmdArgs) const = 0;
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class LLVM_LIBRARY_VISIBILITY Preprocess : public Common {
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  public:
1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Preprocess(const ToolChain &TC) : Common("gcc::Preprocess",
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             "gcc preprocessor", TC) {}
110effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
111effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool hasGoodDiagnostics() const { return true; }
1127dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch    virtual bool hasIntegratedCPP() const { return false; }
1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void RenderExtraToolArgs(const JobAction &JA,
115effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     ArgStringList &CmdArgs) const;
116effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  };
1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class LLVM_LIBRARY_VISIBILITY Precompile : public Common  {
1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  public:
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Precompile(const ToolChain &TC) : Common("gcc::Precompile",
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                             "gcc precompile", TC) {}
1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool hasGoodDiagnostics() const { return true; }
124effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool hasIntegratedCPP() const { return true; }
125868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    virtual void RenderExtraToolArgs(const JobAction &JA,
127effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                     ArgStringList &CmdArgs) const;
128effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  };
1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  class LLVM_LIBRARY_VISIBILITY Compile : public Common  {
131a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)  public:
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Compile(const ToolChain &TC) : Common("gcc::Compile",
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                          "gcc frontend", TC) {}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
135effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool hasGoodDiagnostics() const { return true; }
136effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool hasIntegratedCPP() const { return true; }
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void RenderExtraToolArgs(const JobAction &JA,
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ArgStringList &CmdArgs) const;
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class LLVM_LIBRARY_VISIBILITY Assemble : public Common  {
1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  public:
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Assemble(const ToolChain &TC) : Common("gcc::Assemble",
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                           "assembler (via gcc)", TC) {}
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool hasIntegratedCPP() const { return false; }
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void RenderExtraToolArgs(const JobAction &JA,
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ArgStringList &CmdArgs) const;
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  };
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  class LLVM_LIBRARY_VISIBILITY Link : public Common  {
1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  public:
1552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    Link(const ToolChain &TC) : Common("gcc::Link",
1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)                                       "linker (via gcc)", TC) {}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
158effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool hasIntegratedCPP() const { return false; }
159effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool isLinkJob() const { return true; }
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void RenderExtraToolArgs(const JobAction &JA,
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ArgStringList &CmdArgs) const;
163effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  };
164effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // end namespace gcc
165effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
166effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace hexagon {
167effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // For Hexagon, we do not need to instantiate tools for PreProcess, PreCompile and Compile.
168effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  // We simply use "clang -cc1" for those actions.
169effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool {
170effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  public:
1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    Assemble(const ToolChain &TC) : Tool("hexagon::Assemble",
1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      "hexagon-as", TC) {}
1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual bool hasIntegratedCPP() const { return false; }
1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
176f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    virtual void RenderExtraToolArgs(const JobAction &JA,
1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ArgStringList &CmdArgs) const;
1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void ConstructJob(Compilation &C, const JobAction &JA,
179effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              const InputInfo &Output,
180effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              const InputInfoList &Inputs,
181effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              const ArgList &TCArgs,
182effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              const char *LinkingOutput) const;
183effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  };
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
185effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  class LLVM_LIBRARY_VISIBILITY Link : public Tool {
186effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  public:
187effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    Link(const ToolChain &TC) : Tool("hexagon::Link",
188effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch      "hexagon-ld", TC) {}
189effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
190effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool hasIntegratedCPP() const { return false; }
191effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual bool isLinkJob() const { return true; }
192effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
193effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch    virtual void RenderExtraToolArgs(const JobAction &JA,
1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                     ArgStringList &CmdArgs) const;
1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void ConstructJob(Compilation &C, const JobAction &JA,
196f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              const InputInfo &Output,
1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                              const InputInfoList &Inputs,
198f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)                              const ArgList &TCArgs,
199effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                              const char *LinkingOutput) const;
200effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  };
201effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch} // end namespace hexagon.
202effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
203effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
204effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochnamespace darwin {
205effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool {
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    virtual void anchor();
207effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch  protected:
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const;
209effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch
2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const toolchains::Darwin &getDarwinToolChain() const {
211      return reinterpret_cast<const toolchains::Darwin&>(getToolChain());
212    }
213
214  public:
215    DarwinTool(const char *Name, const char *ShortName,
216               const ToolChain &TC) : Tool(Name, ShortName, TC) {}
217  };
218
219  class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool  {
220    virtual void anchor();
221  public:
222    static const char *getBaseInputName(const ArgList &Args,
223                                 const InputInfoList &Input);
224    static const char *getBaseInputStem(const ArgList &Args,
225                                 const InputInfoList &Input);
226    static const char *getDependencyFileName(const ArgList &Args,
227                                             const InputInfoList &Inputs);
228
229  protected:
230    const char *getCC1Name(types::ID Type) const;
231
232    void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const;
233    void RemoveCC1UnsupportedArgs(ArgStringList &CmdArgs) const;
234    void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
235                           const InputInfoList &Inputs,
236                           const ArgStringList &OutputArgs) const;
237    void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs,
238                           const InputInfoList &Inputs,
239                           const ArgStringList &OutputArgs) const;
240    void AddCPPUniqueOptionsArgs(const ArgList &Args,
241                                 ArgStringList &CmdArgs,
242                                 const InputInfoList &Inputs) const;
243    void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const;
244
245  public:
246    CC1(const char *Name, const char *ShortName,
247        const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {}
248
249    virtual bool hasGoodDiagnostics() const { return true; }
250    virtual bool hasIntegratedCPP() const { return true; }
251  };
252
253  class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1  {
254  public:
255    Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess",
256                                          "gcc preprocessor", TC) {}
257
258    virtual void ConstructJob(Compilation &C, const JobAction &JA,
259                              const InputInfo &Output,
260                              const InputInfoList &Inputs,
261                              const ArgList &TCArgs,
262                              const char *LinkingOutput) const;
263  };
264
265  class LLVM_LIBRARY_VISIBILITY Compile : public CC1  {
266  public:
267    Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {}
268
269    virtual void ConstructJob(Compilation &C, const JobAction &JA,
270                              const InputInfo &Output,
271                              const InputInfoList &Inputs,
272                              const ArgList &TCArgs,
273                              const char *LinkingOutput) const;
274  };
275
276  class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool  {
277  public:
278    Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble",
279                                               "assembler", TC) {}
280
281    virtual bool hasIntegratedCPP() const { return false; }
282
283    virtual void ConstructJob(Compilation &C, const JobAction &JA,
284                              const InputInfo &Output,
285                              const InputInfoList &Inputs,
286                              const ArgList &TCArgs,
287                              const char *LinkingOutput) const;
288  };
289
290  class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool  {
291    void AddLinkArgs(Compilation &C, const ArgList &Args,
292                     ArgStringList &CmdArgs) const;
293
294  public:
295    Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {}
296
297    virtual bool hasIntegratedCPP() const { return false; }
298    virtual bool isLinkJob() const { return true; }
299
300    virtual void ConstructJob(Compilation &C, const JobAction &JA,
301                              const InputInfo &Output,
302                              const InputInfoList &Inputs,
303                              const ArgList &TCArgs,
304                              const char *LinkingOutput) const;
305  };
306
307  class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool  {
308  public:
309    Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {}
310
311    virtual bool hasIntegratedCPP() const { return false; }
312
313    virtual void ConstructJob(Compilation &C, const JobAction &JA,
314                              const InputInfo &Output,
315                              const InputInfoList &Inputs,
316                              const ArgList &TCArgs,
317                              const char *LinkingOutput) const;
318  };
319
320  class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool  {
321  public:
322    Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil",
323                                               "dsymutil", TC) {}
324
325    virtual bool hasIntegratedCPP() const { return false; }
326
327    virtual void ConstructJob(Compilation &C, const JobAction &JA,
328                              const InputInfo &Output,
329                              const InputInfoList &Inputs,
330                              const ArgList &TCArgs,
331                              const char *LinkingOutput) const;
332  };
333
334  class LLVM_LIBRARY_VISIBILITY VerifyDebug : public DarwinTool  {
335  public:
336    VerifyDebug(const ToolChain &TC) : DarwinTool("darwin::VerifyDebug",
337						  "dwarfdump", TC) {}
338
339    virtual bool hasIntegratedCPP() const { return false; }
340
341    virtual void ConstructJob(Compilation &C, const JobAction &JA,
342			      const InputInfo &Output,
343			      const InputInfoList &Inputs,
344			      const ArgList &TCArgs,
345			      const char *LinkingOutput) const;
346  };
347
348}
349
350  /// openbsd -- Directly call GNU Binutils assembler and linker
351namespace openbsd {
352  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
353  public:
354    Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler",
355                                         TC) {}
356
357    virtual bool hasIntegratedCPP() const { return false; }
358
359    virtual void ConstructJob(Compilation &C, const JobAction &JA,
360                              const InputInfo &Output,
361                              const InputInfoList &Inputs,
362                              const ArgList &TCArgs,
363                              const char *LinkingOutput) const;
364  };
365  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
366  public:
367    Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {}
368
369    virtual bool hasIntegratedCPP() const { return false; }
370    virtual bool isLinkJob() const { return true; }
371
372    virtual void ConstructJob(Compilation &C, const JobAction &JA,
373                              const InputInfo &Output,
374                              const InputInfoList &Inputs,
375                              const ArgList &TCArgs,
376                              const char *LinkingOutput) const;
377  };
378} // end namespace openbsd
379
380  /// freebsd -- Directly call GNU Binutils assembler and linker
381namespace freebsd {
382  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
383  public:
384    Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler",
385                                         TC) {}
386
387    virtual bool hasIntegratedCPP() const { return false; }
388
389    virtual void ConstructJob(Compilation &C, const JobAction &JA,
390                              const InputInfo &Output,
391                              const InputInfoList &Inputs,
392                              const ArgList &TCArgs,
393                              const char *LinkingOutput) const;
394  };
395  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
396  public:
397    Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", TC) {}
398
399    virtual bool hasIntegratedCPP() const { return false; }
400    virtual bool isLinkJob() const { return true; }
401
402    virtual void ConstructJob(Compilation &C, const JobAction &JA,
403                              const InputInfo &Output,
404                              const InputInfoList &Inputs,
405                              const ArgList &TCArgs,
406                              const char *LinkingOutput) const;
407  };
408} // end namespace freebsd
409
410  /// netbsd -- Directly call GNU Binutils assembler and linker
411namespace netbsd {
412  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
413
414  public:
415    Assemble(const ToolChain &TC)
416      : Tool("netbsd::Assemble", "assembler", TC) {}
417
418    virtual bool hasIntegratedCPP() const { return false; }
419
420    virtual void ConstructJob(Compilation &C, const JobAction &JA,
421                              const InputInfo &Output,
422                              const InputInfoList &Inputs,
423                              const ArgList &TCArgs,
424                              const char *LinkingOutput) const;
425  };
426  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
427
428  public:
429    Link(const ToolChain &TC)
430      : Tool("netbsd::Link", "linker", TC) {}
431
432    virtual bool hasIntegratedCPP() const { return false; }
433    virtual bool isLinkJob() const { return true; }
434
435    virtual void ConstructJob(Compilation &C, const JobAction &JA,
436                              const InputInfo &Output,
437                              const InputInfoList &Inputs,
438                              const ArgList &TCArgs,
439                              const char *LinkingOutput) const;
440  };
441} // end namespace netbsd
442
443  /// linux -- Directly call GNU Binutils assembler and linker
444namespace linuxtools {
445  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
446  public:
447    Assemble(const ToolChain &TC) : Tool("linux::Assemble", "assembler",
448                                         TC) {}
449
450    virtual bool hasIntegratedCPP() const { return false; }
451
452    virtual void ConstructJob(Compilation &C, const JobAction &JA,
453                              const InputInfo &Output,
454                              const InputInfoList &Inputs,
455                              const ArgList &TCArgs,
456                              const char *LinkingOutput) const;
457  };
458  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
459  public:
460    Link(const ToolChain &TC) : Tool("linux::Link", "linker", TC) {}
461
462    virtual bool hasIntegratedCPP() const { return false; }
463    virtual bool isLinkJob() const { return true; }
464
465    virtual void ConstructJob(Compilation &C, const JobAction &JA,
466                              const InputInfo &Output,
467                              const InputInfoList &Inputs,
468                              const ArgList &TCArgs,
469                              const char *LinkingOutput) const;
470  };
471}
472  /// minix -- Directly call GNU Binutils assembler and linker
473namespace minix {
474  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
475  public:
476    Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler",
477                                         TC) {}
478
479    virtual bool hasIntegratedCPP() const { return false; }
480
481    virtual void ConstructJob(Compilation &C, const JobAction &JA,
482                              const InputInfo &Output,
483                              const InputInfoList &Inputs,
484                              const ArgList &TCArgs,
485                              const char *LinkingOutput) const;
486  };
487  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
488  public:
489    Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {}
490
491    virtual bool hasIntegratedCPP() const { return false; }
492    virtual bool isLinkJob() const { return true; }
493
494    virtual void ConstructJob(Compilation &C, const JobAction &JA,
495                              const InputInfo &Output,
496                              const InputInfoList &Inputs,
497                              const ArgList &TCArgs,
498                              const char *LinkingOutput) const;
499  };
500} // end namespace minix
501
502  /// solaris -- Directly call Solaris assembler and linker
503namespace solaris {
504  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
505  public:
506    Assemble(const ToolChain &TC) : Tool("solaris::Assemble", "assembler",
507                                         TC) {}
508
509    virtual bool hasIntegratedCPP() const { return false; }
510
511    virtual void ConstructJob(Compilation &C, const JobAction &JA,
512                              const InputInfo &Output,
513                              const InputInfoList &Inputs,
514                              const ArgList &TCArgs,
515                              const char *LinkingOutput) const;
516  };
517  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
518  public:
519    Link(const ToolChain &TC) : Tool("solaris::Link", "linker", TC) {}
520
521    virtual bool hasIntegratedCPP() const { return false; }
522    virtual bool isLinkJob() const { return true; }
523
524    virtual void ConstructJob(Compilation &C, const JobAction &JA,
525                              const InputInfo &Output,
526                              const InputInfoList &Inputs,
527                              const ArgList &TCArgs,
528                              const char *LinkingOutput) const;
529  };
530} // end namespace solaris
531
532  /// auroraux -- Directly call GNU Binutils assembler and linker
533namespace auroraux {
534  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
535  public:
536    Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler",
537                                         TC) {}
538
539    virtual bool hasIntegratedCPP() const { return false; }
540
541    virtual void ConstructJob(Compilation &C, const JobAction &JA,
542                              const InputInfo &Output,
543                              const InputInfoList &Inputs,
544                              const ArgList &TCArgs,
545                              const char *LinkingOutput) const;
546  };
547  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
548  public:
549    Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {}
550
551    virtual bool hasIntegratedCPP() const { return false; }
552    virtual bool isLinkJob() const { return true; }
553
554    virtual void ConstructJob(Compilation &C, const JobAction &JA,
555                              const InputInfo &Output,
556                              const InputInfoList &Inputs,
557                              const ArgList &TCArgs,
558                              const char *LinkingOutput) const;
559  };
560} // end namespace auroraux
561
562  /// dragonfly -- Directly call GNU Binutils assembler and linker
563namespace dragonfly {
564  class LLVM_LIBRARY_VISIBILITY Assemble : public Tool  {
565  public:
566    Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler",
567                                         TC) {}
568
569    virtual bool hasIntegratedCPP() const { return false; }
570
571    virtual void ConstructJob(Compilation &C, const JobAction &JA,
572                              const InputInfo &Output,
573                              const InputInfoList &Inputs,
574                              const ArgList &TCArgs,
575                              const char *LinkingOutput) const;
576  };
577  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
578  public:
579    Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {}
580
581    virtual bool hasIntegratedCPP() const { return false; }
582    virtual bool isLinkJob() const { return true; }
583
584    virtual void ConstructJob(Compilation &C, const JobAction &JA,
585                              const InputInfo &Output,
586                              const InputInfoList &Inputs,
587                              const ArgList &TCArgs,
588                              const char *LinkingOutput) const;
589  };
590} // end namespace dragonfly
591
592  /// Visual studio tools.
593namespace visualstudio {
594  class LLVM_LIBRARY_VISIBILITY Link : public Tool  {
595  public:
596    Link(const ToolChain &TC) : Tool("visualstudio::Link", "linker", TC) {}
597
598    virtual bool hasIntegratedCPP() const { return false; }
599    virtual bool isLinkJob() const { return true; }
600
601    virtual void ConstructJob(Compilation &C, const JobAction &JA,
602                              const InputInfo &Output,
603                              const InputInfoList &Inputs,
604                              const ArgList &TCArgs,
605                              const char *LinkingOutput) const;
606  };
607} // end namespace visualstudio
608
609} // end namespace toolchains
610} // end namespace driver
611} // end namespace clang
612
613#endif // CLANG_LIB_DRIVER_TOOLS_H_
614