//===- 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_PDBYAML_H #define LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H #include "OutputStyle.h" #include "llvm/ADT/Optional.h" #include "llvm/DebugInfo/CodeView/SymbolRecord.h" #include "llvm/DebugInfo/CodeView/TypeRecord.h" #include "llvm/DebugInfo/MSF/MSFCommon.h" #include "llvm/DebugInfo/PDB/Native/PDBFile.h" #include "llvm/DebugInfo/PDB/Native/RawConstants.h" #include "llvm/DebugInfo/PDB/PDBTypes.h" #include "llvm/Support/Endian.h" #include "llvm/Support/YAMLTraits.h" #include namespace llvm { namespace pdb { namespace yaml { struct SerializationContext; struct MSFHeaders { msf::SuperBlock SuperBlock; uint32_t NumDirectoryBlocks = 0; std::vector DirectoryBlocks; uint32_t NumStreams = 0; uint32_t FileSize = 0; }; struct StreamBlockList { std::vector Blocks; }; struct NamedStreamMapping { StringRef StreamName; uint32_t StreamNumber; }; struct PdbInfoStream { PdbRaw_ImplVer Version = PdbImplVC70; uint32_t Signature = 0; uint32_t Age = 1; PDB_UniqueId Guid; std::vector Features; std::vector NamedStreams; }; struct PdbSymbolRecord { codeview::CVSymbol Record; }; struct PdbModiStream { uint32_t Signature; std::vector Symbols; }; struct PdbSourceLineEntry { uint32_t Offset; uint32_t LineStart; uint32_t EndDelta; bool IsStatement; }; struct PdbSourceColumnEntry { uint16_t StartColumn; uint16_t EndColumn; }; struct PdbSourceLineBlock { StringRef FileName; std::vector Lines; std::vector Columns; }; struct HexFormattedString { std::vector Bytes; }; struct PdbSourceFileChecksumEntry { StringRef FileName; codeview::FileChecksumKind Kind; HexFormattedString ChecksumBytes; }; struct PdbSourceLineInfo { uint32_t RelocOffset; uint32_t RelocSegment; codeview::LineFlags Flags; uint32_t CodeSize; std::vector Blocks; }; struct PdbInlineeSite { codeview::TypeIndex Inlinee; StringRef FileName; uint32_t SourceLineNum; std::vector ExtraFiles; }; struct PdbInlineeInfo { bool HasExtraFiles; std::vector Sites; }; struct PdbSourceFileInfo { std::vector FileChecksums; std::vector LineFragments; std::vector Inlinees; }; struct PdbDbiModuleInfo { StringRef Obj; StringRef Mod; std::vector SourceFiles; Optional FileLineInfo; Optional Modi; }; struct PdbDbiStream { PdbRaw_DbiVer VerHeader = PdbDbiV70; uint32_t Age = 1; uint16_t BuildNumber = 0; uint32_t PdbDllVersion = 0; uint16_t PdbDllRbld = 0; uint16_t Flags = 1; PDB_Machine MachineType = PDB_Machine::x86; std::vector ModInfos; }; struct PdbTpiRecord { codeview::CVType Record; }; struct PdbTpiFieldListRecord { codeview::CVMemberRecord Record; }; struct PdbTpiStream { PdbRaw_TpiVer Version = PdbTpiV80; std::vector Records; }; struct PdbObject { explicit PdbObject(BumpPtrAllocator &Allocator) : Allocator(Allocator) {} Optional Headers; Optional> StreamSizes; Optional> StreamMap; Optional PdbStream; Optional DbiStream; Optional TpiStream; Optional IpiStream; Optional> StringTable; BumpPtrAllocator &Allocator; }; } } } namespace llvm { namespace yaml { template <> struct MappingTraits { static void mapping(IO &IO, pdb::yaml::PdbObject &Obj); }; template <> struct MappingTraits { static void mapping(IO &IO, pdb::yaml::MSFHeaders &Obj); }; template <> struct MappingTraits { static void mapping(IO &IO, msf::SuperBlock &SB); }; template <> struct MappingTraits { static void mapping(IO &IO, pdb::yaml::StreamBlockList &SB); }; template <> struct MappingTraits { static void mapping(IO &IO, pdb::yaml::PdbInfoStream &Obj); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbDbiStream &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbTpiStream &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingTraits { static void mapping(IO &IO, pdb::yaml::NamedStreamMapping &Obj); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbSymbolRecord &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbModiStream &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbDbiModuleInfo &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbSourceLineEntry &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbSourceColumnEntry &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbSourceLineBlock &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbSourceFileChecksumEntry &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct ScalarTraits { static void output(const pdb::yaml::HexFormattedString &Value, void *ctx, llvm::raw_ostream &Out); static StringRef input(StringRef Scalar, void *ctxt, pdb::yaml::HexFormattedString &Value); static bool mustQuote(StringRef) { return false; } }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbSourceLineInfo &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbSourceFileInfo &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbInlineeInfo &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbInlineeSite &Obj, pdb::yaml::SerializationContext &Context); }; template <> struct MappingContextTraits { static void mapping(IO &IO, pdb::yaml::PdbTpiRecord &Obj, pdb::yaml::SerializationContext &Context); }; } } #endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H