1 //===- CodeViewYAMLDebugSections.cpp - CodeView YAMLIO debug sections -----===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file defines classes for handling the YAML representation of CodeView
13 //===----------------------------------------------------------------------===//
15 #include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h"
17 #include "llvm/ADT/StringExtras.h"
18 #include "llvm/ADT/StringSwitch.h"
19 #include "llvm/DebugInfo/CodeView/CodeViewError.h"
20 #include "llvm/DebugInfo/CodeView/EnumTables.h"
21 #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
24 using namespace llvm::codeview;
25 using namespace llvm::CodeViewYAML;
26 using namespace llvm::CodeViewYAML::detail;
27 using namespace llvm::yaml;
29 LLVM_YAML_IS_SEQUENCE_VECTOR(SourceFileChecksumEntry)
30 LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineEntry)
31 LLVM_YAML_IS_SEQUENCE_VECTOR(SourceColumnEntry)
32 LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineBlock)
33 LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineInfo)
34 LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeSite)
35 LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeInfo)
36 LLVM_YAML_IS_SEQUENCE_VECTOR(StringRef)
38 LLVM_YAML_DECLARE_SCALAR_TRAITS(HexFormattedString, false)
39 LLVM_YAML_DECLARE_ENUM_TRAITS(FileChecksumKind)
40 LLVM_YAML_DECLARE_BITSET_TRAITS(LineFlags)
42 LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceLineEntry)
43 LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceColumnEntry)
44 LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceFileChecksumEntry)
45 LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceLineInfo)
46 LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceLineBlock)
47 LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::InlineeInfo)
48 LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::InlineeSite)
50 void ScalarBitSetTraits<LineFlags>::bitset(IO &io, LineFlags &Flags) {
51 io.bitSetCase(Flags, "HasColumnInfo", LF_HaveColumns);
52 io.enumFallback<Hex16>(Flags);
55 void ScalarEnumerationTraits<FileChecksumKind>::enumeration(
56 IO &io, FileChecksumKind &Kind) {
57 io.enumCase(Kind, "None", FileChecksumKind::None);
58 io.enumCase(Kind, "MD5", FileChecksumKind::MD5);
59 io.enumCase(Kind, "SHA1", FileChecksumKind::SHA1);
60 io.enumCase(Kind, "SHA256", FileChecksumKind::SHA256);
63 void ScalarTraits<HexFormattedString>::output(const HexFormattedString &Value,
64 void *ctx, raw_ostream &Out) {
65 StringRef Bytes(reinterpret_cast<const char *>(Value.Bytes.data()),
70 StringRef ScalarTraits<HexFormattedString>::input(StringRef Scalar, void *ctxt,
71 HexFormattedString &Value) {
72 std::string H = fromHex(Scalar);
73 Value.Bytes.assign(H.begin(), H.end());
77 void MappingTraits<SourceLineEntry>::mapping(IO &IO, SourceLineEntry &Obj) {
78 IO.mapRequired("Offset", Obj.Offset);
79 IO.mapRequired("LineStart", Obj.LineStart);
80 IO.mapRequired("IsStatement", Obj.IsStatement);
81 IO.mapRequired("EndDelta", Obj.EndDelta);
84 void MappingTraits<SourceColumnEntry>::mapping(IO &IO, SourceColumnEntry &Obj) {
85 IO.mapRequired("StartColumn", Obj.StartColumn);
86 IO.mapRequired("EndColumn", Obj.EndColumn);
89 void MappingTraits<SourceLineBlock>::mapping(IO &IO, SourceLineBlock &Obj) {
90 IO.mapRequired("FileName", Obj.FileName);
91 IO.mapRequired("Lines", Obj.Lines);
92 IO.mapRequired("Columns", Obj.Columns);
95 void MappingTraits<SourceFileChecksumEntry>::mapping(
96 IO &IO, SourceFileChecksumEntry &Obj) {
97 IO.mapRequired("FileName", Obj.FileName);
98 IO.mapRequired("Kind", Obj.Kind);
99 IO.mapRequired("Checksum", Obj.ChecksumBytes);
102 void MappingTraits<SourceLineInfo>::mapping(IO &IO, SourceLineInfo &Obj) {
103 IO.mapRequired("CodeSize", Obj.CodeSize);
105 IO.mapRequired("Flags", Obj.Flags);
106 IO.mapRequired("RelocOffset", Obj.RelocOffset);
107 IO.mapRequired("RelocSegment", Obj.RelocSegment);
108 IO.mapRequired("Blocks", Obj.Blocks);
111 void MappingTraits<SourceFileInfo>::mapping(IO &IO, SourceFileInfo &Obj) {
112 IO.mapOptional("Checksums", Obj.FileChecksums);
113 IO.mapOptional("Lines", Obj.LineFragments);
114 IO.mapOptional("InlineeLines", Obj.Inlinees);
117 void MappingTraits<InlineeSite>::mapping(IO &IO, InlineeSite &Obj) {
118 IO.mapRequired("FileName", Obj.FileName);
119 IO.mapRequired("LineNum", Obj.SourceLineNum);
120 IO.mapRequired("Inlinee", Obj.Inlinee);
121 IO.mapOptional("ExtraFiles", Obj.ExtraFiles);
124 void MappingTraits<InlineeInfo>::mapping(IO &IO, InlineeInfo &Obj) {
125 IO.mapRequired("HasExtraFiles", Obj.HasExtraFiles);
126 IO.mapRequired("Sites", Obj.Sites);