diff options
author | Zachary Turner <zturner@google.com> | 2016-08-31 21:42:26 +0000 |
---|---|---|
committer | Zachary Turner <zturner@google.com> | 2016-08-31 21:42:26 +0000 |
commit | 2f951ce9c9d3a0b23c5a6eff092e13b6b08b16f8 (patch) | |
tree | e5e300379ab86f6fd3e6b0c126a487dbf9e5f614 /llvm/lib | |
parent | 11a235467088c800fe0a7323cb18a55fe9fe0cd3 (diff) | |
download | bcm5719-llvm-2f951ce9c9d3a0b23c5a6eff092e13b6b08b16f8.tar.gz bcm5719-llvm-2f951ce9c9d3a0b23c5a6eff092e13b6b08b16f8.zip |
[codeview] Add TypeVisitorCallbackPipeline.
We were kind of hacking this together before by embedding the
ability to forward requests into the TypeDeserializer. When
we want to start adding more different kinds of visitor callback
interfaces though, this doesn't scale well and is very inflexible.
So introduce the notion of a pipeline, which itself implements
the TypeVisitorCallbacks interface, but which contains an internal
list of other callbacks to invoke in sequence.
Also update the existing uses of CVTypeVisitor to use this new
pipeline class for deserializing records before visiting them
with another visitor.
llvm-svn: 280293
Diffstat (limited to 'llvm/lib')
-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 |
3 files changed, 42 insertions, 12 deletions
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); } |