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 | |
| parent | f4edae6076d9c09f2c759b0b26bddf6e2eab8b13 (diff) | |
| download | bcm5719-llvm-9e33e6f89bbe8f12856f3744e598470302dcf611.tar.gz bcm5719-llvm-9e33e6f89bbe8f12856f3744e598470302dcf611.zip | |
[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')
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp | 18 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp | 65 |
2 files changed, 22 insertions, 61 deletions
diff --git a/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp index 2e0b8971f91..af3cff32eb4 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp @@ -181,19 +181,13 @@ Error PublicsStream::reload() { return Error::success(); } -std::vector<std::string> PublicsStream::getSymbols() const { +iterator_range<codeview::SymbolIterator> PublicsStream::getSymbols() const { + using codeview::SymbolIterator; auto SymbolS = Pdb.getPDBSymbolStream(); - if (SymbolS.takeError()) - return {}; + if (SymbolS.takeError()) { + return llvm::make_range<SymbolIterator>(SymbolIterator(), SymbolIterator()); + } SymbolStream &SS = SymbolS.get(); - std::vector<std::string> Ret; - for (const HashRecord &HR : HashRecords) { - // For some reason, symbol offset is biased by one. - Expected<std::string> Name = SS.getSymbolName(HR.Off - 1); - if (Name.takeError()) - return Ret; - Ret.push_back(std::move(Name.get())); - } - return Ret; + return SS.getSymbols(); } diff --git a/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp index bd4280f3492..6249524eddd 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); } |

