[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/CodeView/SymbolDumper.cpp b/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
index 2becd94..60a3b81 100644
--- a/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
+++ b/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp
@@ -537,6 +537,23 @@
}
}
+void CVSymbolDumperImpl::visitPublicSym32(SymbolKind Kind,
+ PublicSym32 &Public) {
+ DictScope S(W, "PublicSym");
+ W.printNumber("Type", Public.Header.Index);
+ W.printNumber("Seg", Public.Header.Seg);
+ W.printNumber("Off", Public.Header.Off);
+ W.printString("Name", Public.Name);
+}
+
+void CVSymbolDumperImpl::visitProcRefSym(SymbolKind Kind, ProcRefSym &ProcRef) {
+ DictScope S(W, "ProcRef");
+ W.printNumber("SumName", ProcRef.Header.SumName);
+ W.printNumber("SymOffset", ProcRef.Header.SymOffset);
+ W.printNumber("Mod", ProcRef.Header.Mod);
+ W.printString("Name", ProcRef.Name);
+}
+
void CVSymbolDumperImpl::visitLabelSym(SymbolKind Kind, LabelSym &Label) {
DictScope S(W, "Label");
diff --git a/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp
index 2e0b8971..af3cff3 100644
--- a/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp
+++ b/llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp
@@ -181,19 +181,13 @@
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 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);
+}