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 | |
parent | 9073ed6e5a674f663d7325ec5e41b94244a07421 (diff) | |
download | bcm5719-llvm-06c2b4be250d176b8fef232c2e117b863c9c00bf.tar.gz bcm5719-llvm-06c2b4be250d176b8fef232c2e117b863c9c00bf.zip |
[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')
-rw-r--r-- | llvm/lib/DebugInfo/PDB/CMakeLists.txt | 7 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/ByteStream.cpp | 18 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp | 55 |
3 files changed, 66 insertions, 14 deletions
diff --git a/llvm/lib/DebugInfo/PDB/CMakeLists.txt b/llvm/lib/DebugInfo/PDB/CMakeLists.txt index 2171796a184..9111582a4bd 100644 --- a/llvm/lib/DebugInfo/PDB/CMakeLists.txt +++ b/llvm/lib/DebugInfo/PDB/CMakeLists.txt @@ -29,13 +29,14 @@ endif() add_pdb_impl_folder(Raw Raw/ByteStream.cpp - Raw/MappedBlockStream.cpp - Raw/ModInfo.cpp - Raw/PDBFile.cpp Raw/DbiStream.cpp Raw/InfoStream.cpp + Raw/MappedBlockStream.cpp + Raw/ModInfo.cpp + Raw/ModStream.cpp Raw/NameHashTable.cpp Raw/NameMap.cpp + Raw/PDBFile.cpp Raw/RawError.cpp Raw/RawSession.cpp Raw/StreamReader.cpp diff --git a/llvm/lib/DebugInfo/PDB/Raw/ByteStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/ByteStream.cpp index 8c6d7ec749b..8dc3c854887 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/ByteStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/ByteStream.cpp @@ -13,33 +13,29 @@ using namespace llvm; using namespace llvm::pdb; -ByteStream::ByteStream() : Owned(false) {} +ByteStream::ByteStream() {} -ByteStream::ByteStream(MutableArrayRef<uint8_t> Bytes) : Owned(false) { - initialize(Bytes); -} +ByteStream::ByteStream(MutableArrayRef<uint8_t> Bytes) { initialize(Bytes); } -ByteStream::ByteStream(uint32_t Length) : Owned(false) { initialize(Length); } +ByteStream::ByteStream(uint32_t Length) { initialize(Length); } ByteStream::~ByteStream() { reset(); } void ByteStream::reset() { - if (Owned) - delete[] Data.data(); - Owned = false; + Ownership.reset(); Data = MutableArrayRef<uint8_t>(); } void ByteStream::initialize(MutableArrayRef<uint8_t> Bytes) { reset(); Data = Bytes; - Owned = false; } void ByteStream::initialize(uint32_t Length) { reset(); - Data = MutableArrayRef<uint8_t>(new uint8_t[Length], Length); - Owned = true; + if (Length > 0) + Data = MutableArrayRef<uint8_t>(new uint8_t[Length], Length); + Ownership.reset(Data.data()); } Error ByteStream::initialize(StreamReader &Reader, uint32_t Length) { diff --git a/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/ModStream.cpp new file mode 100644 index 00000000000..8c435073655 --- /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)); +} |