]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - lib/ObjectYAML/CodeViewYAMLDebugSections.cpp
Vendor import of llvm trunk r304460:
[FreeBSD/FreeBSD.git] / lib / ObjectYAML / CodeViewYAMLDebugSections.cpp
1 //===- 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
23 using namespace llvm;
24 using namespace llvm::codeview;
25 using namespace llvm::CodeViewYAML;
26 using namespace llvm::CodeViewYAML::detail;
27 using namespace llvm::yaml;
28
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)
37
38 LLVM_YAML_DECLARE_SCALAR_TRAITS(HexFormattedString, false)
39 LLVM_YAML_DECLARE_ENUM_TRAITS(FileChecksumKind)
40 LLVM_YAML_DECLARE_BITSET_TRAITS(LineFlags)
41
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)
49
50 void ScalarBitSetTraits<LineFlags>::bitset(IO &io, LineFlags &Flags) {
51   io.bitSetCase(Flags, "HasColumnInfo", LF_HaveColumns);
52   io.enumFallback<Hex16>(Flags);
53 }
54
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);
61 }
62
63 void 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
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());
74   return StringRef();
75 }
76
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);
82 }
83
84 void MappingTraits<SourceColumnEntry>::mapping(IO &IO, SourceColumnEntry &Obj) {
85   IO.mapRequired("StartColumn", Obj.StartColumn);
86   IO.mapRequired("EndColumn", Obj.EndColumn);
87 }
88
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);
93 }
94
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);
100 }
101
102 void 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
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);
115 }
116
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);
122 }
123
124 void MappingTraits<InlineeInfo>::mapping(IO &IO, InlineeInfo &Obj) {
125   IO.mapRequired("HasExtraFiles", Obj.HasExtraFiles);
126   IO.mapRequired("Sites", Obj.Sites);
127 }