diff options
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h | 14 | ||||
-rw-r--r-- | llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h | 83 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeDumper.cpp | 25 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp | 19 | ||||
-rw-r--r-- | llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp | 10 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/CodeViewYaml.cpp | 18 | ||||
-rw-r--r-- | llvm/tools/llvm-pdbdump/PdbYaml.cpp | 11 |
7 files changed, 149 insertions, 31 deletions
diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h b/llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h index e3ab75440bc..27d9e596132 100644 --- a/llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h +++ b/llvm/include/llvm/DebugInfo/CodeView/TypeDeserializer.h @@ -17,16 +17,7 @@ namespace llvm { namespace codeview { class TypeDeserializer : public TypeVisitorCallbacks { public: - explicit TypeDeserializer(TypeVisitorCallbacks &Recipient) - : Recipient(Recipient) {} - - Error visitTypeBegin(const CVRecord<TypeLeafKind> &Record) override { - return Recipient.visitTypeBegin(Record); - } - - Error visitTypeEnd(const CVRecord<TypeLeafKind> &Record) override { - return Recipient.visitTypeEnd(Record); - } + TypeDeserializer() {} #define TYPE_RECORD(EnumName, EnumVal, Name) \ Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, \ @@ -40,7 +31,6 @@ public: #include "TypeRecords.def" protected: - TypeVisitorCallbacks &Recipient; template <typename T> Error deserializeRecord(ArrayRef<uint8_t> &Data, TypeLeafKind Kind, @@ -59,7 +49,7 @@ private: ArrayRef<uint8_t> RD = CVR.Data; if (auto EC = deserializeRecord(RD, CVR.Type, Record)) return EC; - return Recipient.visitKnownRecord(CVR, Record); + return Error::success(); } }; } diff --git a/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h b/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h new file mode 100644 index 00000000000..3bfd52d4da4 --- /dev/null +++ b/llvm/include/llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h @@ -0,0 +1,83 @@ +//===- TypeVisitorCallbackPipeline.h -------------------------- *- C++ --*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_DEBUGINFO_CODEVIEW_TYPEVISITORCALLBACKPIPELINE_H +#define LLVM_DEBUGINFO_CODEVIEW_TYPEVISITORCALLBACKPIPELINE_H + +#include "llvm/DebugInfo/CodeView/CodeView.h" +#include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h" + +#include <vector> + +namespace llvm { +namespace codeview { +class TypeVisitorCallbackPipeline : public TypeVisitorCallbacks { +public: + TypeVisitorCallbackPipeline() {} + + virtual Error + visitUnknownType(const CVRecord<TypeLeafKind> &Record) override { + for (auto Visitor : Pipeline) { + if (auto EC = Visitor->visitUnknownType(Record)) + return EC; + } + return Error::success(); + } + + virtual Error + visitUnknownMember(const CVRecord<TypeLeafKind> &Record) override { + for (auto Visitor : Pipeline) { + if (auto EC = Visitor->visitUnknownMember(Record)) + return EC; + } + return Error::success(); + } + + virtual Error visitTypeBegin(const CVRecord<TypeLeafKind> &Record) override { + for (auto Visitor : Pipeline) { + if (auto EC = Visitor->visitTypeBegin(Record)) + return EC; + } + return Error::success(); + } + virtual Error visitTypeEnd(const CVRecord<TypeLeafKind> &Record) override { + for (auto Visitor : Pipeline) { + if (auto EC = Visitor->visitTypeEnd(Record)) + return EC; + } + return Error::success(); + } + + void addCallbackToPipeline(TypeVisitorCallbacks &Callbacks) { + Pipeline.push_back(&Callbacks); + } + +#define TYPE_RECORD(EnumName, EnumVal, Name) \ + Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, \ + Name##Record &Record) override { \ + for (auto Visitor : Pipeline) { \ + if (auto EC = Visitor->visitKnownRecord(CVR, Record)) \ + return EC; \ + } \ + return Error::success(); \ + } +#define MEMBER_RECORD(EnumName, EnumVal, Name) \ + TYPE_RECORD(EnumName, EnumVal, Name) +#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) +#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName) +#include "llvm/DebugInfo/CodeView/TypeRecords.def" + +private: + std::vector<TypeVisitorCallbacks *> Pipeline; +}; +} +} + +#endif diff --git a/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp b/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp index 23788205fcf..f7dfdd2f398 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeDumper.cpp @@ -13,6 +13,7 @@ #include "llvm/DebugInfo/CodeView/TypeDeserializer.h" #include "llvm/DebugInfo/CodeView/TypeIndex.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h" #include "llvm/DebugInfo/MSF/ByteStream.h" #include "llvm/Support/ScopedPrinter.h" @@ -249,8 +250,12 @@ Error CVTypeDumper::visitTypeEnd(const CVRecord<TypeLeafKind> &Record) { Error CVTypeDumper::visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, FieldListRecord &FieldList) { - TypeDeserializer Deserializer(*this); - CVTypeVisitor Visitor(Deserializer); + TypeDeserializer Deserializer; + TypeVisitorCallbackPipeline Pipeline; + Pipeline.addCallbackToPipeline(Deserializer); + Pipeline.addCallbackToPipeline(*this); + + CVTypeVisitor Visitor(Pipeline); if (auto EC = Visitor.visitFieldListMemberStream(FieldList.Data)) return EC; @@ -711,8 +716,12 @@ void CVTypeDumper::printTypeIndex(StringRef FieldName, TypeIndex TI) { Error CVTypeDumper::dump(const CVRecord<TypeLeafKind> &Record) { assert(W && "printer should not be null"); - TypeDeserializer Deserializer(*this); - CVTypeVisitor Visitor(Deserializer); + TypeDeserializer Deserializer; + TypeVisitorCallbackPipeline Pipeline; + Pipeline.addCallbackToPipeline(Deserializer); + Pipeline.addCallbackToPipeline(*this); + + CVTypeVisitor Visitor(Pipeline); if (auto EC = Visitor.visitTypeRecord(Record)) return EC; @@ -721,8 +730,12 @@ Error CVTypeDumper::dump(const CVRecord<TypeLeafKind> &Record) { Error CVTypeDumper::dump(const CVTypeArray &Types) { assert(W && "printer should not be null"); - TypeDeserializer Deserializer(*this); - CVTypeVisitor Visitor(Deserializer); + TypeDeserializer Deserializer; + TypeVisitorCallbackPipeline Pipeline; + Pipeline.addCallbackToPipeline(Deserializer); + Pipeline.addCallbackToPipeline(*this); + + CVTypeVisitor Visitor(Pipeline); if (auto EC = Visitor.visitTypeStream(Types)) return EC; diff --git a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp index 0ce20623d1d..ddc3f4af58e 100644 --- a/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp +++ b/llvm/lib/DebugInfo/CodeView/TypeStreamMerger.cpp @@ -15,6 +15,7 @@ #include "llvm/DebugInfo/CodeView/TypeDeserializer.h" #include "llvm/DebugInfo/CodeView/TypeIndex.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h" #include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h" #include "llvm/Support/Error.h" #include "llvm/Support/ScopedPrinter.h" @@ -84,8 +85,13 @@ private: Error visitKnownRecordImpl(FieldListRecord &Record) { // Don't do anything, this will get written in the call to visitTypeEnd(). - TypeDeserializer Deserializer(*this); - CVTypeVisitor Visitor(Deserializer); + TypeVisitorCallbackPipeline Pipeline; + TypeDeserializer Deserializer; + + Pipeline.addCallbackToPipeline(Deserializer); + Pipeline.addCallbackToPipeline(*this); + + CVTypeVisitor Visitor(Pipeline); if (auto EC = Visitor.visitFieldListMemberStream(Record.Data)) return EC; @@ -160,8 +166,13 @@ Error TypeStreamMerger::visitUnknownType(const CVRecord<TypeLeafKind> &Rec) { bool TypeStreamMerger::mergeStream(const CVTypeArray &Types) { assert(IndexMap.empty()); - TypeDeserializer Deserializer(*this); - CVTypeVisitor Visitor(Deserializer); + TypeVisitorCallbackPipeline Pipeline; + + TypeDeserializer Deserializer; + Pipeline.addCallbackToPipeline(Deserializer); + Pipeline.addCallbackToPipeline(*this); + + CVTypeVisitor Visitor(Pipeline); if (auto EC = Visitor.visitTypeStream(Types)) { consumeError(std::move(EC)); diff --git a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp index 424ef0ef441..74200e70119 100644 --- a/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp +++ b/llvm/lib/DebugInfo/PDB/Raw/TpiStream.cpp @@ -14,6 +14,7 @@ #include "llvm/DebugInfo/CodeView/TypeDeserializer.h" #include "llvm/DebugInfo/CodeView/TypeIndex.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h" #include "llvm/DebugInfo/MSF/MappedBlockStream.h" #include "llvm/DebugInfo/MSF/StreamReader.h" #include "llvm/DebugInfo/PDB/Raw/Hash.h" @@ -160,8 +161,13 @@ private: // Currently we only verify SRC_LINE records. Error TpiStream::verifyHashValues() { TpiHashVerifier Verifier(HashValues, Header->NumHashBuckets); - TypeDeserializer Deserializer(Verifier); - CVTypeVisitor Visitor(Deserializer); + TypeDeserializer Deserializer; + + TypeVisitorCallbackPipeline Pipeline; + Pipeline.addCallbackToPipeline(Deserializer); + Pipeline.addCallbackToPipeline(Verifier); + + CVTypeVisitor Visitor(Pipeline); return Visitor.visitTypeStream(TypeRecords); } diff --git a/llvm/tools/llvm-pdbdump/CodeViewYaml.cpp b/llvm/tools/llvm-pdbdump/CodeViewYaml.cpp index 690e46fb041..96bf1c19aa6 100644 --- a/llvm/tools/llvm-pdbdump/CodeViewYaml.cpp +++ b/llvm/tools/llvm-pdbdump/CodeViewYaml.cpp @@ -13,6 +13,7 @@ #include "llvm/DebugInfo/CodeView/EnumTables.h" #include "llvm/DebugInfo/CodeView/TypeDeserializer.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" +#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h" using namespace llvm; using namespace llvm::codeview; @@ -240,10 +241,14 @@ template <> struct ScalarTraits<APSInt> { void MappingTraits<CVType>::mapping(IO &IO, CVType &Record) { if (IO.outputting()) { + codeview::TypeDeserializer Deserializer; codeview::yaml::YamlTypeDumperCallbacks Callbacks(IO); - codeview::TypeDeserializer Deserializer(Callbacks); - codeview::CVTypeVisitor Visitor(Deserializer); + codeview::TypeVisitorCallbackPipeline Pipeline; + Pipeline.addCallbackToPipeline(Deserializer); + Pipeline.addCallbackToPipeline(Callbacks); + + codeview::CVTypeVisitor Visitor(Pipeline); consumeError(Visitor.visitTypeRecord(Record)); } } @@ -252,8 +257,13 @@ void MappingTraits<FieldListRecord>::mapping(IO &IO, FieldListRecord &FieldList) { if (IO.outputting()) { codeview::yaml::YamlTypeDumperCallbacks Callbacks(IO); - codeview::TypeDeserializer Deserializer(Callbacks); - codeview::CVTypeVisitor Visitor(Deserializer); + codeview::TypeDeserializer Deserializer; + + codeview::TypeVisitorCallbackPipeline Pipeline; + Pipeline.addCallbackToPipeline(Deserializer); + Pipeline.addCallbackToPipeline(Callbacks); + + codeview::CVTypeVisitor Visitor(Pipeline); consumeError(Visitor.visitFieldListMemberStream(FieldList.Data)); } } diff --git a/llvm/tools/llvm-pdbdump/PdbYaml.cpp b/llvm/tools/llvm-pdbdump/PdbYaml.cpp index 187264acdbe..566d6b89986 100644 --- a/llvm/tools/llvm-pdbdump/PdbYaml.cpp +++ b/llvm/tools/llvm-pdbdump/PdbYaml.cpp @@ -8,10 +8,12 @@ //===----------------------------------------------------------------------===// #include "PdbYaml.h" + #include "CodeViewYaml.h" #include "llvm/DebugInfo/CodeView/CVTypeVisitor.h" #include "llvm/DebugInfo/CodeView/TypeDeserializer.h" +#include "llvm/DebugInfo/CodeView/TypeVisitorCallbackPipeline.h" #include "llvm/DebugInfo/PDB/PDBExtras.h" #include "llvm/DebugInfo/PDB/PDBTypes.h" #include "llvm/DebugInfo/PDB/Raw/PDBFile.h" @@ -200,11 +202,14 @@ void MappingTraits<PdbDbiModuleInfo>::mapping(IO &IO, PdbDbiModuleInfo &Obj) { void MappingTraits<PdbTpiRecord>::mapping(IO &IO, pdb::yaml::PdbTpiRecord &Obj) { if (IO.outputting()) { - // If we're going from Pdb To Yaml, deserialize the Pdb record + codeview::TypeDeserializer Deserializer; codeview::yaml::YamlTypeDumperCallbacks Callbacks(IO); - codeview::TypeDeserializer Deserializer(Callbacks); - codeview::CVTypeVisitor Visitor(Deserializer); + codeview::TypeVisitorCallbackPipeline Pipeline; + Pipeline.addCallbackToPipeline(Deserializer); + Pipeline.addCallbackToPipeline(Callbacks); + + codeview::CVTypeVisitor Visitor(Pipeline); consumeError(Visitor.visitTypeRecord(Obj.Record)); } else { codeview::yaml::YamlTypeDumperCallbacks Callbacks(IO); |