r211189 - Make clang-cl accept .lib inputs (PR20065)

Hans Wennborg hans at hanshq.net
Wed Jun 18 10:21:50 PDT 2014


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();





More information about the cfe-commits mailing list