Author: hans Date: Wed Jun 18 12:21:50 2014 New Revision: 211189 URL: http://llvm.org/viewvc/llvm-project?rev=211189&view=rev Log: Make clang-cl accept .lib inputs (PR20065)
Patch by Ehsan Akhgari! (Tiny tweak by me: renamed PathSegment to LibDir.) Differential Revision: http://reviews.llvm.org/D4192 Added: cfe/trunk/test/Driver/Inputs/cl-libs/ cfe/trunk/test/Driver/Inputs/cl-libs/cl-test.lib Modified: cfe/trunk/lib/Driver/Driver.cpp cfe/trunk/test/Driver/cl-inputs.c Modified: cfe/trunk/lib/Driver/Driver.cpp URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/Driver/Driver.cpp?rev=211189&r1=211188&r2=211189&view=diff ============================================================================== --- cfe/trunk/lib/Driver/Driver.cpp (original) +++ cfe/trunk/lib/Driver/Driver.cpp Wed Jun 18 12:21:50 2014 @@ -21,6 +21,7 @@ #include "clang/Driver/ToolChain.h" #include "llvm/ADT/ArrayRef.h" #include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/StringExtras.h" #include "llvm/ADT/StringSet.h" #include "llvm/ADT/StringSwitch.h" #include "llvm/Option/Arg.h" @@ -33,6 +34,7 @@ #include "llvm/Support/FileSystem.h" #include "llvm/Support/Path.h" #include "llvm/Support/PrettyStackTrace.h" +#include "llvm/Support/Process.h" #include "llvm/Support/Program.h" #include "llvm/Support/raw_ostream.h" #include <map> @@ -927,6 +929,35 @@ void Driver::BuildUniversalActions(const } } +/// \brief Check whether the file referenced by Value exists in the LIB +/// environment variable. +static bool ExistsInLibDir(StringRef Value) { + llvm::Optional<std::string> OptPath = llvm::sys::Process::GetEnv("LIB"); + if (!OptPath.hasValue()) + return false; + +#ifdef LLVM_ON_WIN32 + const StringRef PathSeparators = ";"; +#else + const StringRef PathSeparators = ":"; +#endif + + SmallVector<StringRef, 8> LibDirs; + llvm::SplitString(OptPath.getValue(), LibDirs, PathSeparators); + + for (const auto &LibDir : LibDirs) { + if (LibDir.empty()) + continue; + + SmallString<128> FilePath(LibDir); + llvm::sys::path::append(FilePath, Value); + if (llvm::sys::fs::exists(Twine(FilePath))) + return true; + } + + return false; +} + /// \brief Check that the file referenced by Value exists. If it doesn't, /// issue a diagnostic and return false. static bool DiagnoseInputExistence(const Driver &D, const DerivedArgList &Args, @@ -950,6 +981,9 @@ static bool DiagnoseInputExistence(const if (llvm::sys::fs::exists(Twine(Path))) return true; + if (D.IsCLMode() && ExistsInLibDir(Value)) + return true; + D.Diag(clang::diag::err_drv_no_such_file) << Path.str(); return false; } Added: cfe/trunk/test/Driver/Inputs/cl-libs/cl-test.lib URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/Inputs/cl-libs/cl-test.lib?rev=211189&view=auto ============================================================================== (empty) Modified: cfe/trunk/test/Driver/cl-inputs.c URL: http://llvm.org/viewvc/llvm-project/cfe/trunk/test/Driver/cl-inputs.c?rev=211189&r1=211188&r2=211189&view=diff ============================================================================== --- cfe/trunk/test/Driver/cl-inputs.c (original) +++ cfe/trunk/test/Driver/cl-inputs.c Wed Jun 18 12:21:50 2014 @@ -40,4 +40,13 @@ // RUN: %clang_cl -### /Tc - 2>&1 | FileCheck -check-prefix=STDINTc %s // STDINTc: "-x" "c" +// RUN: env LIB=%S/Inputs/cl-libs %clang_cl -### -- %s cl-test.lib 2>&1 | FileCheck -check-prefix=LIBINPUT %s +// LIBINPUT: "link.exe" +// LIBINPUT: "cl-test.lib" + +// RUN: env LIB=%S/Inputs/cl-libs %clang_cl -### -- %s cl-test2.lib 2>&1 | FileCheck -check-prefix=LIBINPUT2 %s +// LIBINPUT2: error: no such file or directory: 'cl-test2.lib' +// LIBINPUT2: "link.exe" +// LIBINPUT2-NOT: "cl-test2.lib" + void f(); _______________________________________________ cfe-commits mailing list [email protected] http://lists.cs.uiuc.edu/mailman/listinfo/cfe-commits
