forked from OSchip/llvm-project
[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:
parent
dad2b88c7d
commit
83849415de
File diff suppressed because it is too large
Load Diff
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
};
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue