diff options
author | Zachary Turner <zturner@google.com> | 2016-05-24 18:55:14 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-05-24 18:55:14 +0000 |
commit | 9e33e6f89bbe8f12856f3744e598470302dcf611 (patch) | |
tree | 9ce7c4eed026670ae7248897cc9b1d8bd4f0418f /llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp | |
parent | f4edae6076d9c09f2c759b0b26bddf6e2eab8b13 (diff) | |
download | llvm-9e33e6f89bbe8f12856f3744e598470302dcf611.zip llvm-9e33e6f89bbe8f12856f3744e598470302dcf611.tar.gz llvm-9e33e6f89bbe8f12856f3744e598470302dcf611.tar.bz2 |
[codeview, pdb] Dump symbol records in publics stream
Differential Revision: http://reviews.llvm.org/D20580
Reviewed By: ruiu
llvm-svn: 270597
Diffstat (limited to 'llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp')
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp | 65 |
1 files changed, 16 insertions, 49 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp index bd4280f..6249524 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp @@ -11,6 +11,7 @@ #include "llvm/DebugInfo/CodeView/CodeView.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/PDB/Raw/ByteStream.h" #include "llvm/DebugInfo/PDB/Raw/MappedBlockStream.h" #include "llvm/DebugInfo/PDB/Raw/RawConstants.h" #include "llvm/DebugInfo/PDB/Raw/RawError.h" @@ -22,62 +23,28 @@ using namespace llvm; using namespace llvm::support; using namespace llvm::pdb; -// Symbol stream is an array of symbol records. Each record starts with -// length and type fields followed by type-specfic fields. -namespace { -struct SymbolHeader { - ulittle16_t Len; // Record length - ulittle16_t Type; -}; - -// For S_PUB32 symbol type. -struct DataSym32 { - ulittle32_t TypIndex; // Type index, or Metadata token if a managed symbol - ulittle32_t off; - ulittle16_t seg; - char Name[1]; -}; - -// For S_PROCREF symbol type. -struct RefSym { - ulittle32_t SumName; // SUC of the name (?) - ulittle32_t SymOffset; // Offset of actual symbol in $$Symbols - ulittle16_t Mod; // Module containing the actual symbol - char Name[1]; -}; -} - SymbolStream::SymbolStream(PDBFile &File, uint32_t StreamNum) - : Stream(StreamNum, File) {} + : MappedStream(StreamNum, File) {} SymbolStream::~SymbolStream() {} -Error SymbolStream::reload() { return Error::success(); } - -Expected<std::string> SymbolStream::getSymbolName(uint32_t Off) const { - StreamReader Reader(Stream); - Reader.setOffset(Off); +Error SymbolStream::reload() { + StreamReader Reader(MappedStream); - // Read length field. - SymbolHeader Hdr; - if (Reader.readObject(&Hdr)) + if (Stream.initialize(Reader, MappedStream.getLength())) return make_error<RawError>(raw_error_code::corrupt_file, - "Corrupted symbol stream."); + "Could not load symbol stream."); - // Read the entire record. - std::vector<uint8_t> Buf(Hdr.Len - sizeof(Hdr.Type)); - if (Reader.readBytes(Buf)) - return make_error<RawError>(raw_error_code::corrupt_file, - "Corrupted symbol stream."); + return Error::success(); +} - switch (Hdr.Type) { - case codeview::S_PUB32: - return reinterpret_cast<DataSym32 *>(Buf.data())->Name; - case codeview::S_PROCREF: - return reinterpret_cast<RefSym *>(Buf.data())->Name; - default: - return make_error<RawError>(raw_error_code::corrupt_file, - "Unknown symbol type"); +iterator_range<codeview::SymbolIterator> SymbolStream::getSymbols() const { + using codeview::SymbolIterator; + ArrayRef<uint8_t> Data; + if (auto Error = Stream.getArrayRef(0, Data, Stream.getLength())) { + consumeError(std::move(Error)); + return iterator_range<SymbolIterator>(SymbolIterator(), SymbolIterator()); } - return Error::success(); + + return codeview::makeSymbolRange(Data, nullptr); } |