blob: f652ff57f30dad0ed47a0a77365fd64e578185ed [file] [log] [blame]
Zachary Turner1b88f4f2017-05-31 04:17:13 +00001//===- CodeViewYAMLDebugSections.cpp - CodeView YAMLIO debug sections -----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file defines classes for handling the YAML representation of CodeView
11// Debug Info.
12//
13//===----------------------------------------------------------------------===//
14
15#include "llvm/ObjectYAML/CodeViewYAMLDebugSections.h"
16
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"
22
23using namespace llvm;
24using namespace llvm::codeview;
25using namespace llvm::CodeViewYAML;
26using namespace llvm::CodeViewYAML::detail;
27using namespace llvm::yaml;
28
29LLVM_YAML_IS_SEQUENCE_VECTOR(SourceFileChecksumEntry)
30LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineEntry)
31LLVM_YAML_IS_SEQUENCE_VECTOR(SourceColumnEntry)
32LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineBlock)
33LLVM_YAML_IS_SEQUENCE_VECTOR(SourceLineInfo)
34LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeSite)
35LLVM_YAML_IS_SEQUENCE_VECTOR(InlineeInfo)
36LLVM_YAML_IS_SEQUENCE_VECTOR(StringRef)
37
38LLVM_YAML_DECLARE_SCALAR_TRAITS(HexFormattedString, false)
39LLVM_YAML_DECLARE_ENUM_TRAITS(FileChecksumKind)
40LLVM_YAML_DECLARE_BITSET_TRAITS(LineFlags)
41
42LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceLineEntry)
43LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceColumnEntry)
44LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceFileChecksumEntry)
45LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceLineInfo)
46LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::SourceLineBlock)
47LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::InlineeInfo)
48LLVM_YAML_DECLARE_MAPPING_TRAITS(CodeViewYAML::InlineeSite)
49
50void ScalarBitSetTraits<LineFlags>::bitset(IO &io, LineFlags &Flags) {
51 io.bitSetCase(Flags, "HasColumnInfo", LF_HaveColumns);
52 io.enumFallback<Hex16>(Flags);
53}
54
55void 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);
61}
62
63void ScalarTraits<HexFormattedString>::output(const HexFormattedString &Value,
64 void *ctx, raw_ostream &Out) {
65 StringRef Bytes(reinterpret_cast<const char *>(Value.Bytes.data()),
66 Value.Bytes.size());
67 Out << toHex(Bytes);
68}
69
70StringRef ScalarTraits<HexFormattedString>::input(StringRef Scalar, void *ctxt,
71 HexFormattedString &Value) {
72 std::string H = fromHex(Scalar);
73 Value.Bytes.assign(H.begin(), H.end());
74 return StringRef();
75}
76
77void 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);
82}
83
84void MappingTraits<SourceColumnEntry>::mapping(IO &IO, SourceColumnEntry &Obj) {
85 IO.mapRequired("StartColumn", Obj.StartColumn);
86 IO.mapRequired("EndColumn", Obj.EndColumn);
87}
88
89void 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);
93}
94
95void 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);
100}
101
102void MappingTraits<SourceLineInfo>::mapping(IO &IO, SourceLineInfo &Obj) {
103 IO.mapRequired("CodeSize", Obj.CodeSize);
104
105 IO.mapRequired("Flags", Obj.Flags);
106 IO.mapRequired("RelocOffset", Obj.RelocOffset);
107 IO.mapRequired("RelocSegment", Obj.RelocSegment);
108 IO.mapRequired("Blocks", Obj.Blocks);
109}
110
111void 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);
115}
116
117void 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);
122}
123
124void MappingTraits<InlineeInfo>::mapping(IO &IO, InlineeInfo &Obj) {
125 IO.mapRequired("HasExtraFiles", Obj.HasExtraFiles);
126 IO.mapRequired("Sites", Obj.Sites);
127}