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