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 + using namespace llvm; -namespace {} +namespace { + +bool LoadDIA(CComPtr& DiaDataSource) { + if (SUCCEEDED(CoCreateInstance(CLSID_DiaSource, nullptr, CLSCTX_INPROC_SERVER, + IID_IDiaDataSource, + reinterpret_cast(&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(&DiaDataSource))); +#endif +} + +} DIASession::DIASession(CComPtr DiaSession) : Session(DiaSession) {} @@ -30,10 +59,7 @@ CComPtr 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(&DiaDataSource)); - if (FAILED(Result)) + if (!LoadDIA(DiaDataSource)) return PDB_ErrorCode::NoPdbImpl; llvm::SmallVector Path16; @@ -41,6 +67,7 @@ return PDB_ErrorCode::InvalidPath; const wchar_t *Path16Str = reinterpret_cast(Path16.data()); + HRESULT Result; if (FAILED(Result = DiaDataSource->loadDataFromPdb(Path16Str))) { if (Result == E_PDB_NOT_FOUND) return PDB_ErrorCode::InvalidPath; @@ -71,10 +98,7 @@ CComPtr 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(&DiaDataSource)); - if (FAILED(Result)) + if (!LoadDIA(DiaDataSource)) return PDB_ErrorCode::NoPdbImpl; llvm::SmallVector Path16; @@ -82,6 +106,7 @@ return PDB_ErrorCode::InvalidPath; const wchar_t *Path16Str = reinterpret_cast(Path16.data()); + HRESULT Result; if (FAILED(Result = DiaDataSource->loadDataForExe(Path16Str, nullptr, nullptr))) { if (Result == E_PDB_NOT_FOUND)