summaryrefslogtreecommitdiff
path: root/tools
diff options
context:
space:
mode:
authorDimitry Andric <dim@FreeBSD.org>2017-05-17 20:22:39 +0000
committerDimitry Andric <dim@FreeBSD.org>2017-05-17 20:22:39 +0000
commit7af96fb3afd6725a2824a0a5ca5dad34e5e0b056 (patch)
tree6661ffbabf869009597684462f5a3df3beccc952 /tools
parent6b3f41ed88e8e440e11a4fbf20b6600529f80049 (diff)
Notes
Diffstat (limited to 'tools')
-rw-r--r--tools/llvm-pdbdump/Analyze.cpp15
-rw-r--r--tools/llvm-pdbdump/LLVMOutputStyle.cpp32
-rw-r--r--tools/llvm-pdbdump/PdbYaml.cpp14
-rw-r--r--tools/llvm-pdbdump/YamlTypeDumper.cpp80
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));
+ }
}
};
}