diff options
author | Nico Weber <nicolasweber@gmx.de> | 2016-04-01 22:21:51 +0000 |
---|---|---|
committer | Nico Weber <nicolasweber@gmx.de> | 2016-04-01 22:21:51 +0000 |
commit | 6bde7e452f20ee2d349e186e14860ac559c7b9dd (patch) | |
tree | 6d078649d857155bd1f03a2e0744595cd5dfddd9 /lib/DebugInfo/PDB/DIA | |
parent | fbce329a31d242a77595e8ca386a2626dbafeecc (diff) |
Make DIASession work if msdia*.dll isn't registered.
This fixes various symbolization test failures for me when I build with a
hermetic VS2015 without having run the 2015 installer.
http://reviews.llvm.org/D18707
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265193 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/DebugInfo/PDB/DIA')
-rw-r--r-- | lib/DebugInfo/PDB/DIA/DIASession.cpp | 43 |
1 files changed, 34 insertions, 9 deletions
diff --git a/lib/DebugInfo/PDB/DIA/DIASession.cpp b/lib/DebugInfo/PDB/DIA/DIASession.cpp index 5e58bb4008f..60894bbd0ce 100644 --- a/lib/DebugInfo/PDB/DIA/DIASession.cpp +++ b/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,10 +59,7 @@ PDB_ErrorCode DIASession::createFromPdb(StringRef Path, 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; @@ -41,6 +67,7 @@ PDB_ErrorCode DIASession::createFromPdb(StringRef Path, 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,10 +98,7 @@ PDB_ErrorCode DIASession::createFromExe(StringRef Path, 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; @@ -82,6 +106,7 @@ PDB_ErrorCode DIASession::createFromExe(StringRef Path, 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) |