Index: lib/DebugInfo/PDB/DIA/DIASession.cpp =================================================================== --- lib/DebugInfo/PDB/DIA/DIASession.cpp +++ lib/DebugInfo/PDB/DIA/DIASession.cpp @@ -18,9 +18,36 @@ #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. + // We can try loading the DLL corresponding to the #included DIA SDK, but + // the DIA headers don't provide a version. Lets try to figure out which DIA + // version we're compiling against by comparing CLSIDs. + class DECLSPEC_UUID("3BFCEA48-620F-4B6B-81F7-B9AF75454C7D") DiaSource120; + class DECLSPEC_UUID("E6756135-1E65-4D17-8576-610761398C3C") DiaSource140; + const wchar_t *msdia_dll = nullptr; + if (CLSID_DiaSource == _uuidof(DiaSource120)) // VS2013 + msdia_dll = L"msdia120.dll"; + else if (CLSID_DiaSource == _uuidof(DiaSource140)) // VS2015 + msdia_dll = L"msdia140.dll"; + + return msdia_dll && + SUCCEEDED(NoRegCoCreate(msdia_dll, CLSID_DiaSource, IID_IDiaDataSource, + reinterpret_cast(&DiaDataSource))); +} + +} DIASession::DIASession(CComPtr DiaSession) : Session(DiaSession) {} @@ -30,10 +57,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 +65,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 +96,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 +104,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)