mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-27 14:45:24 +00:00
730695675c
Previously support had been added for using CodeViewRecordIO to read (deserialize) CodeView type records. This patch adds support for writing those same records. With this patch, reading and writing of CodeView type records finally uses a single codepath. Differential Revision: https://reviews.llvm.org/D26253 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@286304 91177308-0d34-0410-b5e6-96231b3b80d8
117 lines
4.0 KiB
C++
117 lines
4.0 KiB
C++
//===- YamlTypeDumper.h --------------------------------------- *- C++ --*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef LLVM_TOOLS_LLVMPDBDUMP_YAMLTYPEDUMPER_H
|
|
#define LLVM_TOOLS_LLVMPDBDUMP_YAMLTYPEDUMPER_H
|
|
|
|
#include "llvm/DebugInfo/CodeView/CodeView.h"
|
|
#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
|
|
#include "llvm/Support/YAMLTraits.h"
|
|
|
|
namespace llvm {
|
|
namespace pdb {
|
|
namespace yaml {
|
|
struct SerializationContext;
|
|
}
|
|
}
|
|
namespace codeview {
|
|
namespace yaml {
|
|
class YamlTypeDumperCallbacks : public TypeVisitorCallbacks {
|
|
public:
|
|
YamlTypeDumperCallbacks(llvm::yaml::IO &IO,
|
|
llvm::pdb::yaml::SerializationContext &Context)
|
|
: YamlIO(IO), Context(Context) {}
|
|
|
|
virtual Error visitTypeBegin(CVType &Record) override;
|
|
virtual Error visitMemberBegin(CVMemberRecord &Record) override;
|
|
|
|
#define TYPE_RECORD(EnumName, EnumVal, Name) \
|
|
Error visitKnownRecord(CVRecord<TypeLeafKind> &CVR, Name##Record &Record) \
|
|
override { \
|
|
visitKnownRecordImpl(#Name, CVR, Record); \
|
|
return Error::success(); \
|
|
}
|
|
#define MEMBER_RECORD(EnumName, EnumVal, Name) \
|
|
Error visitKnownMember(CVMemberRecord &CVR, Name##Record &Record) override { \
|
|
visitKnownMemberImpl(#Name, Record); \
|
|
return Error::success(); \
|
|
}
|
|
#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
|
|
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
|
|
#include "llvm/DebugInfo/CodeView/TypeRecords.def"
|
|
|
|
private:
|
|
template <typename T> void visitKnownMemberImpl(const char *Name, T &Record) {
|
|
YamlIO.mapRequired(Name, Record);
|
|
}
|
|
|
|
template <typename T>
|
|
void visitKnownRecordImpl(const char *Name, CVType &Type, T &Record) {
|
|
YamlIO.mapRequired(Name, Record);
|
|
}
|
|
|
|
void visitKnownRecordImpl(const char *Name, CVType &CVR,
|
|
FieldListRecord &FieldList);
|
|
|
|
llvm::yaml::IO &YamlIO;
|
|
llvm::pdb::yaml::SerializationContext &Context;
|
|
};
|
|
}
|
|
}
|
|
namespace pdb {
|
|
namespace yaml {
|
|
struct SerializationContext;
|
|
}
|
|
}
|
|
}
|
|
|
|
namespace llvm {
|
|
namespace yaml {
|
|
|
|
template <> struct ScalarTraits<APSInt> {
|
|
static void output(const APSInt &S, void *, llvm::raw_ostream &OS);
|
|
static StringRef input(StringRef Scalar, void *Ctx, APSInt &S);
|
|
static bool mustQuote(StringRef Scalar);
|
|
};
|
|
|
|
template <> struct ScalarTraits<codeview::TypeIndex> {
|
|
static void output(const codeview::TypeIndex &S, void *,
|
|
llvm::raw_ostream &OS);
|
|
static StringRef input(StringRef Scalar, void *Ctx, codeview::TypeIndex &S);
|
|
static bool mustQuote(StringRef Scalar);
|
|
};
|
|
|
|
template <> struct MappingTraits<codeview::MemberPointerInfo> {
|
|
static void mapping(IO &IO, codeview::MemberPointerInfo &Obj);
|
|
};
|
|
|
|
template <>
|
|
struct MappingContextTraits<codeview::CVType, pdb::yaml::SerializationContext> {
|
|
static void mapping(IO &IO, codeview::CVType &Obj,
|
|
pdb::yaml::SerializationContext &Context);
|
|
};
|
|
|
|
template <> struct ScalarEnumerationTraits<codeview::TypeLeafKind> {
|
|
static void enumeration(IO &io, codeview::TypeLeafKind &Value);
|
|
};
|
|
|
|
#define TYPE_RECORD(EnumName, EnumVal, Name) \
|
|
template <> struct MappingTraits<codeview::Name##Record> { \
|
|
static void mapping(IO &IO, codeview::Name##Record &Obj); \
|
|
};
|
|
#define MEMBER_RECORD(EnumName, EnumVal, Name) \
|
|
TYPE_RECORD(EnumName, EnumVal, Name)
|
|
#define TYPE_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
|
|
#define MEMBER_RECORD_ALIAS(EnumName, EnumVal, Name, AliasName)
|
|
#include "llvm/DebugInfo/CodeView/TypeRecords.def"
|
|
}
|
|
}
|
|
|
|
#endif
|