mirror of
https://github.com/RPCS3/llvm.git
synced 2025-02-02 00:35:27 +00:00
0ae82de8f5
Previously we were assuming that any visitation of types would necessarily be against a type we had binary data for. Reasonable assumption when were just reading PDBs and dumping them, but once we start writing PDBs from Yaml this breaks down, because we have no binary data yet, only Yaml, and from that we need to read the record kind and perform the switch based on that. So this patch does that. Instead of having the visitor switch on the kind that is already in the CVType record, we change the visitTypeBegin() method to return the Kind, and switch on the returned value. This way, the default implementation can still return the value from the CVType, but the implementation which visits Yaml records and serializes binary PDB type records can use the field in the Yaml as the source of the switch. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@280307 91177308-0d34-0410-b5e6-96231b3b80d8
73 lines
2.5 KiB
C++
73 lines
2.5 KiB
C++
//===- PdbYAML.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_CODEVIEWYAML_H
|
|
#define LLVM_TOOLS_LLVMPDBDUMP_CODEVIEWYAML_H
|
|
|
|
#include "llvm/DebugInfo/CodeView/CodeView.h"
|
|
#include "llvm/DebugInfo/CodeView/TypeVisitorCallbacks.h"
|
|
#include "llvm/Support/YAMLTraits.h"
|
|
|
|
namespace llvm {
|
|
namespace codeview {
|
|
namespace yaml {
|
|
class YamlTypeDumperCallbacks : public TypeVisitorCallbacks {
|
|
public:
|
|
YamlTypeDumperCallbacks(llvm::yaml::IO &IO) : YamlIO(IO) {}
|
|
|
|
virtual Expected<TypeLeafKind>
|
|
visitTypeBegin(const CVRecord<TypeLeafKind> &Record) override;
|
|
|
|
#define TYPE_RECORD(EnumName, EnumVal, Name) \
|
|
Error visitKnownRecord(const CVRecord<TypeLeafKind> &CVR, \
|
|
Name##Record &Record) override { \
|
|
YamlIO.mapRequired(#Name, Record); \
|
|
return Error::success(); \
|
|
}
|
|
#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"
|
|
|
|
private:
|
|
llvm::yaml::IO &YamlIO;
|
|
};
|
|
}
|
|
}
|
|
}
|
|
|
|
namespace llvm {
|
|
namespace yaml {
|
|
template <> struct MappingTraits<codeview::MemberPointerInfo> {
|
|
static void mapping(IO &IO, codeview::MemberPointerInfo &Obj);
|
|
};
|
|
|
|
template <> struct MappingTraits<codeview::CVType> {
|
|
static void mapping(IO &IO, codeview::CVType &Obj);
|
|
};
|
|
|
|
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
|