diff --git a/driver/tool.cpp b/driver/tool.cpp index beb2f6a9e5..f0a88af84c 100644 --- a/driver/tool.cpp +++ b/driver/tool.cpp @@ -78,24 +78,30 @@ std::string getProgram(const char *fallbackName, std::string getGcc(std::vector &additional_args, const char *fallback) { - // In case $CC contains spaces split it into a command and arguments - std::string cc = env::get("CC"); - if (cc.empty()) - return getProgram(fallback, &gcc); +#ifdef _WIN32 + // spaces in $CC are to be expected on Windows + // (e.g., `C:\Program Files\LLVM\bin\clang-cl.exe`) + return getProgram(fallback, &gcc, "CC"); +#else + // Posix: in case $CC contains spaces split it into a command and arguments + std::string cc = env::get("CC"); + if (cc.empty()) + return getProgram(fallback, &gcc); - // $CC is set so fallback doesn't matter anymore. - if (cc.find(' ') == cc.npos) - return getProgram(cc.c_str(), &gcc); + // $CC is set so fallback doesn't matter anymore. + if (cc.find(' ') == cc.npos) + return getProgram(cc.c_str(), &gcc); - llvm::StringRef sr(cc); - llvm::SmallVector args; - sr.split(args, ' ', /*MaxSplit=*/-1, /*keepEmpty=*/false); + llvm::StringRef sr(cc); + llvm::SmallVector args; + sr.split(args, ' ', /*MaxSplit=*/-1, /*keepEmpty=*/false); - // args[0] == CC command, args[1..] = CLI options - additional_args.reserve(additional_args.size() + args.size() - 1); - for (size_t i = 1; i < args.size(); i ++) - additional_args.emplace_back(args[i].str()); - return getProgram(args[0].str().c_str(), &gcc); + // args[0] == CC command, args[1..] = CLI options + additional_args.reserve(additional_args.size() + args.size() - 1); + for (size_t i = 1; i < args.size(); i ++) + additional_args.emplace_back(args[i].str()); + return getProgram(args[0].str().c_str(), &gcc); +#endif } ////////////////////////////////////////////////////////////////////////////////