diff --git a/clang/lib/Driver/Driver.cpp b/clang/lib/Driver/Driver.cpp --- a/clang/lib/Driver/Driver.cpp +++ b/clang/lib/Driver/Driver.cpp @@ -2085,7 +2085,7 @@ if (IsCLMode()) { if (!llvm::sys::path::is_absolute(Twine(Value)) && - llvm::sys::Process::FindInEnvPath("LIB", Value)) + llvm::sys::Process::FindInEnvPath("LIB", Value, ';')) return true; if (Args.hasArg(options::OPT__SLASH_link) && Ty == types::TY_Object) { diff --git a/clang/test/Driver/cl-inputs.c b/clang/test/Driver/cl-inputs.c --- a/clang/test/Driver/cl-inputs.c +++ b/clang/test/Driver/cl-inputs.c @@ -32,7 +32,9 @@ // WARN-NOT: note // MSYS2_ARG_CONV_EXCL tells MSYS2 to skip conversion of the specified argument. -// RUN: env LIB=%S/Inputs/cl-libs MSYS2_ARG_CONV_EXCL="/TP;/c" %clang_cl /c /TP cl-test.lib -### 2>&1 | FileCheck -check-prefix=TPlib %s +// Add a dummy "other" entry to the path as well, to check that it's split +// around semicolons even on unix. +// RUN: env LIB="other;%S/Inputs/cl-libs" MSYS2_ARG_CONV_EXCL="/TP;/c" %clang_cl /c /TP cl-test.lib -### 2>&1 | FileCheck -check-prefix=TPlib %s // TPlib: warning: cl-test.lib: 'linker' input unused // TPlib: warning: argument unused during compilation: '/TP' // TPlib-NOT: cl-test.lib diff --git a/llvm/include/llvm/Support/Process.h b/llvm/include/llvm/Support/Process.h --- a/llvm/include/llvm/Support/Process.h +++ b/llvm/include/llvm/Support/Process.h @@ -29,6 +29,7 @@ #include "llvm/Support/Chrono.h" #include "llvm/Support/DataTypes.h" #include "llvm/Support/Error.h" +#include "llvm/Support/Program.h" #include namespace llvm { @@ -107,10 +108,12 @@ /// considered. static Optional FindInEnvPath(StringRef EnvName, StringRef FileName, - ArrayRef IgnoreList); + ArrayRef IgnoreList, + char Separator = EnvPathSeparator); static Optional FindInEnvPath(StringRef EnvName, - StringRef FileName); + StringRef FileName, + char Separator = EnvPathSeparator); // This functions ensures that the standard file descriptors (input, output, // and error) are properly mapped to a file descriptor before we use any of diff --git a/llvm/lib/Support/Process.cpp b/llvm/lib/Support/Process.cpp --- a/llvm/lib/Support/Process.cpp +++ b/llvm/lib/Support/Process.cpp @@ -28,21 +28,22 @@ //=== independent code. //===----------------------------------------------------------------------===// -Optional Process::FindInEnvPath(StringRef EnvName, - StringRef FileName) { - return FindInEnvPath(EnvName, FileName, {}); +Optional +Process::FindInEnvPath(StringRef EnvName, StringRef FileName, char Separator) { + return FindInEnvPath(EnvName, FileName, {}, Separator); } Optional Process::FindInEnvPath(StringRef EnvName, StringRef FileName, - ArrayRef IgnoreList) { + ArrayRef IgnoreList, + char Separator) { assert(!path::is_absolute(FileName)); Optional FoundPath; Optional OptPath = Process::GetEnv(EnvName); if (!OptPath.hasValue()) return FoundPath; - const char EnvPathSeparatorStr[] = {EnvPathSeparator, '\0'}; + const char EnvPathSeparatorStr[] = {Separator, '\0'}; SmallVector Dirs; SplitString(OptPath.getValue(), Dirs, EnvPathSeparatorStr);