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