[codeview] Make FieldList records print as a yaml sequence.

Before we were kind of imitating the behavior of a Yaml sequence
by outputting each record one after the other.  This makes it a
little cumbersome when we want to go the other direction -- from
Yaml to Pdb.  So this treats FieldList records as no different than
any other list of records, by printing them as a Yaml sequence with
the exact same format.

llvm-svn: 280549
This commit is contained in:
Zachary Turner 2016-09-02 22:19:01 +00:00
parent dad2b88c7d
commit 83849415de
3 changed files with 536 additions and 483 deletions

File diff suppressed because it is too large Load Diff

View File

@ -8,6 +8,7 @@
//===----------------------------------------------------------------------===//
#include "CodeViewYaml.h"
#include "PdbYaml.h"
#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h"
#include "llvm/DebugInfo/CodeView/EnumTables.h"
@ -25,6 +26,38 @@ LLVM_YAML_IS_SEQUENCE_VECTOR(OneMethodRecord)
LLVM_YAML_IS_SEQUENCE_VECTOR(VFTableSlotKind)
LLVM_YAML_IS_SEQUENCE_VECTOR(StringRef)
LLVM_YAML_IS_SEQUENCE_VECTOR(CVType)
LLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbTpiRecord)
namespace {
struct FieldListRecordSplitter : public TypeVisitorCallbacks {
public:
explicit FieldListRecordSplitter(
std::vector<llvm::pdb::yaml::PdbTpiRecord> &Records)
: Records(Records) {}
#define TYPE_RECORD(EnumName, EnumVal, Name)
#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
#define MEMBER_RECORD(EnumName, EnumVal, Name) \
Error visitKnownRecord(const CVType &CVT, Name##Record &Record) override { \
visitKnownRecordImpl(CVT); \
return Error::success(); \
}
#include "llvm/DebugInfo/CodeView/TypeRecords.def"
private:
void visitKnownRecordImpl(const CVType &CVT) {
llvm::pdb::yaml::PdbTpiRecord R;
R.Record = CVT;
R.RecordData.assign(CVT.RawData.begin(), CVT.RawData.end());
R.Record.Data = R.RecordData;
R.Record.RawData = R.RecordData;
Records.push_back(std::move(R));
}
std::vector<llvm::pdb::yaml::PdbTpiRecord> &Records;
};
}
namespace llvm {
namespace yaml {
@ -518,3 +551,15 @@ llvm::codeview::yaml::YamlTypeDumperCallbacks::visitTypeBegin(
YamlIO.mapRequired("Kind", K);
return K;
}
void llvm::codeview::yaml::YamlTypeDumperCallbacks::visitKnownRecordImpl(
const char *Name, const CVType &Type, FieldListRecord &FieldList) {
std::vector<llvm::pdb::yaml::PdbTpiRecord> Records;
if (YamlIO.outputting()) {
FieldListRecordSplitter Splitter(Records);
CVTypeVisitor V(Splitter);
consumeError(V.visitFieldListMemberStream(FieldList.Data));
}
YamlIO.mapRequired(Name, Records);
}

View File

@ -27,7 +27,7 @@ public:
#define TYPE_RECORD(EnumName, EnumVal, Name) \
Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, \
Name##Record &Record) override { \
YamlIO.mapRequired(#Name, Record); \
visitKnownRecordImpl(#Name, CVR, Record); \
return Error::success(); \
}
#define MEMBER_RECORD(EnumName, EnumVal, Name) \
@ -37,6 +37,14 @@ public:
#include "llvm/DebugInfo/CodeView/TypeRecords.def"
private:
template <typename T>
void visitKnownRecordImpl(const char *Name, const CVType &Type, T &Record) {
YamlIO.mapRequired(Name, Record);
}
void visitKnownRecordImpl(const char *Name, const CVType &Type,
FieldListRecord &FieldList);
llvm::yaml::IO &YamlIO;
};
}