Tools.h revision 2fe238ed293bd4bc27af9beb9fa151fad2146fa8
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//===--- Tools.h - Tool Implementations -------------------------*- C++ -*-===// 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The LLVM Compiler Infrastructure 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file is distributed under the University of Illinois Open Source 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// License. See LICENSE.TXT for details. 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 85f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)//===----------------------------------------------------------------------===// 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 10eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#ifndef CLANG_LIB_DRIVER_TOOLS_H_ 11ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch#define CLANG_LIB_DRIVER_TOOLS_H_ 12eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 13eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "clang/Driver/Tool.h" 14eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "clang/Driver/Types.h" 15eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "clang/Driver/Util.h" 16eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 17eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "llvm/Support/Compiler.h" 18eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace clang { 20eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace driver { 21eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch class Driver; 22eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 23eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace toolchains { 24ca12bfac764ba476d6cd062bf1dde12cc64c3f40Ben Murdoch class Darwin; 25eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch} 26eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 27eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace tools { 282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Clang compiler tool. 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class LLVM_LIBRARY_VISIBILITY Clang : public Tool { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void AddPreprocessingOptions(const Driver &D, 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ArgList &Args, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ArgStringList &CmdArgs, 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const InputInfo &Output, 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const InputInfoList &Inputs) const; 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddARMTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddMIPSTargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void AddX86TargetArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Clang(const ToolChain &TC) : Tool("clang", "clang frontend", TC) {} 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool hasGoodDiagnostics() const { return true; } 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool hasIntegratedAssembler() const { return true; } 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool hasIntegratedCPP() const { return true; } 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void ConstructJob(Compilation &C, const JobAction &JA, 49c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const InputInfo &Output, 50c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const InputInfoList &Inputs, 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ArgList &TCArgs, 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const char *LinkingOutput) const; 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) }; 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) /// \brief Clang integrated assembler tool. 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) class LLVM_LIBRARY_VISIBILITY ClangAs : public Tool { 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ClangAs(const ToolChain &TC) : Tool("clang::as", 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) "clang integrated assembler", TC) {} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool hasGoodDiagnostics() const { return true; } 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool hasIntegratedAssembler() const { return false; } 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool hasIntegratedCPP() const { return false; } 64eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 65eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void ConstructJob(Compilation &C, const JobAction &JA, 66eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const InputInfo &Output, 67eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const InputInfoList &Inputs, 68eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ArgList &TCArgs, 69eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char *LinkingOutput) const; 70eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 71eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 72eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /// gcc - Generic GCC tool implementations. 73eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdochnamespace gcc { 74eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch class LLVM_LIBRARY_VISIBILITY Common : public Tool { 75eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public: 76eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch Common(const char *Name, const char *ShortName, 77eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ToolChain &TC) : Tool(Name, ShortName, TC) {} 78eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 79eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void ConstructJob(Compilation &C, const JobAction &JA, 80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const InputInfo &Output, 81eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const InputInfoList &Inputs, 82eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const ArgList &TCArgs, 83eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch const char *LinkingOutput) const; 84eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 85eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /// RenderExtraToolArgs - Render any arguments necessary to force 86eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch /// the particular tool mode. 87eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch virtual void RenderExtraToolArgs(const JobAction &JA, 88eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch ArgStringList &CmdArgs) const = 0; 89eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch }; 90eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 91eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 92eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch class LLVM_LIBRARY_VISIBILITY Preprocess : public Common { 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Preprocess(const ToolChain &TC) : Common("gcc::Preprocess", 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "gcc preprocessor", TC) {} 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool hasGoodDiagnostics() const { return true; } 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual bool hasIntegratedCPP() const { return false; } 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 100 virtual void RenderExtraToolArgs(const JobAction &JA, 101 ArgStringList &CmdArgs) const; 102 }; 103 104 class LLVM_LIBRARY_VISIBILITY Precompile : public Common { 105 public: 106 Precompile(const ToolChain &TC) : Common("gcc::Precompile", 107 "gcc precompile", TC) {} 108 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 Compile : public Common { 117 public: 118 Compile(const ToolChain &TC) : Common("gcc::Compile", 119 "gcc frontend", TC) {} 120 121 virtual bool hasGoodDiagnostics() const { return true; } 122 virtual bool hasIntegratedCPP() const { return true; } 123 124 virtual void RenderExtraToolArgs(const JobAction &JA, 125 ArgStringList &CmdArgs) const; 126 }; 127 128 class LLVM_LIBRARY_VISIBILITY Assemble : public Common { 129 public: 130 Assemble(const ToolChain &TC) : Common("gcc::Assemble", 131 "assembler (via gcc)", TC) {} 132 133 virtual bool hasIntegratedCPP() const { return false; } 134 135 virtual void RenderExtraToolArgs(const JobAction &JA, 136 ArgStringList &CmdArgs) const; 137 }; 138 139 class LLVM_LIBRARY_VISIBILITY Link : public Common { 140 public: 141 Link(const ToolChain &TC) : Common("gcc::Link", 142 "linker (via gcc)", TC) {} 143 144 virtual bool hasIntegratedCPP() const { return false; } 145 146 virtual void RenderExtraToolArgs(const JobAction &JA, 147 ArgStringList &CmdArgs) const; 148 }; 149} // end namespace gcc 150 151namespace darwin { 152 class LLVM_LIBRARY_VISIBILITY DarwinTool : public Tool { 153 protected: 154 void AddDarwinArch(const ArgList &Args, ArgStringList &CmdArgs) const; 155 156 const toolchains::Darwin &getDarwinToolChain() const { 157 return reinterpret_cast<const toolchains::Darwin&>(getToolChain()); 158 } 159 160 public: 161 DarwinTool(const char *Name, const char *ShortName, 162 const ToolChain &TC) : Tool(Name, ShortName, TC) {} 163 }; 164 165 class LLVM_LIBRARY_VISIBILITY CC1 : public DarwinTool { 166 public: 167 static const char *getBaseInputName(const ArgList &Args, 168 const InputInfoList &Input); 169 static const char *getBaseInputStem(const ArgList &Args, 170 const InputInfoList &Input); 171 static const char *getDependencyFileName(const ArgList &Args, 172 const InputInfoList &Inputs); 173 174 protected: 175 const char *getCC1Name(types::ID Type) const; 176 177 void AddCC1Args(const ArgList &Args, ArgStringList &CmdArgs) const; 178 void AddCC1OptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 179 const InputInfoList &Inputs, 180 const ArgStringList &OutputArgs) const; 181 void AddCPPOptionsArgs(const ArgList &Args, ArgStringList &CmdArgs, 182 const InputInfoList &Inputs, 183 const ArgStringList &OutputArgs) const; 184 void AddCPPUniqueOptionsArgs(const ArgList &Args, 185 ArgStringList &CmdArgs, 186 const InputInfoList &Inputs) const; 187 void AddCPPArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 188 189 public: 190 CC1(const char *Name, const char *ShortName, 191 const ToolChain &TC) : DarwinTool(Name, ShortName, TC) {} 192 193 virtual bool hasGoodDiagnostics() const { return true; } 194 virtual bool hasIntegratedCPP() const { return true; } 195 }; 196 197 class LLVM_LIBRARY_VISIBILITY Preprocess : public CC1 { 198 public: 199 Preprocess(const ToolChain &TC) : CC1("darwin::Preprocess", 200 "gcc preprocessor", TC) {} 201 202 virtual void ConstructJob(Compilation &C, const JobAction &JA, 203 const InputInfo &Output, 204 const InputInfoList &Inputs, 205 const ArgList &TCArgs, 206 const char *LinkingOutput) const; 207 }; 208 209 class LLVM_LIBRARY_VISIBILITY Compile : public CC1 { 210 public: 211 Compile(const ToolChain &TC) : CC1("darwin::Compile", "gcc frontend", TC) {} 212 213 virtual void ConstructJob(Compilation &C, const JobAction &JA, 214 const InputInfo &Output, 215 const InputInfoList &Inputs, 216 const ArgList &TCArgs, 217 const char *LinkingOutput) const; 218 }; 219 220 class LLVM_LIBRARY_VISIBILITY Assemble : public DarwinTool { 221 public: 222 Assemble(const ToolChain &TC) : DarwinTool("darwin::Assemble", 223 "assembler", TC) {} 224 225 virtual bool hasIntegratedCPP() const { return false; } 226 227 virtual void ConstructJob(Compilation &C, const JobAction &JA, 228 const InputInfo &Output, 229 const InputInfoList &Inputs, 230 const ArgList &TCArgs, 231 const char *LinkingOutput) const; 232 }; 233 234 class LLVM_LIBRARY_VISIBILITY Link : public DarwinTool { 235 void AddLinkArgs(const ArgList &Args, ArgStringList &CmdArgs) const; 236 237 public: 238 Link(const ToolChain &TC) : DarwinTool("darwin::Link", "linker", TC) {} 239 240 virtual bool hasIntegratedCPP() const { return false; } 241 242 virtual void ConstructJob(Compilation &C, const JobAction &JA, 243 const InputInfo &Output, 244 const InputInfoList &Inputs, 245 const ArgList &TCArgs, 246 const char *LinkingOutput) const; 247 }; 248 249 class LLVM_LIBRARY_VISIBILITY Lipo : public DarwinTool { 250 public: 251 Lipo(const ToolChain &TC) : DarwinTool("darwin::Lipo", "lipo", TC) {} 252 253 virtual bool hasIntegratedCPP() const { return false; } 254 255 virtual void ConstructJob(Compilation &C, const JobAction &JA, 256 const InputInfo &Output, 257 const InputInfoList &Inputs, 258 const ArgList &TCArgs, 259 const char *LinkingOutput) const; 260 }; 261 262 class LLVM_LIBRARY_VISIBILITY Dsymutil : public DarwinTool { 263 public: 264 Dsymutil(const ToolChain &TC) : DarwinTool("darwin::Dsymutil", 265 "dsymutil", TC) {} 266 267 virtual bool hasIntegratedCPP() const { return false; } 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 277 /// openbsd -- Directly call GNU Binutils assembler and linker 278namespace openbsd { 279 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 280 public: 281 Assemble(const ToolChain &TC) : Tool("openbsd::Assemble", "assembler", 282 TC) {} 283 284 virtual bool hasIntegratedCPP() const { return false; } 285 286 virtual void ConstructJob(Compilation &C, const JobAction &JA, 287 const InputInfo &Output, 288 const InputInfoList &Inputs, 289 const ArgList &TCArgs, 290 const char *LinkingOutput) const; 291 }; 292 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 293 public: 294 Link(const ToolChain &TC) : Tool("openbsd::Link", "linker", TC) {} 295 296 virtual bool hasIntegratedCPP() const { return false; } 297 298 virtual void ConstructJob(Compilation &C, const JobAction &JA, 299 const InputInfo &Output, 300 const InputInfoList &Inputs, 301 const ArgList &TCArgs, 302 const char *LinkingOutput) const; 303 }; 304} // end namespace openbsd 305 306 /// freebsd -- Directly call GNU Binutils assembler and linker 307namespace freebsd { 308 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 309 public: 310 Assemble(const ToolChain &TC) : Tool("freebsd::Assemble", "assembler", 311 TC) {} 312 313 virtual bool hasIntegratedCPP() const { return false; } 314 315 virtual void ConstructJob(Compilation &C, const JobAction &JA, 316 const InputInfo &Output, 317 const InputInfoList &Inputs, 318 const ArgList &TCArgs, 319 const char *LinkingOutput) const; 320 }; 321 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 322 public: 323 Link(const ToolChain &TC) : Tool("freebsd::Link", "linker", 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} // end namespace freebsd 334 335 /// minix -- Directly call GNU Binutils assembler and linker 336namespace minix { 337 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 338 public: 339 Assemble(const ToolChain &TC) : Tool("minix::Assemble", "assembler", 340 TC) {} 341 342 virtual bool hasIntegratedCPP() const { return false; } 343 344 virtual void ConstructJob(Compilation &C, const JobAction &JA, 345 const InputInfo &Output, 346 const InputInfoList &Inputs, 347 const ArgList &TCArgs, 348 const char *LinkingOutput) const; 349 }; 350 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 351 public: 352 Link(const ToolChain &TC) : Tool("minix::Link", "linker", TC) {} 353 354 virtual bool hasIntegratedCPP() const { return false; } 355 356 virtual void ConstructJob(Compilation &C, const JobAction &JA, 357 const InputInfo &Output, 358 const InputInfoList &Inputs, 359 const ArgList &TCArgs, 360 const char *LinkingOutput) const; 361 }; 362} // end namespace minix 363 364 /// auroraux -- Directly call GNU Binutils assembler and linker 365namespace auroraux { 366 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 367 public: 368 Assemble(const ToolChain &TC) : Tool("auroraux::Assemble", "assembler", 369 TC) {} 370 371 virtual bool hasIntegratedCPP() const { return false; } 372 373 virtual void ConstructJob(Compilation &C, const JobAction &JA, 374 const InputInfo &Output, 375 const InputInfoList &Inputs, 376 const ArgList &TCArgs, 377 const char *LinkingOutput) const; 378 }; 379 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 380 public: 381 Link(const ToolChain &TC) : Tool("auroraux::Link", "linker", TC) {} 382 383 virtual bool hasIntegratedCPP() const { return false; } 384 385 virtual void ConstructJob(Compilation &C, const JobAction &JA, 386 const InputInfo &Output, 387 const InputInfoList &Inputs, 388 const ArgList &TCArgs, 389 const char *LinkingOutput) const; 390 }; 391} // end namespace auroraux 392 393 /// dragonfly -- Directly call GNU Binutils assembler and linker 394namespace dragonfly { 395 class LLVM_LIBRARY_VISIBILITY Assemble : public Tool { 396 public: 397 Assemble(const ToolChain &TC) : Tool("dragonfly::Assemble", "assembler", 398 TC) {} 399 400 virtual bool hasIntegratedCPP() const { return false; } 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 class LLVM_LIBRARY_VISIBILITY Link : public Tool { 409 public: 410 Link(const ToolChain &TC) : Tool("dragonfly::Link", "linker", TC) {} 411 412 virtual bool hasIntegratedCPP() const { return false; } 413 414 virtual void ConstructJob(Compilation &C, const JobAction &JA, 415 const InputInfo &Output, 416 const InputInfoList &Inputs, 417 const ArgList &TCArgs, 418 const char *LinkingOutput) const; 419 }; 420} // end namespace dragonfly 421 422} // end namespace toolchains 423} // end namespace driver 424} // end namespace clang 425 426#endif // CLANG_LIB_DRIVER_TOOLS_H_ 427