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