[codeview, pdb] Dump symbol records in publics stream
Differential Revision: http://reviews.llvm.org/D20580
Reviewed By: ruiu
llvm-svn: 270597
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::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(); }
+Error SymbolStream::reload() {
+ StreamReader Reader(MappedStream);
-Expected<std::string> SymbolStream::getSymbolName(uint32_t Off) const {
- StreamReader Reader(Stream);
- Reader.setOffset(Off);
-
- // 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.");
-
- 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");
- }
return Error::success();
}
+
+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 codeview::makeSymbolRange(Data, nullptr);
+}