diff options
author | Dimitry Andric <dim@FreeBSD.org> | 2017-05-17 20:22:39 +0000 |
---|---|---|
committer | Dimitry Andric <dim@FreeBSD.org> | 2017-05-17 20:22:39 +0000 |
commit | 7af96fb3afd6725a2824a0a5ca5dad34e5e0b056 (patch) | |
tree | 6661ffbabf869009597684462f5a3df3beccc952 /tools | |
parent | 6b3f41ed88e8e440e11a4fbf20b6600529f80049 (diff) |
Notes
Diffstat (limited to 'tools')
-rw-r--r-- | tools/llvm-pdbdump/Analyze.cpp | 15 | ||||
-rw-r--r-- | tools/llvm-pdbdump/LLVMOutputStyle.cpp | 32 | ||||
-rw-r--r-- | tools/llvm-pdbdump/PdbYaml.cpp | 14 | ||||
-rw-r--r-- | tools/llvm-pdbdump/YamlTypeDumper.cpp | 80 |
4 files changed, 49 insertions, 92 deletions
diff --git a/tools/llvm-pdbdump/Analyze.cpp b/tools/llvm-pdbdump/Analyze.cpp index f7d6ec53b030f..ab4477ed7bad9 100644 --- a/tools/llvm-pdbdump/Analyze.cpp +++ b/tools/llvm-pdbdump/Analyze.cpp @@ -76,26 +76,15 @@ Error AnalysisStyle::dump() { TypeDatabase TypeDB(Tpi->getNumTypeRecords()); TypeDatabaseVisitor DBV(TypeDB); - TypeDeserializer Deserializer; TypeVisitorCallbackPipeline Pipeline; HashLookupVisitor Hasher(*Tpi); - // Deserialize the types - Pipeline.addCallbackToPipeline(Deserializer); // Add them to the database Pipeline.addCallbackToPipeline(DBV); // Store their hash values Pipeline.addCallbackToPipeline(Hasher); - CVTypeVisitor Visitor(Pipeline); - - bool Error = false; - for (auto Item : Tpi->types(&Error)) { - if (auto EC = Visitor.visitTypeRecord(Item)) - return EC; - } - if (Error) - return make_error<RawError>(raw_error_code::corrupt_file, - "TPI stream contained corrupt record"); + if (auto EC = codeview::visitTypeStream(Tpi->typeArray(), Pipeline)) + return EC; auto &Adjusters = Tpi->getHashAdjusters(); DenseSet<uint32_t> AdjusterSet; diff --git a/tools/llvm-pdbdump/LLVMOutputStyle.cpp b/tools/llvm-pdbdump/LLVMOutputStyle.cpp index e975a5220af69..c4fecb80ea5a5 100644 --- a/tools/llvm-pdbdump/LLVMOutputStyle.cpp +++ b/tools/llvm-pdbdump/LLVMOutputStyle.cpp @@ -178,11 +178,10 @@ public: private: Error dumpTypeRecord(StringRef Label, TypeDatabase &DB, TypeIndex Index) { CompactTypeDumpVisitor CTDV(DB, Index, &P); - CVTypeVisitor Visitor(CTDV); DictScope D(P, Label); if (DB.contains(Index)) { CVType &Type = DB.getTypeRecord(Index); - if (auto EC = Visitor.visitTypeRecord(Type)) + if (auto EC = codeview::visitTypeRecord(Type, CTDV)) return EC; } else { P.printString( @@ -629,7 +628,6 @@ Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) { std::vector<std::unique_ptr<TypeVisitorCallbacks>> Visitors; - Visitors.push_back(make_unique<TypeDeserializer>()); if (!StreamDB.hasValue()) { StreamDB.emplace(Tpi->getNumTypeRecords()); Visitors.push_back(make_unique<TypeDatabaseVisitor>(*StreamDB)); @@ -659,8 +657,6 @@ Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) { for (const auto &V : Visitors) Pipeline.addCallbackToPipeline(*V); - CVTypeVisitor Visitor(Pipeline); - if (DumpRecords || DumpRecordBytes) RecordScope = llvm::make_unique<ListScope>(P, "Records"); @@ -673,9 +669,10 @@ Error LLVMOutputStyle::dumpTpiStream(uint32_t StreamIdx) { if ((DumpRecords || DumpRecordBytes) && !opts::raw::CompactRecords) OneRecordScope = llvm::make_unique<DictScope>(P, ""); - if (auto EC = Visitor.visitTypeRecord(Type)) + if (auto EC = codeview::visitTypeRecord(Type, Pipeline)) return EC; - T.setIndex(T.getIndex() + 1); + + ++T; } if (HadError) return make_error<RawError>(raw_error_code::corrupt_file, @@ -730,22 +727,19 @@ Error LLVMOutputStyle::buildTypeDatabase(uint32_t SN) { DB.emplace(Tpi->getNumTypeRecords()); - TypeVisitorCallbackPipeline Pipeline; - TypeDeserializer Deserializer; TypeDatabaseVisitor DBV(*DB); - Pipeline.addCallbackToPipeline(Deserializer); - Pipeline.addCallbackToPipeline(DBV); auto HashValues = Tpi->getHashValues(); - std::unique_ptr<TpiHashVerifier> HashVerifier; - if (!HashValues.empty()) { - HashVerifier = - make_unique<TpiHashVerifier>(HashValues, Tpi->getNumHashBuckets()); - Pipeline.addCallbackToPipeline(*HashVerifier); - } + if (HashValues.empty()) + return codeview::visitTypeStream(Tpi->typeArray(), DBV); + + TypeVisitorCallbackPipeline Pipeline; + Pipeline.addCallbackToPipeline(DBV); + + TpiHashVerifier HashVerifier(HashValues, Tpi->getNumHashBuckets()); + Pipeline.addCallbackToPipeline(HashVerifier); - CVTypeVisitor Visitor(Pipeline); - return Visitor.visitTypeStream(Tpi->types(nullptr)); + return codeview::visitTypeStream(Tpi->typeArray(), Pipeline); } Error LLVMOutputStyle::dumpDbiStream() { diff --git a/tools/llvm-pdbdump/PdbYaml.cpp b/tools/llvm-pdbdump/PdbYaml.cpp index d6ba7d6454593..6527bec31a77c 100644 --- a/tools/llvm-pdbdump/PdbYaml.cpp +++ b/tools/llvm-pdbdump/PdbYaml.cpp @@ -371,16 +371,14 @@ void MappingContextTraits<PdbInlineeInfo, SerializationContext>::mapping( void MappingContextTraits<PdbTpiRecord, pdb::yaml::SerializationContext>:: mapping(IO &IO, pdb::yaml::PdbTpiRecord &Obj, pdb::yaml::SerializationContext &Context) { - codeview::TypeVisitorCallbackPipeline Pipeline; - codeview::TypeDeserializer Deserializer; - codeview::TypeSerializer Serializer(Context.Allocator); - pdb::TpiHashUpdater Hasher; if (IO.outputting()) { // For PDB to Yaml, deserialize into a high level record type, then dump it. - Pipeline.addCallbackToPipeline(Deserializer); - Pipeline.addCallbackToPipeline(Context.Dumper); + consumeError(codeview::visitTypeRecord(Obj.Record, Context.Dumper)); } else { + codeview::TypeVisitorCallbackPipeline Pipeline; + codeview::TypeSerializer Serializer(Context.Allocator); + pdb::TpiHashUpdater Hasher; // For Yaml to PDB, extract from the high level record type, then write it // to bytes. @@ -391,9 +389,9 @@ void MappingContextTraits<PdbTpiRecord, pdb::yaml::SerializationContext>:: Pipeline.addCallbackToPipeline(Context.Dumper); Pipeline.addCallbackToPipeline(Serializer); Pipeline.addCallbackToPipeline(Hasher); + consumeError(codeview::visitTypeRecord(Obj.Record, Pipeline, + codeview::VDS_BytesExternal)); } - codeview::CVTypeVisitor Visitor(Pipeline); - consumeError(Visitor.visitTypeRecord(Obj.Record)); Context.ActiveSerializer = nullptr; } diff --git a/tools/llvm-pdbdump/YamlTypeDumper.cpp b/tools/llvm-pdbdump/YamlTypeDumper.cpp index b4eb197e866a4..3e447ca60b61f 100644 --- a/tools/llvm-pdbdump/YamlTypeDumper.cpp +++ b/tools/llvm-pdbdump/YamlTypeDumper.cpp @@ -280,16 +280,8 @@ bool ScalarTraits<APSInt>::mustQuote(StringRef Scalar) { return false; } void MappingContextTraits<CVType, pdb::yaml::SerializationContext>::mapping( IO &IO, CVType &Record, pdb::yaml::SerializationContext &Context) { - if (IO.outputting()) { - codeview::TypeDeserializer Deserializer; - - codeview::TypeVisitorCallbackPipeline Pipeline; - Pipeline.addCallbackToPipeline(Deserializer); - Pipeline.addCallbackToPipeline(Context.Dumper); - - codeview::CVTypeVisitor Visitor(Pipeline); - consumeError(Visitor.visitTypeRecord(Record)); - } + if (IO.outputting()) + consumeError(codeview::visitTypeRecord(Record, Context.Dumper)); } void MappingTraits<StringIdRecord>::mapping(IO &IO, StringIdRecord &String) { @@ -556,26 +548,17 @@ void llvm::codeview::yaml::YamlTypeDumperCallbacks::visitKnownRecordImpl( // (top-level and member fields all have the exact same Yaml syntax so use // the same parser). FieldListRecordSplitter Splitter(FieldListRecords); - CVTypeVisitor V(Splitter); - consumeError(V.visitFieldListMemberStream(FieldList.Data)); - YamlIO.mapRequired("FieldList", FieldListRecords, Context); - } else { - // If we are not outputting, then the array contains no data starting out, - // and is instead populated from the sequence represented by the yaml -- - // again, using the same logic that we use for top-level records. - assert(Context.ActiveSerializer && "There is no active serializer!"); - codeview::TypeVisitorCallbackPipeline Pipeline; - pdb::TpiHashUpdater Hasher; - - // For Yaml to PDB, dump it (to fill out the record fields from the Yaml) - // then serialize those fields to bytes, then update their hashes. - Pipeline.addCallbackToPipeline(Context.Dumper); - Pipeline.addCallbackToPipeline(*Context.ActiveSerializer); - Pipeline.addCallbackToPipeline(Hasher); - - codeview::CVTypeVisitor Visitor(Pipeline); - YamlIO.mapRequired("FieldList", FieldListRecords, Visitor); + consumeError(codeview::visitMemberRecordStream(FieldList.Data, Splitter)); } + // Note that if we're not outputting (i.e. Yaml -> PDB) the result of this + // mapping gets lost, as the records are simply stored in this locally scoped + // vector. What's important though is they are all sharing a single + // Serializer + // instance (in `Context.ActiveSerializer`), and that is building up a list of + // all the types. The fact that we need a throwaway vector here is just to + // appease the YAML API to treat this as a sequence and do this mapping once + // for each YAML Sequence element in the input Yaml stream. + YamlIO.mapRequired("FieldList", FieldListRecords, Context); } namespace llvm { @@ -585,29 +568,22 @@ struct MappingContextTraits<pdb::yaml::PdbTpiFieldListRecord, pdb::yaml::SerializationContext> { static void mapping(IO &IO, pdb::yaml::PdbTpiFieldListRecord &Obj, pdb::yaml::SerializationContext &Context) { - assert(IO.outputting()); - codeview::TypeVisitorCallbackPipeline Pipeline; - - BinaryByteStream Data(Obj.Record.Data, llvm::support::little); - BinaryStreamReader FieldReader(Data); - codeview::FieldListDeserializer Deserializer(FieldReader); - - // For PDB to Yaml, deserialize into a high level record type, then dump - // it. - Pipeline.addCallbackToPipeline(Deserializer); - Pipeline.addCallbackToPipeline(Context.Dumper); - - codeview::CVTypeVisitor Visitor(Pipeline); - consumeError(Visitor.visitMemberRecord(Obj.Record)); - } -}; - -template <> -struct MappingContextTraits<pdb::yaml::PdbTpiFieldListRecord, - codeview::CVTypeVisitor> { - static void mapping(IO &IO, pdb::yaml::PdbTpiFieldListRecord &Obj, - codeview::CVTypeVisitor &Visitor) { - consumeError(Visitor.visitMemberRecord(Obj.Record)); + if (IO.outputting()) + consumeError(codeview::visitMemberRecord(Obj.Record, Context.Dumper)); + else { + // If we are not outputting, then the array contains no data starting out, + // and is instead populated from the sequence represented by the yaml -- + // again, using the same logic that we use for top-level records. + assert(Context.ActiveSerializer && "There is no active serializer!"); + codeview::TypeVisitorCallbackPipeline Pipeline; + pdb::TpiHashUpdater Hasher; + + Pipeline.addCallbackToPipeline(Context.Dumper); + Pipeline.addCallbackToPipeline(*Context.ActiveSerializer); + Pipeline.addCallbackToPipeline(Hasher); + consumeError( + codeview::visitMemberRecord(Obj.Record, Pipeline, VDS_BytesExternal)); + } } }; } |