Index: lib/Driver/MSVCToolChain.cpp =================================================================== --- lib/Driver/MSVCToolChain.cpp +++ lib/Driver/MSVCToolChain.cpp @@ -454,19 +454,33 @@ if (BinDir.empty()) return false; + SmallString<128> X64BinDir = BinDir; switch (getArch()) { case llvm::Triple::x86: + llvm::sys::path::append(X64BinDir, "amd64_x86"); break; case llvm::Triple::x86_64: - llvm::sys::path::append(BinDir, "amd64"); + llvm::sys::path::append(BinDir, "x86_amd64"); + llvm::sys::path::append(X64BinDir, "amd64"); break; case llvm::Triple::arm: - llvm::sys::path::append(BinDir, "arm"); + llvm::sys::path::append(BinDir, "x86_arm"); + llvm::sys::path::append(X64BinDir, "amd64_arm"); break; default: // Whatever this is, Visual Studio doesn't have a toolchain for it. return false; } + +#if defined(_M_X64) + // If running x64-hosted Clang, choose the x64-hosted version of the MSVC + // toolset, if it exists. + if (llvm::sys::fs::exists(X64BinDir)) { + path = X64BinDir.str(); + return true; + } +#endif + path = BinDir.str(); return true; }