summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorZachary Turner <zturner@google.com>2015-02-28 20:23:18 +0000
committerZachary Turner <zturner@google.com>2015-02-28 20:23:18 +0000
commitccf04159732d5da1430a44a96f0211f05ba7cf9e (patch)
tree00ed7d60fdbaa5dc56ae919a52d9ddd87c8aec7f /llvm/lib
parent66d4c6e78cef2aad52b7a0344a5afc073c638ca9 (diff)
downloadbcm5719-llvm-ccf04159732d5da1430a44a96f0211f05ba7cf9e.tar.gz
bcm5719-llvm-ccf04159732d5da1430a44a96f0211f05ba7cf9e.zip
[llvm-pdbdump] Better error handling.
Previously it was impossible to distinguish between "There is no PDB implementation for this platform" and "I tried to load the PDB, but couldn't find the file", making it hard to figure out if you built llvm-pdbdump incorrectly or if you just mistyped a file name. This patch adds proper error handling so that we can know exactly what went wrong. llvm-svn: 230868
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp45
-rw-r--r--llvm/lib/DebugInfo/PDB/PDB.cpp8
2 files changed, 35 insertions, 18 deletions
diff --git a/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp b/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp
index 24791f2afa1..4966bea96f6 100644
--- a/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp
+++ b/llvm/lib/DebugInfo/PDB/DIA/DIASession.cpp
@@ -23,28 +23,45 @@ namespace {}
DIASession::DIASession(CComPtr<IDiaSession> DiaSession) : Session(DiaSession) {}
-DIASession *DIASession::createFromPdb(StringRef Path) {
- CComPtr<IDiaDataSource> DataSource;
- CComPtr<IDiaSession> Session;
+PDB_ErrorCode DIASession::createFromPdb(StringRef Path,
+ std::unique_ptr<IPDBSession> &Session) {
+ CComPtr<IDiaDataSource> DiaDataSource;
+ 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 *>(&DataSource));
+ HRESULT Result = ::CoCreateInstance(
+ CLSID_DiaSource, nullptr, CLSCTX_INPROC_SERVER, IID_IDiaDataSource,
+ reinterpret_cast<LPVOID *>(&DiaDataSource));
if (FAILED(Result))
- return nullptr;
+ return PDB_ErrorCode::NoPdbImpl;
llvm::SmallVector<UTF16, 128> Path16;
if (!llvm::convertUTF8ToUTF16String(Path, Path16))
- return nullptr;
+ return PDB_ErrorCode::InvalidPath;
const wchar_t *Path16Str = reinterpret_cast<const wchar_t*>(Path16.data());
- if (FAILED(DataSource->loadDataFromPdb(Path16Str)))
- return nullptr;
-
- if (FAILED(DataSource->openSession(&Session)))
- return nullptr;
- return new DIASession(Session);
+ if (FAILED(Result = DiaDataSource->loadDataFromPdb(Path16Str))) {
+ if (Result == E_PDB_NOT_FOUND)
+ return PDB_ErrorCode::InvalidPath;
+ else if (Result == E_PDB_FORMAT)
+ return PDB_ErrorCode::InvalidFileFormat;
+ else if (Result == E_INVALIDARG)
+ return PDB_ErrorCode::InvalidParameter;
+ else if (Result == E_UNEXPECTED)
+ return PDB_ErrorCode::AlreadyLoaded;
+ else
+ return PDB_ErrorCode::UnknownError;
+ }
+
+ if (FAILED(Result = DiaDataSource->openSession(&DiaSession))) {
+ if (Result == E_OUTOFMEMORY)
+ return PDB_ErrorCode::NoMemory;
+ else
+ return PDB_ErrorCode::UnknownError;
+ }
+
+ Session.reset(new DIASession(DiaSession));
+ return PDB_ErrorCode::Success;
}
uint64_t DIASession::getLoadAddress() const {
diff --git a/llvm/lib/DebugInfo/PDB/PDB.cpp b/llvm/lib/DebugInfo/PDB/PDB.cpp
index aa84c288287..a07396d1a17 100644
--- a/llvm/lib/DebugInfo/PDB/PDB.cpp
+++ b/llvm/lib/DebugInfo/PDB/PDB.cpp
@@ -20,11 +20,11 @@
using namespace llvm;
-std::unique_ptr<IPDBSession> llvm::createPDBReader(PDB_ReaderType Type,
- StringRef Path) {
+PDB_ErrorCode llvm::createPDBReader(PDB_ReaderType Type, StringRef Path,
+ std::unique_ptr<IPDBSession> &Session) {
// Create the correct concrete instance type based on the value of Type.
#if HAVE_DIA_SDK
- return std::unique_ptr<DIASession>(DIASession::createFromPdb(Path));
+ return DIASession::createFromPdb(Path, Session);
#endif
- return nullptr;
+ return PDB_ErrorCode::NoPdbImpl;
}
OpenPOWER on IntegriCloud