Tools.h revision 92dd1915842410005c68d32c43bb3b3cf5a4a702
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 LLVM_LIBRARY_VISIBILITY 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 void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 37 void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 38 void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 39 40 public: 41 Clang(const ToolChain &TC) : Tool("clang", TC) {} 42 43 virtual bool acceptsPipedInput() const { return true; } 44 virtual bool canPipeOutput() const { return true; } 45 virtual bool hasGoodDiagnostics() const { return true; } 46 virtual bool hasIntegratedAssembler() const { return true; } 47 virtual bool hasIntegratedCPP() const { return true; } 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 57 /// gcc - Generic GCC tool implementations. 58namespace gcc { 59 class LLVM_LIBRARY_VISIBILITY Common : public Tool { 60 public: 61 Common(const char *Name, const ToolChain &TC) : Tool(Name, TC) {} 62 63 virtual void ConstructJob(Compilation &C, const JobAction &JA, 64 Job &Dest, 65 const InputInfo &Output, 66 const InputInfoList &Inputs, 67 const ArgList &TCArgs, 68 const char *LinkingOutput) const; 69 70 /// RenderExtraToolArgs - Render any arguments necessary to force 71 /// the particular tool mode. 72 virtual void RenderExtraToolArgs(const JobAction &JA, 73 ArgStringList &CmdArgs) const = 0; 74 }; 75 76 77 class LLVM_LIBRARY_VISIBILITY Preprocess : public Common { 78 public: 79 Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", TC) {} 80 81 virtual bool acceptsPipedInput() const { return true; } 82 virtual bool canPipeOutput() const { return true; } 83 virtual bool hasGoodDiagnostics() const { return true; } 84 virtual bool hasIntegratedCPP() const { return false; } 85 86 virtual void RenderExtraToolArgs(const JobAction &JA, 87 ArgStringList &CmdArgs) const; 88 }; 89 90 class LLVM_LIBRARY_VISIBILITY Precompile : public Common { 91 public: 92 Precompile(const ToolChain &TC) : Common("gcc::Precompile", TC) {} 93 94 virtual bool acceptsPipedInput() const { return true; } 95 virtual bool canPipeOutput() const { return false; } 96 virtual bool hasGoodDiagnostics() const { return true; } 97 virtual bool hasIntegratedCPP() const { return true; } 98 99 virtual void RenderExtraToolArgs(const JobAction &JA, 100 ArgStringList &CmdArgs) const; 101 }; 102 103 class LLVM_LIBRARY_VISIBILITY Compile : public Common { 104 public: 105 Compile(const ToolChain &TC) : Common("gcc::Compile", TC) {} 106 107 virtual bool acceptsPipedInput() const { return true; } 108 virtual bool canPipeOutput() const { return true; } 109 virtual bool hasGoodDiagnostics() const { return true; } 110 virtual bool hasIntegratedCPP() const { return true; } 111 112 virtual void RenderExtraToolArgs(const JobAction &JA, 113 ArgStringList &CmdArgs) const; 114 }; 115 116 class LLVM_LIBRARY_VISIBILITY Assemble : public Common { 117 public: 118 Assemble(const ToolChain &TC) : Common("gcc::Assemble", TC) {} 119 120 virtual bool acceptsPipedInput() const { return true; } 121 virtual bool canPipeOutput() const { return false; } 122 virtual bool hasIntegratedCPP() const { return false; } 123 124 virtual void RenderExtraToolArgs(const JobAction &JA, 125 ArgStringList &CmdArgs) const; 126 }; 127 128 class LLVM_LIBRARY_VISIBILITY Link : public Common { 129 public: 130 Link(const ToolChain &TC) : Common("gcc::Link", TC) {} 131 132 virtual bool acceptsPipedInput() const { return false; } 133 virtual bool canPipeOutput() const { return false; } 134 virtual bool hasIntegratedCPP() const { return false; } 135 136 virtual void RenderExtraToolArgs(const JobAction &JA, 137 ArgStringList &CmdArgs) const; 138 }; 139} // end namespace gcc 140 141namespace darwin { 142 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool { 143 protected: 144 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const; 145 146 const toolchains::Darwin &getDarwinToolChain() const { 147 return reinterpret_cast<const toolchains::Darwin&>(getToolChain()); 148 } 149 150 public: 151 DarwinTool(const char *Name, const ToolChain &TC) : Tool(Name, TC) {} 152 }; 153 154 class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool { 155 public: 156 static const char *getBaseInputName(const ArgList &Args, 157 const InputInfoList &Input); 158 static const char *getBaseInputStem(const ArgList &Args, 159 const InputInfoList &Input); 160 static const char *getDependencyFileName(const ArgList &Args, 161 const InputInfoList &Inputs); 162 163 protected: 164 const char *getCC1Name(types::ID Type) const; 165 166 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const; 167 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 168 const InputInfoList &Inputs, 169 const ArgStringList &OutputArgs) const; 170 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 171 const InputInfoList &Inputs, 172 const ArgStringList &OutputArgs) const; 173 void AddCPPUniqueOptionsArgs(const ArgList &Args, 174 ArgStringList &CmdArgs, 175 const InputInfoList &Inputs) const; 176 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 177 178 public: 179 CC1(const char *Name, const ToolChain &TC) : DarwinTool(Name, TC) {} 180 181 virtual bool acceptsPipedInput() const { return true; } 182 virtual bool canPipeOutput() const { return true; } 183 virtual bool hasGoodDiagnostics() const { return true; } 184 virtual bool hasIntegratedCPP() const { return true; } 185 }; 186 187 class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1 { 188 public: 189 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", TC) {} 190 191 virtual void ConstructJob(Compilation &C, const JobAction &JA, 192 Job &Dest, 193 const InputInfo &Output, 194 const InputInfoList &Inputs, 195 const ArgList &TCArgs, 196 const char *LinkingOutput) const; 197 }; 198 199 class LLVM_LIBRARY_VISIBILITY Compile : public CC1 { 200 public: 201 Compile(const ToolChain &TC) : CC1("darwin::Compile", TC) {} 202 203 virtual void ConstructJob(Compilation &C, const JobAction &JA, 204 Job &Dest, 205 const InputInfo &Output, 206 const InputInfoList &Inputs, 207 const ArgList &TCArgs, 208 const char *LinkingOutput) const; 209 }; 210 211 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool { 212 public: 213 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", TC) {} 214 215 virtual bool acceptsPipedInput() const { return true; } 216 virtual bool canPipeOutput() const { return false; } 217 virtual bool hasIntegratedCPP() const { return false; } 218 219 virtual void ConstructJob(Compilation &C, const JobAction &JA, 220 Job &Dest, 221 const InputInfo &Output, 222 const InputInfoList &Inputs, 223 const ArgList &TCArgs, 224 const char *LinkingOutput) const; 225 }; 226 227 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool { 228 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 229 230 public: 231 Link(const ToolChain &TC) : DarwinTool("darwin::Link", TC) {} 232 233 virtual bool acceptsPipedInput() const { return false; } 234 virtual bool canPipeOutput() const { return false; } 235 virtual bool hasIntegratedCPP() const { return false; } 236 237 virtual void ConstructJob(Compilation &C, const JobAction &JA, 238 Job &Dest, 239 const InputInfo &Output, 240 const InputInfoList &Inputs, 241 const ArgList &TCArgs, 242 const char *LinkingOutput) const; 243 }; 244 245 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool { 246 public: 247 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", TC) {} 248 249 virtual bool acceptsPipedInput() const { return false; } 250 virtual bool canPipeOutput() const { return false; } 251 virtual bool hasIntegratedCPP() const { return false; } 252 253 virtual void ConstructJob(Compilation &C, const JobAction &JA, 254 Job &Dest, 255 const InputInfo &Output, 256 const InputInfoList &Inputs, 257 const ArgList &TCArgs, 258 const char *LinkingOutput) const; 259 }; 260} 261 262 /// openbsd -- Directly call GNU Binutils assembler and linker 263namespace openbsd { 264 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 265 public: 266 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", 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 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 280 public: 281 Link(const ToolChain &TC) : Tool("openbsd::Link", TC) {} 282 283 virtual bool acceptsPipedInput() const { return true; } 284 virtual bool canPipeOutput() const { return true; } 285 virtual bool hasIntegratedCPP() const { return false; } 286 287 virtual void ConstructJob(Compilation &C, const JobAction &JA, 288 Job &Dest, 289 const InputInfo &Output, 290 const InputInfoList &Inputs, 291 const ArgList &TCArgs, 292 const char *LinkingOutput) const; 293 }; 294} // end namespace openbsd 295 296 /// freebsd -- Directly call GNU Binutils assembler and linker 297namespace freebsd { 298 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 299 public: 300 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", 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 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 314 public: 315 Link(const ToolChain &TC) : Tool("freebsd::Link", TC) {} 316 317 virtual bool acceptsPipedInput() const { return true; } 318 virtual bool canPipeOutput() const { return true; } 319 virtual bool hasIntegratedCPP() const { return false; } 320 321 virtual void ConstructJob(Compilation &C, const JobAction &JA, 322 Job &Dest, 323 const InputInfo &Output, 324 const InputInfoList &Inputs, 325 const ArgList &TCArgs, 326 const char *LinkingOutput) const; 327 }; 328} // end namespace freebsd 329 330 /// auroraux -- Directly call GNU Binutils assembler and linker 331namespace auroraux { 332 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 333 public: 334 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", 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 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 348 public: 349 Link(const ToolChain &TC) : Tool("auroraux::Link", TC) {} 350 351 virtual bool acceptsPipedInput() const { return true; } 352 virtual bool canPipeOutput() const { return true; } 353 virtual bool hasIntegratedCPP() const { return false; } 354 355 virtual void ConstructJob(Compilation &C, const JobAction &JA, 356 Job &Dest, 357 const InputInfo &Output, 358 const InputInfoList &Inputs, 359 const ArgList &TCArgs, 360 const char *LinkingOutput) const; 361 }; 362} // end namespace auroraux 363 364 /// dragonfly -- Directly call GNU Binutils assembler and linker 365namespace dragonfly { 366 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 367 public: 368 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", 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 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 382 public: 383 Link(const ToolChain &TC) : Tool("dragonfly::Link", TC) {} 384 385 virtual bool acceptsPipedInput() const { return true; } 386 virtual bool canPipeOutput() const { return true; } 387 virtual bool hasIntegratedCPP() const { return false; } 388 389 virtual void ConstructJob(Compilation &C, const JobAction &JA, 390 Job &Dest, 391 const InputInfo &Output, 392 const InputInfoList &Inputs, 393 const ArgList &TCArgs, 394 const char *LinkingOutput) const; 395 }; 396} // end namespace dragonfly 397 398} // end namespace toolchains 399} // end namespace driver 400} // end namespace clang 401 402#endif // CLANG_LIB_DRIVER_TOOLS_H_ 403