diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp | 17 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/PublicsStream.cpp | 18 | ||||
| -rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/SymbolStream.cpp | 65 |
3 files changed, 39 insertions, 61 deletions
diff --git a/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp b/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp index 2becd94b101..60a3b8156b6 100644 --- a/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp +++ b/llvm/lib/DebugInfo/CodeView/SymbolDumper.cpp @@ -537,6 +537,23 @@ void CVSymbolDumperImpl::visitInlineSiteSym(SymbolKind Kind, } } +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 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); } |

