[PATCH] D18707: Make DIASession work if msdia*.dll isn't registered.

Nico Weber via llvm-commits llvm-commits at lists.llvm.org
Fri Apr 1 15:17:42 PDT 2016


thakis updated this revision to Diff 52433.
thakis added a comment.

address comments


http://reviews.llvm.org/D18707

Files:
  lib/DebugInfo/PDB/DIA/DIASession.cpp

Index: lib/DebugInfo/PDB/DIA/DIASession.cpp
===================================================================
--- lib/DebugInfo/PDB/DIA/DIASession.cpp
+++ lib/DebugInfo/PDB/DIA/DIASession.cpp
@@ -18,9 +18,38 @@
 #include "llvm/DebugInfo/PDB/PDBSymbolExe.h"
 #include "llvm/Support/ConvertUTF.h"
 
+#include <diacreate.h>
+
 using namespace llvm;
 
-namespace {}
+namespace {
+
+bool LoadDIA(CComPtr<IDiaDataSource>& DiaDataSource) {
+  if (SUCCEEDED(CoCreateInstance(CLSID_DiaSource, nullptr, CLSCTX_INPROC_SERVER,
+                                 IID_IDiaDataSource,
+                                 reinterpret_cast<LPVOID *>(&DiaDataSource))))
+    return true;
+
+  // If the CoCreateInstance call above failed, msdia*.dll is not registered.
+  // Try loading the DLL corresponding to the #included DIA SDK.
+#if !defined(_MSC_VER)
+  return false;
+#else
+  const wchar_t *msdia_dll = nullptr;
+#if _MSC_VER == 1900
+  msdia_dll = L"msdia140.dll"; // VS2015
+#elif _MSC_VER == 1800
+  msdia_dll = L"msdia120.dll"; // VS2013
+#else
+#error "Unknown Visual Studio version."
+#endif
+  return msdia_dll &&
+         SUCCEEDED(NoRegCoCreate(msdia_dll, CLSID_DiaSource, IID_IDiaDataSource,
+                                 reinterpret_cast<LPVOID *>(&DiaDataSource)));
+#endif
+}
+
+}
 
 DIASession::DIASession(CComPtr<IDiaSession> DiaSession) : Session(DiaSession) {}
 
@@ -30,17 +59,15 @@
   CComPtr<IDiaSession> DiaSession;
 
   // We assume that CoInitializeEx has already been called by the executable.
-  HRESULT Result = ::CoCreateInstance(
-      CLSID_DiaSource, nullptr, CLSCTX_INPROC_SERVER, IID_IDiaDataSource,
-      reinterpret_cast<LPVOID *>(&DiaDataSource));
-  if (FAILED(Result))
+  if (!LoadDIA(DiaDataSource))
     return PDB_ErrorCode::NoPdbImpl;
 
   llvm::SmallVector<UTF16, 128> Path16;
   if (!llvm::convertUTF8ToUTF16String(Path, Path16))
     return PDB_ErrorCode::InvalidPath;
 
   const wchar_t *Path16Str = reinterpret_cast<const wchar_t*>(Path16.data());
+  HRESULT Result;
   if (FAILED(Result = DiaDataSource->loadDataFromPdb(Path16Str))) {
     if (Result == E_PDB_NOT_FOUND)
       return PDB_ErrorCode::InvalidPath;
@@ -71,17 +98,15 @@
   CComPtr<IDiaSession> DiaSession;
 
   // We assume that CoInitializeEx has already been called by the executable.
-  HRESULT Result = ::CoCreateInstance(
-      CLSID_DiaSource, nullptr, CLSCTX_INPROC_SERVER, IID_IDiaDataSource,
-      reinterpret_cast<LPVOID *>(&DiaDataSource));
-  if (FAILED(Result))
+  if (!LoadDIA(DiaDataSource))
     return PDB_ErrorCode::NoPdbImpl;
 
   llvm::SmallVector<UTF16, 128> Path16;
   if (!llvm::convertUTF8ToUTF16String(Path, Path16))
     return PDB_ErrorCode::InvalidPath;
 
   const wchar_t *Path16Str = reinterpret_cast<const wchar_t *>(Path16.data());
+  HRESULT Result;
   if (FAILED(Result =
                  DiaDataSource->loadDataForExe(Path16Str, nullptr, nullptr))) {
     if (Result == E_PDB_NOT_FOUND)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D18707.52433.patch
Type: text/x-patch
Size: 2932 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160401/ae43d78b/attachment.bin>


More information about the llvm-commits mailing list