Tools.h revision 68a31d406c6dc4382c700d1199b062de2aa7e1da
1//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef CLANG_LIB_DRIVER_TOOLS_H_ 11#define CLANG_LIB_DRIVER_TOOLS_H_ 12 13#include "clang/Driver/Tool.h" 14#include "clang/Driver/Types.h" 15#include "clang/Driver/Util.h" 16 17#include "llvm/Support/Compiler.h" 18 19namespace clang { 20namespace driver { 21namespace toolchains { 22 class Darwin_X86; 23} 24 25namespace tools { 26 27 class VISIBILITY_HIDDEN Clang : public Tool { 28 public: 29 Clang(const ToolChain &TC) : Tool("clang", TC) {} 30 31 virtual bool acceptsPipedInput() const { return true; } 32 virtual bool canPipeOutput() const { return true; } 33 virtual bool hasIntegratedCPP() const { return true; } 34 35 virtual void ConstructJob(Compilation &C, const JobAction &JA, 36 Job &Dest, 37 const InputInfo &Output, 38 const InputInfoList &Inputs, 39 const ArgList &TCArgs, 40 const char *LinkingOutput) const; 41 }; 42 43 /// gcc - Generic GCC tool implementations. 44namespace gcc { 45 class VISIBILITY_HIDDEN Common : public Tool { 46 public: 47 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {} 48 49 virtual void ConstructJob(Compilation &C, const JobAction &JA, 50 Job &Dest, 51 const InputInfo &Output, 52 const InputInfoList &Inputs, 53 const ArgList &TCArgs, 54 const char *LinkingOutput) const; 55 56 /// RenderExtraToolArgs - Render any arguments necessary to force 57 /// the particular tool mode. 58 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0; 59 }; 60 61 62 class VISIBILITY_HIDDEN Preprocess : public Common { 63 public: 64 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {} 65 66 virtual bool acceptsPipedInput() const { return true; } 67 virtual bool canPipeOutput() const { return true; } 68 virtual bool hasIntegratedCPP() const { return false; } 69 70 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 71 }; 72 73 class VISIBILITY_HIDDEN Precompile : public Common { 74 public: 75 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {} 76 77 virtual bool acceptsPipedInput() const { return true; } 78 virtual bool canPipeOutput() const { return false; } 79 virtual bool hasIntegratedCPP() const { return true; } 80 81 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 82 }; 83 84 class VISIBILITY_HIDDEN Compile : public Common { 85 public: 86 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {} 87 88 virtual bool acceptsPipedInput() const { return true; } 89 virtual bool canPipeOutput() const { return true; } 90 virtual bool hasIntegratedCPP() const { return true; } 91 92 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 93 }; 94 95 class VISIBILITY_HIDDEN Assemble : public Common { 96 public: 97 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {} 98 99 virtual bool acceptsPipedInput() const { return true; } 100 virtual bool canPipeOutput() const { return false; } 101 virtual bool hasIntegratedCPP() const { return false; } 102 103 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 104 }; 105 106 class VISIBILITY_HIDDEN Link : public Common { 107 public: 108 Link(const ToolChain &TC) : Common("gcc::Link", TC) {} 109 110 virtual bool acceptsPipedInput() const { return false; } 111 virtual bool canPipeOutput() const { return false; } 112 virtual bool hasIntegratedCPP() const { return false; } 113 114 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 115 }; 116} // end namespace gcc 117 118namespace darwin { 119 class VISIBILITY_HIDDEN CC1 : public Tool { 120 public: 121 static const char *getBaseInputName(const ArgList &Args, 122 const InputInfoList &Input); 123 static const char *getBaseInputStem(const ArgList &Args, 124 const InputInfoList &Input); 125 static const char *getDependencyFileName(const ArgList &Args, 126 const InputInfoList &Inputs); 127 128 protected: 129 const char *getCC1Name(types::ID Type) const; 130 131 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const; 132 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 133 const InputInfoList &Inputs, 134 const ArgStringList &OutputArgs) const; 135 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 136 const InputInfoList &Inputs, 137 const ArgStringList &OutputArgs) const; 138 void AddCPPUniqueOptionsArgs(const ArgList &Args, 139 ArgStringList &CmdArgs, 140 const InputInfoList &Inputs) const; 141 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 142 143 public: 144 CC1(const char *Name, const ToolChain &TC) : Tool(Name, TC) {} 145 146 virtual bool acceptsPipedInput() const { return true; } 147 virtual bool canPipeOutput() const { return true; } 148 virtual bool hasIntegratedCPP() const { return true; } 149 }; 150 151 class VISIBILITY_HIDDEN Preprocess : public CC1 { 152 public: 153 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {} 154 155 virtual void ConstructJob(Compilation &C, const JobAction &JA, 156 Job &Dest, 157 const InputInfo &Output, 158 const InputInfoList &Inputs, 159 const ArgList &TCArgs, 160 const char *LinkingOutput) const; 161 }; 162 163 class VISIBILITY_HIDDEN Compile : public CC1 { 164 public: 165 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {} 166 167 virtual void ConstructJob(Compilation &C, const JobAction &JA, 168 Job &Dest, 169 const InputInfo &Output, 170 const InputInfoList &Inputs, 171 const ArgList &TCArgs, 172 const char *LinkingOutput) const; 173 }; 174 175 class VISIBILITY_HIDDEN Assemble : public Tool { 176 public: 177 Assemble(const ToolChain &TC) : Tool("darwin::Assemble", TC) {} 178 179 virtual bool acceptsPipedInput() const { return true; } 180 virtual bool canPipeOutput() const { return false; } 181 virtual bool hasIntegratedCPP() const { return false; } 182 183 virtual void ConstructJob(Compilation &C, const JobAction &JA, 184 Job &Dest, 185 const InputInfo &Output, 186 const InputInfoList &Inputs, 187 const ArgList &TCArgs, 188 const char *LinkingOutput) const; 189 }; 190 191 class VISIBILITY_HIDDEN Link : public Tool { 192 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const; 193 void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const; 194 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 195 196 /// The default macosx-version-min. 197 const char *MacosxVersionMin; 198 199 const toolchains::Darwin_X86 &getDarwinToolChain() const; 200 201 public: 202 Link(const ToolChain &TC, 203 const char *_MacosxVersionMin) 204 : Tool("darwin::Link", TC), MacosxVersionMin(_MacosxVersionMin) { 205 } 206 207 virtual bool acceptsPipedInput() const { return false; } 208 virtual bool canPipeOutput() const { return false; } 209 virtual bool hasIntegratedCPP() const { return false; } 210 211 virtual void ConstructJob(Compilation &C, const JobAction &JA, 212 Job &Dest, 213 const InputInfo &Output, 214 const InputInfoList &Inputs, 215 const ArgList &TCArgs, 216 const char *LinkingOutput) const; 217 }; 218 219 class VISIBILITY_HIDDEN Lipo : public Tool { 220 public: 221 Lipo(const ToolChain &TC) : Tool("darwin::Lipo", TC) {} 222 223 virtual bool acceptsPipedInput() const { return false; } 224 virtual bool canPipeOutput() const { return false; } 225 virtual bool hasIntegratedCPP() const { return false; } 226 227 virtual void ConstructJob(Compilation &C, const JobAction &JA, 228 Job &Dest, 229 const InputInfo &Output, 230 const InputInfoList &Inputs, 231 const ArgList &TCArgs, 232 const char *LinkingOutput) const; 233 }; 234} 235 236 /// freebsd -- Directly call GNU Binutils assembler and linker 237namespace freebsd { 238 class VISIBILITY_HIDDEN Assemble : public Tool { 239 public: 240 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {} 241 242 virtual bool acceptsPipedInput() const { return true; } 243 virtual bool canPipeOutput() const { return true; } 244 virtual bool hasIntegratedCPP() const { return false; } 245 246 virtual void ConstructJob(Compilation &C, const JobAction &JA, 247 Job &Dest, 248 const InputInfo &Output, 249 const InputInfoList &Inputs, 250 const ArgList &TCArgs, 251 const char *LinkingOutput) const; 252 }; 253} 254 255} // end namespace toolchains 256} // end namespace driver 257} // end namespace clang 258 259#endif 260