Tools.h revision fbefe6bd6f62a3361813498dc672ab0d6c0d4fd1
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 { 21 class Driver; 22 23namespace toolchains { 24 class Darwin; 25} 26 27namespace tools { 28 29 class VISIBILITY_HIDDEN Clang : public Tool { 30 void AddPreprocessingOptions(const Driver &D, 31 const ArgList &Args, 32 ArgStringList &CmdArgs, 33 const InputInfo &Output, 34 const InputInfoList &Inputs) const; 35 36 public: 37 Clang(const ToolChain &TC) : Tool("clang", TC) {} 38 39 virtual bool acceptsPipedInput() const { return true; } 40 virtual bool canPipeOutput() const { return true; } 41 virtual bool hasIntegratedCPP() const { return true; } 42 43 virtual void ConstructJob(Compilation &C, const JobAction &JA, 44 Job &Dest, 45 const InputInfo &Output, 46 const InputInfoList &Inputs, 47 const ArgList &TCArgs, 48 const char *LinkingOutput) const; 49 }; 50 51 /// gcc - Generic GCC tool implementations. 52namespace gcc { 53 class VISIBILITY_HIDDEN Common : public Tool { 54 public: 55 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {} 56 57 virtual void ConstructJob(Compilation &C, const JobAction &JA, 58 Job &Dest, 59 const InputInfo &Output, 60 const InputInfoList &Inputs, 61 const ArgList &TCArgs, 62 const char *LinkingOutput) const; 63 64 /// RenderExtraToolArgs - Render any arguments necessary to force 65 /// the particular tool mode. 66 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const = 0; 67 }; 68 69 70 class VISIBILITY_HIDDEN Preprocess : public Common { 71 public: 72 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {} 73 74 virtual bool acceptsPipedInput() const { return true; } 75 virtual bool canPipeOutput() const { return true; } 76 virtual bool hasIntegratedCPP() const { return false; } 77 78 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 79 }; 80 81 class VISIBILITY_HIDDEN Precompile : public Common { 82 public: 83 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {} 84 85 virtual bool acceptsPipedInput() const { return true; } 86 virtual bool canPipeOutput() const { return false; } 87 virtual bool hasIntegratedCPP() const { return true; } 88 89 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 90 }; 91 92 class VISIBILITY_HIDDEN Compile : public Common { 93 public: 94 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {} 95 96 virtual bool acceptsPipedInput() const { return true; } 97 virtual bool canPipeOutput() const { return true; } 98 virtual bool hasIntegratedCPP() const { return true; } 99 100 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 101 }; 102 103 class VISIBILITY_HIDDEN Assemble : public Common { 104 public: 105 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {} 106 107 virtual bool acceptsPipedInput() const { return true; } 108 virtual bool canPipeOutput() const { return false; } 109 virtual bool hasIntegratedCPP() const { return false; } 110 111 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 112 }; 113 114 class VISIBILITY_HIDDEN Link : public Common { 115 public: 116 Link(const ToolChain &TC) : Common("gcc::Link", TC) {} 117 118 virtual bool acceptsPipedInput() const { return false; } 119 virtual bool canPipeOutput() const { return false; } 120 virtual bool hasIntegratedCPP() const { return false; } 121 122 virtual void RenderExtraToolArgs(ArgStringList &CmdArgs) const; 123 }; 124} // end namespace gcc 125 126namespace darwin { 127 class VISIBILITY_HIDDEN DarwinTool : public Tool { 128 protected: 129 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const; 130 void AddDarwinSubArch(const ArgList &Args, ArgStringList &CmdArgs) const; 131 132 const toolchains::Darwin &getDarwinToolChain() const { 133 return reinterpret_cast<const toolchains::Darwin&>(getToolChain()); 134 } 135 136 public: 137 DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {}; 138 }; 139 140 class VISIBILITY_HIDDEN CC1 : public DarwinTool { 141 public: 142 static const char *getBaseInputName(const ArgList &Args, 143 const InputInfoList &Input); 144 static const char *getBaseInputStem(const ArgList &Args, 145 const InputInfoList &Input); 146 static const char *getDependencyFileName(const ArgList &Args, 147 const InputInfoList &Inputs); 148 149 protected: 150 const char *getCC1Name(types::ID Type) const; 151 152 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const; 153 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 154 const InputInfoList &Inputs, 155 const ArgStringList &OutputArgs) const; 156 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 157 const InputInfoList &Inputs, 158 const ArgStringList &OutputArgs) const; 159 void AddCPPUniqueOptionsArgs(const ArgList &Args, 160 ArgStringList &CmdArgs, 161 const InputInfoList &Inputs) const; 162 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 163 164 public: 165 CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {} 166 167 virtual bool acceptsPipedInput() const { return true; } 168 virtual bool canPipeOutput() const { return true; } 169 virtual bool hasIntegratedCPP() const { return true; } 170 }; 171 172 class VISIBILITY_HIDDEN Preprocess : public CC1 { 173 public: 174 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {} 175 176 virtual void ConstructJob(Compilation &C, const JobAction &JA, 177 Job &Dest, 178 const InputInfo &Output, 179 const InputInfoList &Inputs, 180 const ArgList &TCArgs, 181 const char *LinkingOutput) const; 182 }; 183 184 class VISIBILITY_HIDDEN Compile : public CC1 { 185 public: 186 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {} 187 188 virtual void ConstructJob(Compilation &C, const JobAction &JA, 189 Job &Dest, 190 const InputInfo &Output, 191 const InputInfoList &Inputs, 192 const ArgList &TCArgs, 193 const char *LinkingOutput) const; 194 }; 195 196 class VISIBILITY_HIDDEN Assemble : public DarwinTool { 197 public: 198 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {} 199 200 virtual bool acceptsPipedInput() const { return true; } 201 virtual bool canPipeOutput() const { return false; } 202 virtual bool hasIntegratedCPP() const { return false; } 203 204 virtual void ConstructJob(Compilation &C, const JobAction &JA, 205 Job &Dest, 206 const InputInfo &Output, 207 const InputInfoList &Inputs, 208 const ArgList &TCArgs, 209 const char *LinkingOutput) const; 210 }; 211 212 class VISIBILITY_HIDDEN Link : public DarwinTool { 213 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 214 215 public: 216 Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {} 217 218 virtual bool acceptsPipedInput() const { return false; } 219 virtual bool canPipeOutput() const { return false; } 220 virtual bool hasIntegratedCPP() const { return false; } 221 222 virtual void ConstructJob(Compilation &C, const JobAction &JA, 223 Job &Dest, 224 const InputInfo &Output, 225 const InputInfoList &Inputs, 226 const ArgList &TCArgs, 227 const char *LinkingOutput) const; 228 }; 229 230 class VISIBILITY_HIDDEN Lipo : public DarwinTool { 231 public: 232 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {} 233 234 virtual bool acceptsPipedInput() const { return false; } 235 virtual bool canPipeOutput() const { return false; } 236 virtual bool hasIntegratedCPP() const { return false; } 237 238 virtual void ConstructJob(Compilation &C, const JobAction &JA, 239 Job &Dest, 240 const InputInfo &Output, 241 const InputInfoList &Inputs, 242 const ArgList &TCArgs, 243 const char *LinkingOutput) const; 244 }; 245} 246 247 /// openbsd -- Directly call GNU Binutils assembler and linker 248namespace openbsd { 249 class VISIBILITY_HIDDEN Assemble : public Tool { 250 public: 251 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", TC) {} 252 253 virtual bool acceptsPipedInput() const { return true; } 254 virtual bool canPipeOutput() const { return true; } 255 virtual bool hasIntegratedCPP() const { return false; } 256 257 virtual void ConstructJob(Compilation &C, const JobAction &JA, 258 Job &Dest, 259 const InputInfo &Output, 260 const InputInfoList &Inputs, 261 const ArgList &TCArgs, 262 const char *LinkingOutput) const; 263 }; 264 class VISIBILITY_HIDDEN Link : public Tool { 265 public: 266 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {} 267 268 virtual bool acceptsPipedInput() const { return true; } 269 virtual bool canPipeOutput() const { return true; } 270 virtual bool hasIntegratedCPP() const { return false; } 271 272 virtual void ConstructJob(Compilation &C, const JobAction &JA, 273 Job &Dest, 274 const InputInfo &Output, 275 const InputInfoList &Inputs, 276 const ArgList &TCArgs, 277 const char *LinkingOutput) const; 278 }; 279} // end namespace openbsd 280 281 /// freebsd -- Directly call GNU Binutils assembler and linker 282namespace freebsd { 283 class VISIBILITY_HIDDEN Assemble : public Tool { 284 public: 285 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", TC) {} 286 287 virtual bool acceptsPipedInput() const { return true; } 288 virtual bool canPipeOutput() const { return true; } 289 virtual bool hasIntegratedCPP() const { return false; } 290 291 virtual void ConstructJob(Compilation &C, const JobAction &JA, 292 Job &Dest, 293 const InputInfo &Output, 294 const InputInfoList &Inputs, 295 const ArgList &TCArgs, 296 const char *LinkingOutput) const; 297 }; 298 class VISIBILITY_HIDDEN Link : public Tool { 299 public: 300 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {} 301 302 virtual bool acceptsPipedInput() const { return true; } 303 virtual bool canPipeOutput() const { return true; } 304 virtual bool hasIntegratedCPP() const { return false; } 305 306 virtual void ConstructJob(Compilation &C, const JobAction &JA, 307 Job &Dest, 308 const InputInfo &Output, 309 const InputInfoList &Inputs, 310 const ArgList &TCArgs, 311 const char *LinkingOutput) const; 312 }; 313} // end namespace freebsd 314 315 /// auroraux -- Directly call GNU Binutils assembler and linker 316namespace auroraux { 317 class VISIBILITY_HIDDEN Assemble : public Tool { 318 public: 319 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", TC) {} 320 321 virtual bool acceptsPipedInput() const { return true; } 322 virtual bool canPipeOutput() const { return true; } 323 virtual bool hasIntegratedCPP() const { return false; } 324 325 virtual void ConstructJob(Compilation &C, const JobAction &JA, 326 Job &Dest, 327 const InputInfo &Output, 328 const InputInfoList &Inputs, 329 const ArgList &TCArgs, 330 const char *LinkingOutput) const; 331 }; 332 class VISIBILITY_HIDDEN Link : public Tool { 333 public: 334 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {} 335 336 virtual bool acceptsPipedInput() const { return true; } 337 virtual bool canPipeOutput() const { return true; } 338 virtual bool hasIntegratedCPP() const { return false; } 339 340 virtual void ConstructJob(Compilation &C, const JobAction &JA, 341 Job &Dest, 342 const InputInfo &Output, 343 const InputInfoList &Inputs, 344 const ArgList &TCArgs, 345 const char *LinkingOutput) const; 346 }; 347} // end namespace auroraux 348 349 /// dragonfly -- Directly call GNU Binutils assembler and linker 350namespace dragonfly { 351 class VISIBILITY_HIDDEN Assemble : public Tool { 352 public: 353 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", TC) {} 354 355 virtual bool acceptsPipedInput() const { return true; } 356 virtual bool canPipeOutput() const { return true; } 357 virtual bool hasIntegratedCPP() const { return false; } 358 359 virtual void ConstructJob(Compilation &C, const JobAction &JA, 360 Job &Dest, 361 const InputInfo &Output, 362 const InputInfoList &Inputs, 363 const ArgList &TCArgs, 364 const char *LinkingOutput) const; 365 }; 366 class VISIBILITY_HIDDEN Link : public Tool { 367 public: 368 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {} 369 370 virtual bool acceptsPipedInput() const { return true; } 371 virtual bool canPipeOutput() const { return true; } 372 virtual bool hasIntegratedCPP() const { return false; } 373 374 virtual void ConstructJob(Compilation &C, const JobAction &JA, 375 Job &Dest, 376 const InputInfo &Output, 377 const InputInfoList &Inputs, 378 const ArgList &TCArgs, 379 const char *LinkingOutput) const; 380 }; 381} // end namespace dragonfly 382 383} // end namespace toolchains 384} // end namespace driver 385} // end namespace clang 386 387#endif // CLANG_LIB_DRIVER_TOOLS_H_ 388