1*0b57cec5SDimitry Andric //===- PdbYAML.h ---------------------------------------------- *- C++ --*-===// 2*0b57cec5SDimitry Andric // 3*0b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric // 7*0b57cec5SDimitry Andric //===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric 9*0b57cec5SDimitry Andric #ifndef LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H 10*0b57cec5SDimitry Andric #define LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H 11*0b57cec5SDimitry Andric 12*0b57cec5SDimitry Andric #include "OutputStyle.h" 13*0b57cec5SDimitry Andric 14*0b57cec5SDimitry Andric #include "llvm/ADT/Optional.h" 15*0b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/SymbolRecord.h" 16*0b57cec5SDimitry Andric #include "llvm/DebugInfo/CodeView/TypeRecord.h" 17*0b57cec5SDimitry Andric #include "llvm/DebugInfo/MSF/MSFCommon.h" 18*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/PDBFile.h" 19*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/Native/RawConstants.h" 20*0b57cec5SDimitry Andric #include "llvm/DebugInfo/PDB/PDBTypes.h" 21*0b57cec5SDimitry Andric #include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h" 22*0b57cec5SDimitry Andric #include "llvm/ObjectYAML/CodeViewYAMLSymbols.h" 23*0b57cec5SDimitry Andric #include "llvm/ObjectYAML/CodeViewYAMLTypes.h" 24*0b57cec5SDimitry Andric #include "llvm/Support/Endian.h" 25*0b57cec5SDimitry Andric #include "llvm/Support/YAMLTraits.h" 26*0b57cec5SDimitry Andric 27*0b57cec5SDimitry Andric #include <vector> 28*0b57cec5SDimitry Andric 29*0b57cec5SDimitry Andric namespace llvm { 30*0b57cec5SDimitry Andric namespace codeview { 31*0b57cec5SDimitry Andric class DebugStringTableSubsection; 32*0b57cec5SDimitry Andric } 33*0b57cec5SDimitry Andric namespace pdb { 34*0b57cec5SDimitry Andric 35*0b57cec5SDimitry Andric namespace yaml { 36*0b57cec5SDimitry Andric struct SerializationContext; 37*0b57cec5SDimitry Andric 38*0b57cec5SDimitry Andric struct MSFHeaders { 39*0b57cec5SDimitry Andric msf::SuperBlock SuperBlock; 40*0b57cec5SDimitry Andric uint32_t NumDirectoryBlocks = 0; 41*0b57cec5SDimitry Andric std::vector<uint32_t> DirectoryBlocks; 42*0b57cec5SDimitry Andric uint32_t NumStreams = 0; 43*0b57cec5SDimitry Andric uint32_t FileSize = 0; 44*0b57cec5SDimitry Andric }; 45*0b57cec5SDimitry Andric 46*0b57cec5SDimitry Andric struct StreamBlockList { 47*0b57cec5SDimitry Andric std::vector<uint32_t> Blocks; 48*0b57cec5SDimitry Andric }; 49*0b57cec5SDimitry Andric 50*0b57cec5SDimitry Andric struct NamedStreamMapping { 51*0b57cec5SDimitry Andric StringRef StreamName; 52*0b57cec5SDimitry Andric uint32_t StreamNumber; 53*0b57cec5SDimitry Andric }; 54*0b57cec5SDimitry Andric 55*0b57cec5SDimitry Andric struct PdbInfoStream { 56*0b57cec5SDimitry Andric PdbRaw_ImplVer Version = PdbImplVC70; 57*0b57cec5SDimitry Andric uint32_t Signature = 0; 58*0b57cec5SDimitry Andric uint32_t Age = 1; 59*0b57cec5SDimitry Andric codeview::GUID Guid; 60*0b57cec5SDimitry Andric std::vector<PdbRaw_FeatureSig> Features; 61*0b57cec5SDimitry Andric std::vector<NamedStreamMapping> NamedStreams; 62*0b57cec5SDimitry Andric }; 63*0b57cec5SDimitry Andric 64*0b57cec5SDimitry Andric struct PdbModiStream { 65*0b57cec5SDimitry Andric uint32_t Signature; 66*0b57cec5SDimitry Andric std::vector<CodeViewYAML::SymbolRecord> Symbols; 67*0b57cec5SDimitry Andric }; 68*0b57cec5SDimitry Andric 69*0b57cec5SDimitry Andric struct PdbDbiModuleInfo { 70*0b57cec5SDimitry Andric StringRef Obj; 71*0b57cec5SDimitry Andric StringRef Mod; 72*0b57cec5SDimitry Andric std::vector<StringRef> SourceFiles; 73*0b57cec5SDimitry Andric std::vector<CodeViewYAML::YAMLDebugSubsection> Subsections; 74*0b57cec5SDimitry Andric Optional<PdbModiStream> Modi; 75*0b57cec5SDimitry Andric }; 76*0b57cec5SDimitry Andric 77*0b57cec5SDimitry Andric struct PdbDbiStream { 78*0b57cec5SDimitry Andric PdbRaw_DbiVer VerHeader = PdbDbiV70; 79*0b57cec5SDimitry Andric uint32_t Age = 1; 80*0b57cec5SDimitry Andric uint16_t BuildNumber = 0; 81*0b57cec5SDimitry Andric uint32_t PdbDllVersion = 0; 82*0b57cec5SDimitry Andric uint16_t PdbDllRbld = 0; 83*0b57cec5SDimitry Andric uint16_t Flags = 1; 84*0b57cec5SDimitry Andric PDB_Machine MachineType = PDB_Machine::x86; 85*0b57cec5SDimitry Andric 86*0b57cec5SDimitry Andric std::vector<PdbDbiModuleInfo> ModInfos; 87*0b57cec5SDimitry Andric }; 88*0b57cec5SDimitry Andric 89*0b57cec5SDimitry Andric struct PdbTpiStream { 90*0b57cec5SDimitry Andric PdbRaw_TpiVer Version = PdbTpiV80; 91*0b57cec5SDimitry Andric std::vector<CodeViewYAML::LeafRecord> Records; 92*0b57cec5SDimitry Andric }; 93*0b57cec5SDimitry Andric 94*0b57cec5SDimitry Andric struct PdbPublicsStream { 95*0b57cec5SDimitry Andric std::vector<CodeViewYAML::SymbolRecord> PubSyms; 96*0b57cec5SDimitry Andric }; 97*0b57cec5SDimitry Andric 98*0b57cec5SDimitry Andric struct PdbObject { 99*0b57cec5SDimitry Andric explicit PdbObject(BumpPtrAllocator &Allocator) : Allocator(Allocator) {} 100*0b57cec5SDimitry Andric 101*0b57cec5SDimitry Andric Optional<MSFHeaders> Headers; 102*0b57cec5SDimitry Andric Optional<std::vector<uint32_t>> StreamSizes; 103*0b57cec5SDimitry Andric Optional<std::vector<StreamBlockList>> StreamMap; 104*0b57cec5SDimitry Andric Optional<PdbInfoStream> PdbStream; 105*0b57cec5SDimitry Andric Optional<PdbDbiStream> DbiStream; 106*0b57cec5SDimitry Andric Optional<PdbTpiStream> TpiStream; 107*0b57cec5SDimitry Andric Optional<PdbTpiStream> IpiStream; 108*0b57cec5SDimitry Andric Optional<PdbPublicsStream> PublicsStream; 109*0b57cec5SDimitry Andric 110*0b57cec5SDimitry Andric Optional<std::vector<StringRef>> StringTable; 111*0b57cec5SDimitry Andric 112*0b57cec5SDimitry Andric BumpPtrAllocator &Allocator; 113*0b57cec5SDimitry Andric }; 114*0b57cec5SDimitry Andric } 115*0b57cec5SDimitry Andric } 116*0b57cec5SDimitry Andric } 117*0b57cec5SDimitry Andric 118*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbObject) 119*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::MSFHeaders) 120*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(msf::SuperBlock) 121*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::StreamBlockList) 122*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbInfoStream) 123*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiStream) 124*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbTpiStream) 125*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbPublicsStream) 126*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::NamedStreamMapping) 127*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbModiStream) 128*0b57cec5SDimitry Andric LLVM_YAML_DECLARE_MAPPING_TRAITS(pdb::yaml::PdbDbiModuleInfo) 129*0b57cec5SDimitry Andric 130*0b57cec5SDimitry Andric #endif // LLVM_TOOLS_LLVMPDBDUMP_PDBYAML_H 131