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 } 128