[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);
+}