1 //=- CodeViewYAMLDebugSections.h - CodeView YAMLIO debug sections -*- 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 // This file defines classes for handling the YAML representation of CodeView 10 // Debug Info. 11 // 12 //===----------------------------------------------------------------------===// 13 14 #ifndef LLVM_OBJECTYAML_CODEVIEWYAMLDEBUGSECTIONS_H 15 #define LLVM_OBJECTYAML_CODEVIEWYAMLDEBUGSECTIONS_H 16 17 #include "llvm/ADT/ArrayRef.h" 18 #include "llvm/ADT/StringRef.h" 19 #include "llvm/DebugInfo/CodeView/CodeView.h" 20 #include "llvm/DebugInfo/CodeView/DebugSubsection.h" 21 #include "llvm/DebugInfo/CodeView/DebugSubsectionRecord.h" 22 #include "llvm/Support/Error.h" 23 #include "llvm/Support/YAMLTraits.h" 24 #include <cstdint> 25 #include <memory> 26 #include <vector> 27 28 namespace llvm { 29 30 namespace codeview { 31 32 class StringsAndChecksums; 33 class StringsAndChecksumsRef; 34 35 } // end namespace codeview 36 37 namespace CodeViewYAML { 38 39 namespace detail { 40 41 struct YAMLSubsectionBase; 42 43 } // end namespace detail 44 45 struct YAMLFrameData { 46 uint32_t RvaStart; 47 uint32_t CodeSize; 48 uint32_t LocalSize; 49 uint32_t ParamsSize; 50 uint32_t MaxStackSize; 51 StringRef FrameFunc; 52 uint32_t PrologSize; 53 uint32_t SavedRegsSize; 54 uint32_t Flags; 55 }; 56 57 struct YAMLCrossModuleImport { 58 StringRef ModuleName; 59 std::vector<uint32_t> ImportIds; 60 }; 61 62 struct SourceLineEntry { 63 uint32_t Offset; 64 uint32_t LineStart; 65 uint32_t EndDelta; 66 bool IsStatement; 67 }; 68 69 struct SourceColumnEntry { 70 uint16_t StartColumn; 71 uint16_t EndColumn; 72 }; 73 74 struct SourceLineBlock { 75 StringRef FileName; 76 std::vector<SourceLineEntry> Lines; 77 std::vector<SourceColumnEntry> Columns; 78 }; 79 80 struct HexFormattedString { 81 std::vector<uint8_t> Bytes; 82 }; 83 84 struct SourceFileChecksumEntry { 85 StringRef FileName; 86 codeview::FileChecksumKind Kind; 87 HexFormattedString ChecksumBytes; 88 }; 89 90 struct SourceLineInfo { 91 uint32_t RelocOffset; 92 uint32_t RelocSegment; 93 codeview::LineFlags Flags; 94 uint32_t CodeSize; 95 std::vector<SourceLineBlock> Blocks; 96 }; 97 98 struct InlineeSite { 99 uint32_t Inlinee; 100 StringRef FileName; 101 uint32_t SourceLineNum; 102 std::vector<StringRef> ExtraFiles; 103 }; 104 105 struct InlineeInfo { 106 bool HasExtraFiles; 107 std::vector<InlineeSite> Sites; 108 }; 109 110 struct YAMLDebugSubsection { 111 static Expected<YAMLDebugSubsection> 112 fromCodeViewSubection(const codeview::StringsAndChecksumsRef &SC, 113 const codeview::DebugSubsectionRecord &SS); 114 115 std::shared_ptr<detail::YAMLSubsectionBase> Subsection; 116 }; 117 118 struct DebugSubsectionState {}; 119 120 Expected<std::vector<std::shared_ptr<codeview::DebugSubsection>>> 121 toCodeViewSubsectionList(BumpPtrAllocator &Allocator, 122 ArrayRef<YAMLDebugSubsection> Subsections, 123 const codeview::StringsAndChecksums &SC); 124 125 std::vector<YAMLDebugSubsection> 126 fromDebugS(ArrayRef<uint8_t> Data, const codeview::StringsAndChecksumsRef &SC); 127 128 void initializeStringsAndChecksums(ArrayRef<YAMLDebugSubsection> Sections, 129 codeview::StringsAndChecksums &SC); 130 131 } // end namespace CodeViewYAML 132 133 } // end namespace llvm 134 135 LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::YAMLDebugSubsection) 136 137 LLVM_YAML_IS_SEQUENCE_VECTOR(CodeViewYAML::YAMLDebugSubsection) 138 139 #endif // LLVM_OBJECTYAML_CODEVIEWYAMLDEBUGSECTIONS_H 140