diff options
author | Zachary Turner <zturner@google.com> | 2016-05-09 17:45:21 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-05-09 17:45:21 +0000 |
commit | 06c2b4be250d176b8fef232c2e117b863c9c00bf (patch) | |
tree | 2d86209d5eb79620ec30b5a82fafcfc003ec5111 /llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp | |
parent | 9073ed6e5a674f663d7325ec5e41b94244a07421 (diff) | |
download | llvm-06c2b4be250d176b8fef232c2e117b863c9c00bf.zip llvm-06c2b4be250d176b8fef232c2e117b863c9c00bf.tar.gz llvm-06c2b4be250d176b8fef232c2e117b863c9c00bf.tar.bz2 |
[pdb] Parse the module info stream for each module.
Differential Revision: http://reviews.llvm.org/D20026
Reviewed By: rnk
llvm-svn: 268942
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp | 55 |
1 files changed, 55 insertions, 0 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp new file mode 100644 index 0000000..8c43507 --- /dev/null +++ b/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp @@ -0,0 +1,55 @@ +//===- ModStream.cpp - PDB Module Info Stream Access ----------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#include "llvm/DebugInfo/PDB/Raw/ModStream.h" +#include "llvm/DebugInfo/PDB/Raw/ModInfo.h" +#include "llvm/DebugInfo/PDB/Raw/RawError.h" +#include "llvm/DebugInfo/PDB/Raw/StreamReader.h" + +using namespace llvm; +using namespace llvm::pdb; + +ModStream::ModStream(PDBFile &File, const ModInfo &Module) + : Mod(Module), Stream(Module.getModuleStreamIndex(), File) {} + +ModStream::~ModStream() {} + +Error ModStream::reload() { + StreamReader Reader(Stream); + + uint32_t SymbolSize = Mod.getSymbolDebugInfoByteSize(); + uint32_t C11Size = Mod.getLineInfoByteSize(); + uint32_t C13Size = Mod.getC13LineInfoByteSize(); + + if (C11Size > 0 && C13Size > 0) + return llvm::make_error<RawError>(raw_error_code::corrupt_file, + "Module has both C11 and C13 line info"); + + if (auto EC = SymbolsSubstream.initialize(Reader, SymbolSize)) + return EC; + if (auto EC = LinesSubstream.initialize(Reader, C11Size)) + return EC; + if (auto EC = C13LinesSubstream.initialize(Reader, C13Size)) + return EC; + + uint32_t GlobalRefsSize; + if (auto EC = Reader.readInteger(GlobalRefsSize)) + return EC; + if (auto EC = GlobalRefsSubstream.initialize(Reader, GlobalRefsSize)) + return EC; + if (Reader.bytesRemaining() > 0) + return llvm::make_error<RawError>(raw_error_code::corrupt_file, + "Unexpected bytes in module stream."); + + return Error::success(); +} + +iterator_range<codeview::SymbolIterator> ModStream::symbols() const { + return codeview::makeSymbolRange(SymbolsSubstream.data().slice(4)); +} |