1353358Sdim//===-- PdbYaml.cpp ------------------------------------------- *- C++ --*-===// 2319780Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6319780Sdim// 7319780Sdim//===----------------------------------------------------------------------===// 8319780Sdim 9319780Sdim#include "PdbYaml.h" 10319780Sdim 11319780Sdim#include "llvm/ADT/StringExtras.h" 12319780Sdim#include "llvm/DebugInfo/CodeView/CVTypeVisitor.h" 13319780Sdim#include "llvm/DebugInfo/PDB/Native/PDBFile.h" 14319780Sdim#include "llvm/DebugInfo/PDB/Native/RawTypes.h" 15319780Sdim#include "llvm/DebugInfo/PDB/Native/TpiHashing.h" 16319780Sdim#include "llvm/DebugInfo/PDB/PDBTypes.h" 17319780Sdim#include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h" 18319780Sdim#include "llvm/ObjectYAML/CodeViewYAMLTypes.h" 19319780Sdim 20319780Sdimusing namespace llvm; 21319780Sdimusing namespace llvm::pdb; 22319780Sdimusing namespace llvm::pdb::yaml; 23319780Sdimusing namespace llvm::yaml; 24319780Sdim 25319780SdimLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::NamedStreamMapping) 26319780SdimLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::PdbDbiModuleInfo) 27319780SdimLLVM_YAML_IS_SEQUENCE_VECTOR(llvm::pdb::yaml::StreamBlockList) 28319780SdimLLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(llvm::pdb::PdbRaw_FeatureSig) 29319780Sdim 30319780Sdimnamespace llvm { 31319780Sdimnamespace yaml { 32319780Sdim 33319780Sdimtemplate <> struct ScalarEnumerationTraits<llvm::pdb::PDB_Machine> { 34319780Sdim static void enumeration(IO &io, llvm::pdb::PDB_Machine &Value) { 35319780Sdim io.enumCase(Value, "Invalid", PDB_Machine::Invalid); 36319780Sdim io.enumCase(Value, "Am33", PDB_Machine::Am33); 37319780Sdim io.enumCase(Value, "Amd64", PDB_Machine::Amd64); 38319780Sdim io.enumCase(Value, "Arm", PDB_Machine::Arm); 39319780Sdim io.enumCase(Value, "ArmNT", PDB_Machine::ArmNT); 40319780Sdim io.enumCase(Value, "Ebc", PDB_Machine::Ebc); 41319780Sdim io.enumCase(Value, "x86", PDB_Machine::x86); 42319780Sdim io.enumCase(Value, "Ia64", PDB_Machine::Ia64); 43319780Sdim io.enumCase(Value, "M32R", PDB_Machine::M32R); 44319780Sdim io.enumCase(Value, "Mips16", PDB_Machine::Mips16); 45319780Sdim io.enumCase(Value, "MipsFpu", PDB_Machine::MipsFpu); 46319780Sdim io.enumCase(Value, "MipsFpu16", PDB_Machine::MipsFpu16); 47319780Sdim io.enumCase(Value, "PowerPCFP", PDB_Machine::PowerPCFP); 48319780Sdim io.enumCase(Value, "R4000", PDB_Machine::R4000); 49319780Sdim io.enumCase(Value, "SH3", PDB_Machine::SH3); 50319780Sdim io.enumCase(Value, "SH3DSP", PDB_Machine::SH3DSP); 51319780Sdim io.enumCase(Value, "Thumb", PDB_Machine::Thumb); 52319780Sdim io.enumCase(Value, "WceMipsV2", PDB_Machine::WceMipsV2); 53353358Sdim io.enumCase(Value, "Arm64", PDB_Machine::Arm64); 54319780Sdim } 55319780Sdim}; 56319780Sdim 57319780Sdimtemplate <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_DbiVer> { 58319780Sdim static void enumeration(IO &io, llvm::pdb::PdbRaw_DbiVer &Value) { 59319780Sdim io.enumCase(Value, "V41", llvm::pdb::PdbRaw_DbiVer::PdbDbiVC41); 60319780Sdim io.enumCase(Value, "V50", llvm::pdb::PdbRaw_DbiVer::PdbDbiV50); 61319780Sdim io.enumCase(Value, "V60", llvm::pdb::PdbRaw_DbiVer::PdbDbiV60); 62319780Sdim io.enumCase(Value, "V70", llvm::pdb::PdbRaw_DbiVer::PdbDbiV70); 63319780Sdim io.enumCase(Value, "V110", llvm::pdb::PdbRaw_DbiVer::PdbDbiV110); 64319780Sdim } 65319780Sdim}; 66319780Sdim 67319780Sdimtemplate <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_ImplVer> { 68319780Sdim static void enumeration(IO &io, llvm::pdb::PdbRaw_ImplVer &Value) { 69319780Sdim io.enumCase(Value, "VC2", llvm::pdb::PdbRaw_ImplVer::PdbImplVC2); 70319780Sdim io.enumCase(Value, "VC4", llvm::pdb::PdbRaw_ImplVer::PdbImplVC4); 71319780Sdim io.enumCase(Value, "VC41", llvm::pdb::PdbRaw_ImplVer::PdbImplVC41); 72319780Sdim io.enumCase(Value, "VC50", llvm::pdb::PdbRaw_ImplVer::PdbImplVC50); 73319780Sdim io.enumCase(Value, "VC98", llvm::pdb::PdbRaw_ImplVer::PdbImplVC98); 74319780Sdim io.enumCase(Value, "VC70Dep", llvm::pdb::PdbRaw_ImplVer::PdbImplVC70Dep); 75319780Sdim io.enumCase(Value, "VC70", llvm::pdb::PdbRaw_ImplVer::PdbImplVC70); 76319780Sdim io.enumCase(Value, "VC80", llvm::pdb::PdbRaw_ImplVer::PdbImplVC80); 77319780Sdim io.enumCase(Value, "VC110", llvm::pdb::PdbRaw_ImplVer::PdbImplVC110); 78319780Sdim io.enumCase(Value, "VC140", llvm::pdb::PdbRaw_ImplVer::PdbImplVC140); 79319780Sdim } 80319780Sdim}; 81319780Sdim 82319780Sdimtemplate <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_TpiVer> { 83319780Sdim static void enumeration(IO &io, llvm::pdb::PdbRaw_TpiVer &Value) { 84319780Sdim io.enumCase(Value, "VC40", llvm::pdb::PdbRaw_TpiVer::PdbTpiV40); 85319780Sdim io.enumCase(Value, "VC41", llvm::pdb::PdbRaw_TpiVer::PdbTpiV41); 86319780Sdim io.enumCase(Value, "VC50", llvm::pdb::PdbRaw_TpiVer::PdbTpiV50); 87319780Sdim io.enumCase(Value, "VC70", llvm::pdb::PdbRaw_TpiVer::PdbTpiV70); 88319780Sdim io.enumCase(Value, "VC80", llvm::pdb::PdbRaw_TpiVer::PdbTpiV80); 89319780Sdim } 90319780Sdim}; 91319780Sdim 92319780Sdimtemplate <> struct ScalarEnumerationTraits<llvm::pdb::PdbRaw_FeatureSig> { 93319780Sdim static void enumeration(IO &io, PdbRaw_FeatureSig &Features) { 94319780Sdim io.enumCase(Features, "MinimalDebugInfo", 95319780Sdim PdbRaw_FeatureSig::MinimalDebugInfo); 96319780Sdim io.enumCase(Features, "NoTypeMerge", PdbRaw_FeatureSig::NoTypeMerge); 97319780Sdim io.enumCase(Features, "VC110", PdbRaw_FeatureSig::VC110); 98319780Sdim io.enumCase(Features, "VC140", PdbRaw_FeatureSig::VC140); 99319780Sdim } 100319780Sdim}; 101319780Sdim} 102319780Sdim} 103319780Sdim 104319780Sdimvoid MappingTraits<PdbObject>::mapping(IO &IO, PdbObject &Obj) { 105319780Sdim IO.mapOptional("MSF", Obj.Headers); 106319780Sdim IO.mapOptional("StreamSizes", Obj.StreamSizes); 107319780Sdim IO.mapOptional("StreamMap", Obj.StreamMap); 108319780Sdim IO.mapOptional("StringTable", Obj.StringTable); 109319780Sdim IO.mapOptional("PdbStream", Obj.PdbStream); 110319780Sdim IO.mapOptional("DbiStream", Obj.DbiStream); 111319780Sdim IO.mapOptional("TpiStream", Obj.TpiStream); 112319780Sdim IO.mapOptional("IpiStream", Obj.IpiStream); 113344779Sdim IO.mapOptional("PublicsStream", Obj.PublicsStream); 114319780Sdim} 115319780Sdim 116319780Sdimvoid MappingTraits<MSFHeaders>::mapping(IO &IO, MSFHeaders &Obj) { 117319780Sdim IO.mapOptional("SuperBlock", Obj.SuperBlock); 118319780Sdim IO.mapOptional("NumDirectoryBlocks", Obj.NumDirectoryBlocks); 119319780Sdim IO.mapOptional("DirectoryBlocks", Obj.DirectoryBlocks); 120319780Sdim IO.mapOptional("NumStreams", Obj.NumStreams); 121319780Sdim IO.mapOptional("FileSize", Obj.FileSize); 122319780Sdim} 123319780Sdim 124319780Sdimvoid MappingTraits<msf::SuperBlock>::mapping(IO &IO, msf::SuperBlock &SB) { 125319780Sdim if (!IO.outputting()) { 126319780Sdim ::memcpy(SB.MagicBytes, msf::Magic, sizeof(msf::Magic)); 127319780Sdim } 128319780Sdim 129319780Sdim using u32 = support::ulittle32_t; 130319780Sdim IO.mapOptional("BlockSize", SB.BlockSize, u32(4096U)); 131319780Sdim IO.mapOptional("FreeBlockMap", SB.FreeBlockMapBlock, u32(0U)); 132319780Sdim IO.mapOptional("NumBlocks", SB.NumBlocks, u32(0U)); 133319780Sdim IO.mapOptional("NumDirectoryBytes", SB.NumDirectoryBytes, u32(0U)); 134319780Sdim IO.mapOptional("Unknown1", SB.Unknown1, u32(0U)); 135319780Sdim IO.mapOptional("BlockMapAddr", SB.BlockMapAddr, u32(0U)); 136319780Sdim} 137319780Sdim 138319780Sdimvoid MappingTraits<StreamBlockList>::mapping(IO &IO, StreamBlockList &SB) { 139319780Sdim IO.mapRequired("Stream", SB.Blocks); 140319780Sdim} 141319780Sdim 142319780Sdimvoid MappingTraits<PdbInfoStream>::mapping(IO &IO, PdbInfoStream &Obj) { 143319780Sdim IO.mapOptional("Age", Obj.Age, 1U); 144319780Sdim IO.mapOptional("Guid", Obj.Guid); 145319780Sdim IO.mapOptional("Signature", Obj.Signature, 0U); 146319780Sdim IO.mapOptional("Features", Obj.Features); 147319780Sdim IO.mapOptional("Version", Obj.Version, PdbImplVC70); 148319780Sdim} 149319780Sdim 150319780Sdimvoid MappingTraits<PdbDbiStream>::mapping(IO &IO, PdbDbiStream &Obj) { 151319780Sdim IO.mapOptional("VerHeader", Obj.VerHeader, PdbDbiV70); 152319780Sdim IO.mapOptional("Age", Obj.Age, 1U); 153319780Sdim IO.mapOptional("BuildNumber", Obj.BuildNumber, uint16_t(0U)); 154319780Sdim IO.mapOptional("PdbDllVersion", Obj.PdbDllVersion, 0U); 155319780Sdim IO.mapOptional("PdbDllRbld", Obj.PdbDllRbld, uint16_t(0U)); 156319780Sdim IO.mapOptional("Flags", Obj.Flags, uint16_t(1U)); 157319780Sdim IO.mapOptional("MachineType", Obj.MachineType, PDB_Machine::x86); 158319780Sdim IO.mapOptional("Modules", Obj.ModInfos); 159319780Sdim} 160319780Sdim 161319780Sdimvoid MappingTraits<PdbTpiStream>::mapping(IO &IO, 162319780Sdim pdb::yaml::PdbTpiStream &Obj) { 163319780Sdim IO.mapOptional("Version", Obj.Version, PdbTpiV80); 164319780Sdim IO.mapRequired("Records", Obj.Records); 165319780Sdim} 166319780Sdim 167344779Sdimvoid MappingTraits<PdbPublicsStream>::mapping( 168344779Sdim IO &IO, pdb::yaml::PdbPublicsStream &Obj) { 169344779Sdim IO.mapRequired("Records", Obj.PubSyms); 170344779Sdim} 171344779Sdim 172319780Sdimvoid MappingTraits<NamedStreamMapping>::mapping(IO &IO, 173319780Sdim NamedStreamMapping &Obj) { 174319780Sdim IO.mapRequired("Name", Obj.StreamName); 175319780Sdim IO.mapRequired("StreamNum", Obj.StreamNumber); 176319780Sdim} 177319780Sdim 178319780Sdimvoid MappingTraits<PdbModiStream>::mapping(IO &IO, PdbModiStream &Obj) { 179319780Sdim IO.mapOptional("Signature", Obj.Signature, 4U); 180319780Sdim IO.mapRequired("Records", Obj.Symbols); 181319780Sdim} 182319780Sdim 183319780Sdimvoid MappingTraits<PdbDbiModuleInfo>::mapping(IO &IO, PdbDbiModuleInfo &Obj) { 184319780Sdim IO.mapRequired("Module", Obj.Mod); 185319780Sdim IO.mapOptional("ObjFile", Obj.Obj, Obj.Mod); 186319780Sdim IO.mapOptional("SourceFiles", Obj.SourceFiles); 187319780Sdim IO.mapOptional("Subsections", Obj.Subsections); 188319780Sdim IO.mapOptional("Modi", Obj.Modi); 189319780Sdim} 190