11b88f4f3SZachary Turner //===- CodeViewYAMLSymbols.cpp - CodeView YAMLIO Symbol implementation ----===//
21b88f4f3SZachary Turner //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
61b88f4f3SZachary Turner //
71b88f4f3SZachary Turner //===----------------------------------------------------------------------===//
81b88f4f3SZachary Turner //
91b88f4f3SZachary Turner // This file defines classes for handling the YAML representation of CodeView
101b88f4f3SZachary Turner // Debug Info.
111b88f4f3SZachary Turner //
121b88f4f3SZachary Turner //===----------------------------------------------------------------------===//
131b88f4f3SZachary Turner
141b88f4f3SZachary Turner #include "llvm/ObjectYAML/CodeViewYAMLSymbols.h"
1528082ab0SEugene Zelenko #include "llvm/ADT/ArrayRef.h"
1628082ab0SEugene Zelenko #include "llvm/ADT/StringRef.h"
1728082ab0SEugene Zelenko #include "llvm/DebugInfo/CodeView/CodeView.h"
181b88f4f3SZachary Turner #include "llvm/DebugInfo/CodeView/CodeViewError.h"
191b88f4f3SZachary Turner #include "llvm/DebugInfo/CodeView/EnumTables.h"
2028082ab0SEugene Zelenko #include "llvm/DebugInfo/CodeView/RecordSerialization.h"
211b88f4f3SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolDeserializer.h"
2228082ab0SEugene Zelenko #include "llvm/DebugInfo/CodeView/SymbolRecord.h"
231b88f4f3SZachary Turner #include "llvm/DebugInfo/CodeView/SymbolSerializer.h"
2428082ab0SEugene Zelenko #include "llvm/DebugInfo/CodeView/TypeIndex.h"
2528082ab0SEugene Zelenko #include "llvm/ObjectYAML/YAML.h"
2628082ab0SEugene Zelenko #include "llvm/Support/Allocator.h"
2728082ab0SEugene Zelenko #include "llvm/Support/Error.h"
28*81cde474Sserge-sans-paille #include "llvm/Support/ScopedPrinter.h"
2928082ab0SEugene Zelenko #include "llvm/Support/YAMLTraits.h"
3028082ab0SEugene Zelenko #include <algorithm>
3128082ab0SEugene Zelenko #include <cstdint>
3228082ab0SEugene Zelenko #include <cstring>
3328082ab0SEugene Zelenko #include <string>
3428082ab0SEugene Zelenko #include <vector>
351b88f4f3SZachary Turner
361b88f4f3SZachary Turner using namespace llvm;
371b88f4f3SZachary Turner using namespace llvm::codeview;
381b88f4f3SZachary Turner using namespace llvm::CodeViewYAML;
391b88f4f3SZachary Turner using namespace llvm::CodeViewYAML::detail;
401b88f4f3SZachary Turner using namespace llvm::yaml;
411b88f4f3SZachary Turner
421b88f4f3SZachary Turner LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(TypeIndex)
LLVM_YAML_IS_SEQUENCE_VECTOR(LocalVariableAddrGap)4359468f5aSZachary Turner LLVM_YAML_IS_SEQUENCE_VECTOR(LocalVariableAddrGap)
441b88f4f3SZachary Turner
451b88f4f3SZachary Turner // We only need to declare these, the definitions are in CodeViewYAMLTypes.cpp
46b213b27eSFrancis Visoiu Mistrih LLVM_YAML_DECLARE_SCALAR_TRAITS(APSInt, QuotingType::None)
47b213b27eSFrancis Visoiu Mistrih LLVM_YAML_DECLARE_SCALAR_TRAITS(TypeIndex, QuotingType::None)
481b88f4f3SZachary Turner
491b88f4f3SZachary Turner LLVM_YAML_DECLARE_ENUM_TRAITS(SymbolKind)
5063055455SZachary Turner LLVM_YAML_DECLARE_ENUM_TRAITS(FrameCookieKind)
511b88f4f3SZachary Turner
521b88f4f3SZachary Turner LLVM_YAML_DECLARE_BITSET_TRAITS(CompileSym2Flags)
531b88f4f3SZachary Turner LLVM_YAML_DECLARE_BITSET_TRAITS(CompileSym3Flags)
541b88f4f3SZachary Turner LLVM_YAML_DECLARE_BITSET_TRAITS(ExportFlags)
5518d90e17SReid Kleckner LLVM_YAML_DECLARE_BITSET_TRAITS(PublicSymFlags)
561b88f4f3SZachary Turner LLVM_YAML_DECLARE_BITSET_TRAITS(LocalSymFlags)
571b88f4f3SZachary Turner LLVM_YAML_DECLARE_BITSET_TRAITS(ProcSymFlags)
581b88f4f3SZachary Turner LLVM_YAML_DECLARE_BITSET_TRAITS(FrameProcedureOptions)
591b88f4f3SZachary Turner LLVM_YAML_DECLARE_ENUM_TRAITS(CPUType)
601b88f4f3SZachary Turner LLVM_YAML_DECLARE_ENUM_TRAITS(RegisterId)
611b88f4f3SZachary Turner LLVM_YAML_DECLARE_ENUM_TRAITS(TrampolineType)
621b88f4f3SZachary Turner LLVM_YAML_DECLARE_ENUM_TRAITS(ThunkOrdinal)
631b88f4f3SZachary Turner
6428082ab0SEugene Zelenko LLVM_YAML_STRONG_TYPEDEF(StringRef, TypeName)
65349c18f8SZachary Turner
66b213b27eSFrancis Visoiu Mistrih LLVM_YAML_DECLARE_SCALAR_TRAITS(TypeName, QuotingType::Single)
67349c18f8SZachary Turner
68349c18f8SZachary Turner StringRef ScalarTraits<TypeName>::input(StringRef S, void *V, TypeName &T) {
69349c18f8SZachary Turner return ScalarTraits<StringRef>::input(S, V, T.value);
70349c18f8SZachary Turner }
7128082ab0SEugene Zelenko
output(const TypeName & T,void * V,raw_ostream & R)72349c18f8SZachary Turner void ScalarTraits<TypeName>::output(const TypeName &T, void *V,
7328082ab0SEugene Zelenko raw_ostream &R) {
74349c18f8SZachary Turner ScalarTraits<StringRef>::output(T.value, V, R);
75349c18f8SZachary Turner }
76349c18f8SZachary Turner
enumeration(IO & io,SymbolKind & Value)771b88f4f3SZachary Turner void ScalarEnumerationTraits<SymbolKind>::enumeration(IO &io,
781b88f4f3SZachary Turner SymbolKind &Value) {
791b88f4f3SZachary Turner auto SymbolNames = getSymbolTypeNames();
801b88f4f3SZachary Turner for (const auto &E : SymbolNames)
811b88f4f3SZachary Turner io.enumCase(Value, E.Name.str().c_str(), E.Value);
821b88f4f3SZachary Turner }
831b88f4f3SZachary Turner
bitset(IO & io,CompileSym2Flags & Flags)841b88f4f3SZachary Turner void ScalarBitSetTraits<CompileSym2Flags>::bitset(IO &io,
851b88f4f3SZachary Turner CompileSym2Flags &Flags) {
861b88f4f3SZachary Turner auto FlagNames = getCompileSym2FlagNames();
871b88f4f3SZachary Turner for (const auto &E : FlagNames) {
881b88f4f3SZachary Turner io.bitSetCase(Flags, E.Name.str().c_str(),
891b88f4f3SZachary Turner static_cast<CompileSym2Flags>(E.Value));
901b88f4f3SZachary Turner }
911b88f4f3SZachary Turner }
921b88f4f3SZachary Turner
bitset(IO & io,CompileSym3Flags & Flags)931b88f4f3SZachary Turner void ScalarBitSetTraits<CompileSym3Flags>::bitset(IO &io,
941b88f4f3SZachary Turner CompileSym3Flags &Flags) {
951b88f4f3SZachary Turner auto FlagNames = getCompileSym3FlagNames();
961b88f4f3SZachary Turner for (const auto &E : FlagNames) {
971b88f4f3SZachary Turner io.bitSetCase(Flags, E.Name.str().c_str(),
981b88f4f3SZachary Turner static_cast<CompileSym3Flags>(E.Value));
991b88f4f3SZachary Turner }
1001b88f4f3SZachary Turner }
1011b88f4f3SZachary Turner
bitset(IO & io,ExportFlags & Flags)1021b88f4f3SZachary Turner void ScalarBitSetTraits<ExportFlags>::bitset(IO &io, ExportFlags &Flags) {
1031b88f4f3SZachary Turner auto FlagNames = getExportSymFlagNames();
1041b88f4f3SZachary Turner for (const auto &E : FlagNames) {
1051b88f4f3SZachary Turner io.bitSetCase(Flags, E.Name.str().c_str(),
1061b88f4f3SZachary Turner static_cast<ExportFlags>(E.Value));
1071b88f4f3SZachary Turner }
1081b88f4f3SZachary Turner }
1091b88f4f3SZachary Turner
bitset(IO & io,PublicSymFlags & Flags)11018d90e17SReid Kleckner void ScalarBitSetTraits<PublicSymFlags>::bitset(IO &io, PublicSymFlags &Flags) {
111bfac17f2SZachary Turner auto FlagNames = getPublicSymFlagNames();
11218d90e17SReid Kleckner for (const auto &E : FlagNames) {
11318d90e17SReid Kleckner io.bitSetCase(Flags, E.Name.str().c_str(),
11418d90e17SReid Kleckner static_cast<PublicSymFlags>(E.Value));
11518d90e17SReid Kleckner }
11618d90e17SReid Kleckner }
11718d90e17SReid Kleckner
bitset(IO & io,LocalSymFlags & Flags)1181b88f4f3SZachary Turner void ScalarBitSetTraits<LocalSymFlags>::bitset(IO &io, LocalSymFlags &Flags) {
1191b88f4f3SZachary Turner auto FlagNames = getLocalFlagNames();
1201b88f4f3SZachary Turner for (const auto &E : FlagNames) {
1211b88f4f3SZachary Turner io.bitSetCase(Flags, E.Name.str().c_str(),
1221b88f4f3SZachary Turner static_cast<LocalSymFlags>(E.Value));
1231b88f4f3SZachary Turner }
1241b88f4f3SZachary Turner }
1251b88f4f3SZachary Turner
bitset(IO & io,ProcSymFlags & Flags)1261b88f4f3SZachary Turner void ScalarBitSetTraits<ProcSymFlags>::bitset(IO &io, ProcSymFlags &Flags) {
1271b88f4f3SZachary Turner auto FlagNames = getProcSymFlagNames();
1281b88f4f3SZachary Turner for (const auto &E : FlagNames) {
1291b88f4f3SZachary Turner io.bitSetCase(Flags, E.Name.str().c_str(),
1301b88f4f3SZachary Turner static_cast<ProcSymFlags>(E.Value));
1311b88f4f3SZachary Turner }
1321b88f4f3SZachary Turner }
1331b88f4f3SZachary Turner
bitset(IO & io,FrameProcedureOptions & Flags)1341b88f4f3SZachary Turner void ScalarBitSetTraits<FrameProcedureOptions>::bitset(
1351b88f4f3SZachary Turner IO &io, FrameProcedureOptions &Flags) {
1361b88f4f3SZachary Turner auto FlagNames = getFrameProcSymFlagNames();
1371b88f4f3SZachary Turner for (const auto &E : FlagNames) {
1381b88f4f3SZachary Turner io.bitSetCase(Flags, E.Name.str().c_str(),
1391b88f4f3SZachary Turner static_cast<FrameProcedureOptions>(E.Value));
1401b88f4f3SZachary Turner }
1411b88f4f3SZachary Turner }
1421b88f4f3SZachary Turner
enumeration(IO & io,CPUType & Cpu)1431b88f4f3SZachary Turner void ScalarEnumerationTraits<CPUType>::enumeration(IO &io, CPUType &Cpu) {
1441b88f4f3SZachary Turner auto CpuNames = getCPUTypeNames();
1451b88f4f3SZachary Turner for (const auto &E : CpuNames) {
1461b88f4f3SZachary Turner io.enumCase(Cpu, E.Name.str().c_str(), static_cast<CPUType>(E.Value));
1471b88f4f3SZachary Turner }
1481b88f4f3SZachary Turner }
1491b88f4f3SZachary Turner
enumeration(IO & io,RegisterId & Reg)1501b88f4f3SZachary Turner void ScalarEnumerationTraits<RegisterId>::enumeration(IO &io, RegisterId &Reg) {
15151892a42SLuqman Aden const auto *Header = static_cast<COFF::header *>(io.getContext());
15251892a42SLuqman Aden assert(Header && "The IO context is not initialized");
15351892a42SLuqman Aden
15451892a42SLuqman Aden Optional<CPUType> CpuType;
15551892a42SLuqman Aden ArrayRef<EnumEntry<uint16_t>> RegNames;
15651892a42SLuqman Aden
15751892a42SLuqman Aden switch (Header->Machine) {
15851892a42SLuqman Aden case COFF::IMAGE_FILE_MACHINE_I386:
15951892a42SLuqman Aden CpuType = CPUType::Pentium3;
16051892a42SLuqman Aden break;
16151892a42SLuqman Aden case COFF::IMAGE_FILE_MACHINE_AMD64:
16251892a42SLuqman Aden CpuType = CPUType::X64;
16351892a42SLuqman Aden break;
16451892a42SLuqman Aden case COFF::IMAGE_FILE_MACHINE_ARMNT:
16551892a42SLuqman Aden CpuType = CPUType::ARMNT;
16651892a42SLuqman Aden break;
16751892a42SLuqman Aden case COFF::IMAGE_FILE_MACHINE_ARM64:
16851892a42SLuqman Aden CpuType = CPUType::ARM64;
16951892a42SLuqman Aden break;
17051892a42SLuqman Aden }
17151892a42SLuqman Aden
17251892a42SLuqman Aden if (CpuType)
17351892a42SLuqman Aden RegNames = getRegisterNames(*CpuType);
17451892a42SLuqman Aden
1751b88f4f3SZachary Turner for (const auto &E : RegNames) {
1761b88f4f3SZachary Turner io.enumCase(Reg, E.Name.str().c_str(), static_cast<RegisterId>(E.Value));
1771b88f4f3SZachary Turner }
1781b88f4f3SZachary Turner io.enumFallback<Hex16>(Reg);
1791b88f4f3SZachary Turner }
1801b88f4f3SZachary Turner
enumeration(IO & io,TrampolineType & Tramp)1811b88f4f3SZachary Turner void ScalarEnumerationTraits<TrampolineType>::enumeration(
1821b88f4f3SZachary Turner IO &io, TrampolineType &Tramp) {
1831b88f4f3SZachary Turner auto TrampNames = getTrampolineNames();
1841b88f4f3SZachary Turner for (const auto &E : TrampNames) {
1851b88f4f3SZachary Turner io.enumCase(Tramp, E.Name.str().c_str(),
1861b88f4f3SZachary Turner static_cast<TrampolineType>(E.Value));
1871b88f4f3SZachary Turner }
1881b88f4f3SZachary Turner }
1891b88f4f3SZachary Turner
enumeration(IO & io,ThunkOrdinal & Ord)1901b88f4f3SZachary Turner void ScalarEnumerationTraits<ThunkOrdinal>::enumeration(IO &io,
1911b88f4f3SZachary Turner ThunkOrdinal &Ord) {
1921b88f4f3SZachary Turner auto ThunkNames = getThunkOrdinalNames();
1931b88f4f3SZachary Turner for (const auto &E : ThunkNames) {
1941b88f4f3SZachary Turner io.enumCase(Ord, E.Name.str().c_str(), static_cast<ThunkOrdinal>(E.Value));
1951b88f4f3SZachary Turner }
1961b88f4f3SZachary Turner }
1971b88f4f3SZachary Turner
enumeration(IO & io,FrameCookieKind & FC)19863055455SZachary Turner void ScalarEnumerationTraits<FrameCookieKind>::enumeration(
19963055455SZachary Turner IO &io, FrameCookieKind &FC) {
20063055455SZachary Turner auto ThunkNames = getFrameCookieKindNames();
20163055455SZachary Turner for (const auto &E : ThunkNames) {
20263055455SZachary Turner io.enumCase(FC, E.Name.str().c_str(),
20363055455SZachary Turner static_cast<FrameCookieKind>(E.Value));
20463055455SZachary Turner }
20563055455SZachary Turner }
20663055455SZachary Turner
2071b88f4f3SZachary Turner namespace llvm {
20859468f5aSZachary Turner namespace yaml {
20959468f5aSZachary Turner template <> struct MappingTraits<LocalVariableAddrRange> {
mappingllvm::yaml::MappingTraits21059468f5aSZachary Turner static void mapping(IO &io, LocalVariableAddrRange &Range) {
21159468f5aSZachary Turner io.mapRequired("OffsetStart", Range.OffsetStart);
21259468f5aSZachary Turner io.mapRequired("ISectStart", Range.ISectStart);
21359468f5aSZachary Turner io.mapRequired("Range", Range.Range);
21459468f5aSZachary Turner }
21559468f5aSZachary Turner };
21659468f5aSZachary Turner template <> struct MappingTraits<LocalVariableAddrGap> {
mappingllvm::yaml::MappingTraits21759468f5aSZachary Turner static void mapping(IO &io, LocalVariableAddrGap &Gap) {
21859468f5aSZachary Turner io.mapRequired("GapStartOffset", Gap.GapStartOffset);
21959468f5aSZachary Turner io.mapRequired("Range", Gap.Range);
22059468f5aSZachary Turner }
22159468f5aSZachary Turner };
22259468f5aSZachary Turner } // namespace yaml
22359468f5aSZachary Turner } // namespace llvm
22459468f5aSZachary Turner
22559468f5aSZachary Turner namespace llvm {
2261b88f4f3SZachary Turner namespace CodeViewYAML {
2271b88f4f3SZachary Turner namespace detail {
2281b88f4f3SZachary Turner
2291b88f4f3SZachary Turner struct SymbolRecordBase {
2301b88f4f3SZachary Turner codeview::SymbolKind Kind;
2311b88f4f3SZachary Turner
SymbolRecordBasellvm::CodeViewYAML::detail::SymbolRecordBase23228082ab0SEugene Zelenko explicit SymbolRecordBase(codeview::SymbolKind K) : Kind(K) {}
23328082ab0SEugene Zelenko virtual ~SymbolRecordBase() = default;
23428082ab0SEugene Zelenko
2351b88f4f3SZachary Turner virtual void map(yaml::IO &io) = 0;
2361b88f4f3SZachary Turner virtual codeview::CVSymbol
237ebd3ae83SZachary Turner toCodeViewSymbol(BumpPtrAllocator &Allocator,
238ebd3ae83SZachary Turner CodeViewContainer Container) const = 0;
2391b88f4f3SZachary Turner virtual Error fromCodeViewSymbol(codeview::CVSymbol Type) = 0;
2401b88f4f3SZachary Turner };
2411b88f4f3SZachary Turner
2421b88f4f3SZachary Turner template <typename T> struct SymbolRecordImpl : public SymbolRecordBase {
SymbolRecordImplllvm::CodeViewYAML::detail::SymbolRecordImpl2431b88f4f3SZachary Turner explicit SymbolRecordImpl(codeview::SymbolKind K)
2441b88f4f3SZachary Turner : SymbolRecordBase(K), Symbol(static_cast<SymbolRecordKind>(K)) {}
2451b88f4f3SZachary Turner
2461b88f4f3SZachary Turner void map(yaml::IO &io) override;
2471b88f4f3SZachary Turner
2481b88f4f3SZachary Turner codeview::CVSymbol
toCodeViewSymbolllvm::CodeViewYAML::detail::SymbolRecordImpl249ebd3ae83SZachary Turner toCodeViewSymbol(BumpPtrAllocator &Allocator,
250ebd3ae83SZachary Turner CodeViewContainer Container) const override {
251ebd3ae83SZachary Turner return SymbolSerializer::writeOneSymbol(Symbol, Allocator, Container);
2521b88f4f3SZachary Turner }
25328082ab0SEugene Zelenko
fromCodeViewSymbolllvm::CodeViewYAML::detail::SymbolRecordImpl2541b88f4f3SZachary Turner Error fromCodeViewSymbol(codeview::CVSymbol CVS) override {
2551b88f4f3SZachary Turner return SymbolDeserializer::deserializeAs<T>(CVS, Symbol);
2561b88f4f3SZachary Turner }
2571b88f4f3SZachary Turner
2581b88f4f3SZachary Turner mutable T Symbol;
2591b88f4f3SZachary Turner };
2601b88f4f3SZachary Turner
261606d7665SZachary Turner struct UnknownSymbolRecord : public SymbolRecordBase {
UnknownSymbolRecordllvm::CodeViewYAML::detail::UnknownSymbolRecord262606d7665SZachary Turner explicit UnknownSymbolRecord(codeview::SymbolKind K) : SymbolRecordBase(K) {}
263606d7665SZachary Turner
264606d7665SZachary Turner void map(yaml::IO &io) override;
265606d7665SZachary Turner
toCodeViewSymbolllvm::CodeViewYAML::detail::UnknownSymbolRecord266606d7665SZachary Turner CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator,
267606d7665SZachary Turner CodeViewContainer Container) const override {
268606d7665SZachary Turner RecordPrefix Prefix;
269606d7665SZachary Turner uint32_t TotalLen = sizeof(RecordPrefix) + Data.size();
270606d7665SZachary Turner Prefix.RecordKind = Kind;
271606d7665SZachary Turner Prefix.RecordLen = TotalLen - 2;
272606d7665SZachary Turner uint8_t *Buffer = Allocator.Allocate<uint8_t>(TotalLen);
273606d7665SZachary Turner ::memcpy(Buffer, &Prefix, sizeof(RecordPrefix));
274606d7665SZachary Turner ::memcpy(Buffer + sizeof(RecordPrefix), Data.data(), Data.size());
275e10d0041SReid Kleckner return CVSymbol(ArrayRef<uint8_t>(Buffer, TotalLen));
276606d7665SZachary Turner }
27728082ab0SEugene Zelenko
fromCodeViewSymbolllvm::CodeViewYAML::detail::UnknownSymbolRecord278606d7665SZachary Turner Error fromCodeViewSymbol(CVSymbol CVS) override {
279606d7665SZachary Turner this->Kind = CVS.kind();
280606d7665SZachary Turner Data = CVS.RecordData.drop_front(sizeof(RecordPrefix));
281606d7665SZachary Turner return Error::success();
282606d7665SZachary Turner }
283606d7665SZachary Turner
284606d7665SZachary Turner std::vector<uint8_t> Data;
285606d7665SZachary Turner };
286606d7665SZachary Turner
map(IO & IO)2871b88f4f3SZachary Turner template <> void SymbolRecordImpl<ScopeEndSym>::map(IO &IO) {}
2881b88f4f3SZachary Turner
map(yaml::IO & io)289606d7665SZachary Turner void UnknownSymbolRecord::map(yaml::IO &io) {
290606d7665SZachary Turner yaml::BinaryRef Binary;
291606d7665SZachary Turner if (io.outputting())
292606d7665SZachary Turner Binary = yaml::BinaryRef(Data);
293606d7665SZachary Turner io.mapRequired("Data", Binary);
294606d7665SZachary Turner if (!io.outputting()) {
295606d7665SZachary Turner std::string Str;
296606d7665SZachary Turner raw_string_ostream OS(Str);
297606d7665SZachary Turner Binary.writeAsBinary(OS);
298606d7665SZachary Turner OS.flush();
299606d7665SZachary Turner Data.assign(Str.begin(), Str.end());
300606d7665SZachary Turner }
301606d7665SZachary Turner }
302606d7665SZachary Turner
map(IO & IO)3031b88f4f3SZachary Turner template <> void SymbolRecordImpl<Thunk32Sym>::map(IO &IO) {
3041b88f4f3SZachary Turner IO.mapRequired("Parent", Symbol.Parent);
3051b88f4f3SZachary Turner IO.mapRequired("End", Symbol.End);
3061b88f4f3SZachary Turner IO.mapRequired("Next", Symbol.Next);
3071b88f4f3SZachary Turner IO.mapRequired("Off", Symbol.Offset);
3081b88f4f3SZachary Turner IO.mapRequired("Seg", Symbol.Segment);
3091b88f4f3SZachary Turner IO.mapRequired("Len", Symbol.Length);
3101b88f4f3SZachary Turner IO.mapRequired("Ordinal", Symbol.Thunk);
3111b88f4f3SZachary Turner }
3121b88f4f3SZachary Turner
map(IO & IO)3131b88f4f3SZachary Turner template <> void SymbolRecordImpl<TrampolineSym>::map(IO &IO) {
3141b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
3151b88f4f3SZachary Turner IO.mapRequired("Size", Symbol.Size);
3161b88f4f3SZachary Turner IO.mapRequired("ThunkOff", Symbol.ThunkOffset);
3171b88f4f3SZachary Turner IO.mapRequired("TargetOff", Symbol.TargetOffset);
3181b88f4f3SZachary Turner IO.mapRequired("ThunkSection", Symbol.ThunkSection);
3191b88f4f3SZachary Turner IO.mapRequired("TargetSection", Symbol.TargetSection);
3201b88f4f3SZachary Turner }
3211b88f4f3SZachary Turner
map(IO & IO)3221b88f4f3SZachary Turner template <> void SymbolRecordImpl<SectionSym>::map(IO &IO) {
3231b88f4f3SZachary Turner IO.mapRequired("SectionNumber", Symbol.SectionNumber);
3241b88f4f3SZachary Turner IO.mapRequired("Alignment", Symbol.Alignment);
3251b88f4f3SZachary Turner IO.mapRequired("Rva", Symbol.Rva);
3261b88f4f3SZachary Turner IO.mapRequired("Length", Symbol.Length);
3271b88f4f3SZachary Turner IO.mapRequired("Characteristics", Symbol.Characteristics);
3281b88f4f3SZachary Turner IO.mapRequired("Name", Symbol.Name);
3291b88f4f3SZachary Turner }
3301b88f4f3SZachary Turner
map(IO & IO)3311b88f4f3SZachary Turner template <> void SymbolRecordImpl<CoffGroupSym>::map(IO &IO) {
3321b88f4f3SZachary Turner IO.mapRequired("Size", Symbol.Size);
3331b88f4f3SZachary Turner IO.mapRequired("Characteristics", Symbol.Characteristics);
3341b88f4f3SZachary Turner IO.mapRequired("Offset", Symbol.Offset);
3351b88f4f3SZachary Turner IO.mapRequired("Segment", Symbol.Segment);
3361b88f4f3SZachary Turner IO.mapRequired("Name", Symbol.Name);
3371b88f4f3SZachary Turner }
3381b88f4f3SZachary Turner
map(IO & IO)3391b88f4f3SZachary Turner template <> void SymbolRecordImpl<ExportSym>::map(IO &IO) {
3401b88f4f3SZachary Turner IO.mapRequired("Ordinal", Symbol.Ordinal);
3411b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
3421b88f4f3SZachary Turner IO.mapRequired("Name", Symbol.Name);
3431b88f4f3SZachary Turner }
3441b88f4f3SZachary Turner
map(IO & IO)3451b88f4f3SZachary Turner template <> void SymbolRecordImpl<ProcSym>::map(IO &IO) {
34691ef9de6SReid Kleckner IO.mapOptional("PtrParent", Symbol.Parent, 0U);
34791ef9de6SReid Kleckner IO.mapOptional("PtrEnd", Symbol.End, 0U);
34891ef9de6SReid Kleckner IO.mapOptional("PtrNext", Symbol.Next, 0U);
3491b88f4f3SZachary Turner IO.mapRequired("CodeSize", Symbol.CodeSize);
3501b88f4f3SZachary Turner IO.mapRequired("DbgStart", Symbol.DbgStart);
3511b88f4f3SZachary Turner IO.mapRequired("DbgEnd", Symbol.DbgEnd);
3521b88f4f3SZachary Turner IO.mapRequired("FunctionType", Symbol.FunctionType);
35391ef9de6SReid Kleckner IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
35491ef9de6SReid Kleckner IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
3551b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
3561b88f4f3SZachary Turner IO.mapRequired("DisplayName", Symbol.Name);
3571b88f4f3SZachary Turner }
3581b88f4f3SZachary Turner
map(IO & IO)3591b88f4f3SZachary Turner template <> void SymbolRecordImpl<RegisterSym>::map(IO &IO) {
3601b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Index);
3611b88f4f3SZachary Turner IO.mapRequired("Seg", Symbol.Register);
3621b88f4f3SZachary Turner IO.mapRequired("Name", Symbol.Name);
3631b88f4f3SZachary Turner }
3641b88f4f3SZachary Turner
map(IO & IO)3651b88f4f3SZachary Turner template <> void SymbolRecordImpl<PublicSym32>::map(IO &IO) {
36618d90e17SReid Kleckner IO.mapRequired("Flags", Symbol.Flags);
36791ef9de6SReid Kleckner IO.mapOptional("Offset", Symbol.Offset, 0U);
36891ef9de6SReid Kleckner IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
3691b88f4f3SZachary Turner IO.mapRequired("Name", Symbol.Name);
3701b88f4f3SZachary Turner }
3711b88f4f3SZachary Turner
map(IO & IO)3721b88f4f3SZachary Turner template <> void SymbolRecordImpl<ProcRefSym>::map(IO &IO) {
3731b88f4f3SZachary Turner IO.mapRequired("SumName", Symbol.SumName);
3741b88f4f3SZachary Turner IO.mapRequired("SymOffset", Symbol.SymOffset);
3751b88f4f3SZachary Turner IO.mapRequired("Mod", Symbol.Module);
3761b88f4f3SZachary Turner IO.mapRequired("Name", Symbol.Name);
3771b88f4f3SZachary Turner }
3781b88f4f3SZachary Turner
map(IO & IO)3791b88f4f3SZachary Turner template <> void SymbolRecordImpl<EnvBlockSym>::map(IO &IO) {
3801b88f4f3SZachary Turner IO.mapRequired("Entries", Symbol.Fields);
3811b88f4f3SZachary Turner }
3821b88f4f3SZachary Turner
map(IO & IO)3831b88f4f3SZachary Turner template <> void SymbolRecordImpl<InlineSiteSym>::map(IO &IO) {
38491ef9de6SReid Kleckner IO.mapOptional("PtrParent", Symbol.Parent, 0U);
38591ef9de6SReid Kleckner IO.mapOptional("PtrEnd", Symbol.End, 0U);
3861b88f4f3SZachary Turner IO.mapRequired("Inlinee", Symbol.Inlinee);
3871b88f4f3SZachary Turner // TODO: The binary annotations
3881b88f4f3SZachary Turner }
3891b88f4f3SZachary Turner
map(IO & IO)3901b88f4f3SZachary Turner template <> void SymbolRecordImpl<LocalSym>::map(IO &IO) {
3911b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
3921b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
393349c18f8SZachary Turner
3941b88f4f3SZachary Turner IO.mapRequired("VarName", Symbol.Name);
3951b88f4f3SZachary Turner }
3961b88f4f3SZachary Turner
map(IO & IO)3971b88f4f3SZachary Turner template <> void SymbolRecordImpl<DefRangeSym>::map(IO &IO) {
39859468f5aSZachary Turner IO.mapRequired("Program", Symbol.Program);
39959468f5aSZachary Turner IO.mapRequired("Range", Symbol.Range);
40059468f5aSZachary Turner IO.mapRequired("Gaps", Symbol.Gaps);
4011b88f4f3SZachary Turner }
4021b88f4f3SZachary Turner
map(IO & IO)4031b88f4f3SZachary Turner template <> void SymbolRecordImpl<DefRangeSubfieldSym>::map(IO &IO) {
40459468f5aSZachary Turner IO.mapRequired("Program", Symbol.Program);
40559468f5aSZachary Turner IO.mapRequired("OffsetInParent", Symbol.OffsetInParent);
40659468f5aSZachary Turner IO.mapRequired("Range", Symbol.Range);
40759468f5aSZachary Turner IO.mapRequired("Gaps", Symbol.Gaps);
4081b88f4f3SZachary Turner }
4091b88f4f3SZachary Turner
map(IO & IO)4101b88f4f3SZachary Turner template <> void SymbolRecordImpl<DefRangeRegisterSym>::map(IO &IO) {
41159468f5aSZachary Turner IO.mapRequired("Register", Symbol.Hdr.Register);
41259468f5aSZachary Turner IO.mapRequired("MayHaveNoName", Symbol.Hdr.MayHaveNoName);
41359468f5aSZachary Turner IO.mapRequired("Range", Symbol.Range);
41459468f5aSZachary Turner IO.mapRequired("Gaps", Symbol.Gaps);
4151b88f4f3SZachary Turner }
4161b88f4f3SZachary Turner
map(IO & IO)4171b88f4f3SZachary Turner template <> void SymbolRecordImpl<DefRangeFramePointerRelSym>::map(IO &IO) {
418da60fc81SNilanjana Basu IO.mapRequired("Offset", Symbol.Hdr.Offset);
41959468f5aSZachary Turner IO.mapRequired("Range", Symbol.Range);
42059468f5aSZachary Turner IO.mapRequired("Gaps", Symbol.Gaps);
4211b88f4f3SZachary Turner }
4221b88f4f3SZachary Turner
map(IO & IO)4231b88f4f3SZachary Turner template <> void SymbolRecordImpl<DefRangeSubfieldRegisterSym>::map(IO &IO) {
42459468f5aSZachary Turner IO.mapRequired("Register", Symbol.Hdr.Register);
42559468f5aSZachary Turner IO.mapRequired("MayHaveNoName", Symbol.Hdr.MayHaveNoName);
42659468f5aSZachary Turner IO.mapRequired("OffsetInParent", Symbol.Hdr.OffsetInParent);
42759468f5aSZachary Turner IO.mapRequired("Range", Symbol.Range);
42859468f5aSZachary Turner IO.mapRequired("Gaps", Symbol.Gaps);
4291b88f4f3SZachary Turner }
4301b88f4f3SZachary Turner
4311b88f4f3SZachary Turner template <>
map(IO & IO)4321b88f4f3SZachary Turner void SymbolRecordImpl<DefRangeFramePointerRelFullScopeSym>::map(IO &IO) {
43359468f5aSZachary Turner IO.mapRequired("Register", Symbol.Offset);
4341b88f4f3SZachary Turner }
4351b88f4f3SZachary Turner
map(IO & IO)4361b88f4f3SZachary Turner template <> void SymbolRecordImpl<DefRangeRegisterRelSym>::map(IO &IO) {
43759468f5aSZachary Turner IO.mapRequired("Register", Symbol.Hdr.Register);
43859468f5aSZachary Turner IO.mapRequired("Flags", Symbol.Hdr.Flags);
43959468f5aSZachary Turner IO.mapRequired("BasePointerOffset", Symbol.Hdr.BasePointerOffset);
44059468f5aSZachary Turner IO.mapRequired("Range", Symbol.Range);
44159468f5aSZachary Turner IO.mapRequired("Gaps", Symbol.Gaps);
4421b88f4f3SZachary Turner }
4431b88f4f3SZachary Turner
map(IO & IO)4441b88f4f3SZachary Turner template <> void SymbolRecordImpl<BlockSym>::map(IO &IO) {
44591ef9de6SReid Kleckner IO.mapOptional("PtrParent", Symbol.Parent, 0U);
44691ef9de6SReid Kleckner IO.mapOptional("PtrEnd", Symbol.End, 0U);
4471b88f4f3SZachary Turner IO.mapRequired("CodeSize", Symbol.CodeSize);
44891ef9de6SReid Kleckner IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
44991ef9de6SReid Kleckner IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
4501b88f4f3SZachary Turner IO.mapRequired("BlockName", Symbol.Name);
4511b88f4f3SZachary Turner }
4521b88f4f3SZachary Turner
map(IO & IO)4531b88f4f3SZachary Turner template <> void SymbolRecordImpl<LabelSym>::map(IO &IO) {
45491ef9de6SReid Kleckner IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
45591ef9de6SReid Kleckner IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
4561b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
4571b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
4581b88f4f3SZachary Turner IO.mapRequired("DisplayName", Symbol.Name);
4591b88f4f3SZachary Turner }
4601b88f4f3SZachary Turner
map(IO & IO)4611b88f4f3SZachary Turner template <> void SymbolRecordImpl<ObjNameSym>::map(IO &IO) {
4621b88f4f3SZachary Turner IO.mapRequired("Signature", Symbol.Signature);
4631b88f4f3SZachary Turner IO.mapRequired("ObjectName", Symbol.Name);
4641b88f4f3SZachary Turner }
4651b88f4f3SZachary Turner
map(IO & IO)4661b88f4f3SZachary Turner template <> void SymbolRecordImpl<Compile2Sym>::map(IO &IO) {
4671b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
4681b88f4f3SZachary Turner IO.mapRequired("Machine", Symbol.Machine);
4691b88f4f3SZachary Turner IO.mapRequired("FrontendMajor", Symbol.VersionFrontendMajor);
4701b88f4f3SZachary Turner IO.mapRequired("FrontendMinor", Symbol.VersionFrontendMinor);
4711b88f4f3SZachary Turner IO.mapRequired("FrontendBuild", Symbol.VersionFrontendBuild);
4721b88f4f3SZachary Turner IO.mapRequired("BackendMajor", Symbol.VersionBackendMajor);
4731b88f4f3SZachary Turner IO.mapRequired("BackendMinor", Symbol.VersionBackendMinor);
4741b88f4f3SZachary Turner IO.mapRequired("BackendBuild", Symbol.VersionBackendBuild);
4751b88f4f3SZachary Turner IO.mapRequired("Version", Symbol.Version);
4761b88f4f3SZachary Turner }
4771b88f4f3SZachary Turner
map(IO & IO)4781b88f4f3SZachary Turner template <> void SymbolRecordImpl<Compile3Sym>::map(IO &IO) {
4791b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
4801b88f4f3SZachary Turner IO.mapRequired("Machine", Symbol.Machine);
4811b88f4f3SZachary Turner IO.mapRequired("FrontendMajor", Symbol.VersionFrontendMajor);
4821b88f4f3SZachary Turner IO.mapRequired("FrontendMinor", Symbol.VersionFrontendMinor);
4831b88f4f3SZachary Turner IO.mapRequired("FrontendBuild", Symbol.VersionFrontendBuild);
4841b88f4f3SZachary Turner IO.mapRequired("FrontendQFE", Symbol.VersionFrontendQFE);
4851b88f4f3SZachary Turner IO.mapRequired("BackendMajor", Symbol.VersionBackendMajor);
4861b88f4f3SZachary Turner IO.mapRequired("BackendMinor", Symbol.VersionBackendMinor);
4871b88f4f3SZachary Turner IO.mapRequired("BackendBuild", Symbol.VersionBackendBuild);
4881b88f4f3SZachary Turner IO.mapRequired("BackendQFE", Symbol.VersionBackendQFE);
4891b88f4f3SZachary Turner IO.mapRequired("Version", Symbol.Version);
4901b88f4f3SZachary Turner }
4911b88f4f3SZachary Turner
map(IO & IO)4921b88f4f3SZachary Turner template <> void SymbolRecordImpl<FrameProcSym>::map(IO &IO) {
4931b88f4f3SZachary Turner IO.mapRequired("TotalFrameBytes", Symbol.TotalFrameBytes);
4941b88f4f3SZachary Turner IO.mapRequired("PaddingFrameBytes", Symbol.PaddingFrameBytes);
4951b88f4f3SZachary Turner IO.mapRequired("OffsetToPadding", Symbol.OffsetToPadding);
4961b88f4f3SZachary Turner IO.mapRequired("BytesOfCalleeSavedRegisters",
4971b88f4f3SZachary Turner Symbol.BytesOfCalleeSavedRegisters);
4981b88f4f3SZachary Turner IO.mapRequired("OffsetOfExceptionHandler", Symbol.OffsetOfExceptionHandler);
4991b88f4f3SZachary Turner IO.mapRequired("SectionIdOfExceptionHandler",
5001b88f4f3SZachary Turner Symbol.SectionIdOfExceptionHandler);
5011b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
5021b88f4f3SZachary Turner }
5031b88f4f3SZachary Turner
map(IO & IO)5041b88f4f3SZachary Turner template <> void SymbolRecordImpl<CallSiteInfoSym>::map(IO &IO) {
50591ef9de6SReid Kleckner IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
50691ef9de6SReid Kleckner IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
5071b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
5081b88f4f3SZachary Turner }
5091b88f4f3SZachary Turner
map(IO & IO)5101b88f4f3SZachary Turner template <> void SymbolRecordImpl<FileStaticSym>::map(IO &IO) {
5111b88f4f3SZachary Turner IO.mapRequired("Index", Symbol.Index);
5121b88f4f3SZachary Turner IO.mapRequired("ModFilenameOffset", Symbol.ModFilenameOffset);
5131b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
5141b88f4f3SZachary Turner IO.mapRequired("Name", Symbol.Name);
5151b88f4f3SZachary Turner }
5161b88f4f3SZachary Turner
map(IO & IO)5171b88f4f3SZachary Turner template <> void SymbolRecordImpl<HeapAllocationSiteSym>::map(IO &IO) {
51891ef9de6SReid Kleckner IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
51991ef9de6SReid Kleckner IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
5201b88f4f3SZachary Turner IO.mapRequired("CallInstructionSize", Symbol.CallInstructionSize);
5211b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
5221b88f4f3SZachary Turner }
5231b88f4f3SZachary Turner
map(IO & IO)5241b88f4f3SZachary Turner template <> void SymbolRecordImpl<FrameCookieSym>::map(IO &IO) {
5251b88f4f3SZachary Turner IO.mapRequired("Register", Symbol.Register);
5261b88f4f3SZachary Turner IO.mapRequired("CookieKind", Symbol.CookieKind);
5271b88f4f3SZachary Turner IO.mapRequired("Flags", Symbol.Flags);
5281b88f4f3SZachary Turner }
5291b88f4f3SZachary Turner
map(IO & IO)5301b88f4f3SZachary Turner template <> void SymbolRecordImpl<CallerSym>::map(IO &IO) {
5311b88f4f3SZachary Turner IO.mapRequired("FuncID", Symbol.Indices);
5321b88f4f3SZachary Turner }
5331b88f4f3SZachary Turner
map(IO & IO)5341b88f4f3SZachary Turner template <> void SymbolRecordImpl<UDTSym>::map(IO &IO) {
5351b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
5361b88f4f3SZachary Turner IO.mapRequired("UDTName", Symbol.Name);
5371b88f4f3SZachary Turner }
5381b88f4f3SZachary Turner
map(IO & IO)5391b88f4f3SZachary Turner template <> void SymbolRecordImpl<BuildInfoSym>::map(IO &IO) {
5401b88f4f3SZachary Turner IO.mapRequired("BuildId", Symbol.BuildId);
5411b88f4f3SZachary Turner }
5421b88f4f3SZachary Turner
map(IO & IO)5431b88f4f3SZachary Turner template <> void SymbolRecordImpl<BPRelativeSym>::map(IO &IO) {
5441b88f4f3SZachary Turner IO.mapRequired("Offset", Symbol.Offset);
5451b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
5461b88f4f3SZachary Turner IO.mapRequired("VarName", Symbol.Name);
5471b88f4f3SZachary Turner }
5481b88f4f3SZachary Turner
map(IO & IO)5491b88f4f3SZachary Turner template <> void SymbolRecordImpl<RegRelativeSym>::map(IO &IO) {
5501b88f4f3SZachary Turner IO.mapRequired("Offset", Symbol.Offset);
5511b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
5521b88f4f3SZachary Turner IO.mapRequired("Register", Symbol.Register);
5531b88f4f3SZachary Turner IO.mapRequired("VarName", Symbol.Name);
5541b88f4f3SZachary Turner }
5551b88f4f3SZachary Turner
map(IO & IO)5561b88f4f3SZachary Turner template <> void SymbolRecordImpl<ConstantSym>::map(IO &IO) {
5571b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
5581b88f4f3SZachary Turner IO.mapRequired("Value", Symbol.Value);
5591b88f4f3SZachary Turner IO.mapRequired("Name", Symbol.Name);
5601b88f4f3SZachary Turner }
5611b88f4f3SZachary Turner
map(IO & IO)5621b88f4f3SZachary Turner template <> void SymbolRecordImpl<DataSym>::map(IO &IO) {
5631b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
56491ef9de6SReid Kleckner IO.mapOptional("Offset", Symbol.DataOffset, 0U);
565665e1c92SReid Kleckner IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
5661b88f4f3SZachary Turner IO.mapRequired("DisplayName", Symbol.Name);
5671b88f4f3SZachary Turner }
5681b88f4f3SZachary Turner
map(IO & IO)5691b88f4f3SZachary Turner template <> void SymbolRecordImpl<ThreadLocalDataSym>::map(IO &IO) {
5701b88f4f3SZachary Turner IO.mapRequired("Type", Symbol.Type);
57191ef9de6SReid Kleckner IO.mapOptional("Offset", Symbol.DataOffset, 0U);
57291ef9de6SReid Kleckner IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
5731b88f4f3SZachary Turner IO.mapRequired("DisplayName", Symbol.Name);
5741b88f4f3SZachary Turner }
57528082ab0SEugene Zelenko
map(IO & IO)576ee8a7200SAlexandre Ganea template <> void SymbolRecordImpl<UsingNamespaceSym>::map(IO &IO) {
577ee8a7200SAlexandre Ganea IO.mapRequired("Namespace", Symbol.Name);
578ee8a7200SAlexandre Ganea }
579ee8a7200SAlexandre Ganea
map(IO & IO)5807c438c5bSReid Kleckner template <> void SymbolRecordImpl<AnnotationSym>::map(IO &IO) {
5817c438c5bSReid Kleckner IO.mapOptional("Offset", Symbol.CodeOffset, 0U);
5827c438c5bSReid Kleckner IO.mapOptional("Segment", Symbol.Segment, uint16_t(0));
5837c438c5bSReid Kleckner IO.mapRequired("Strings", Symbol.Strings);
5847c438c5bSReid Kleckner }
5857c438c5bSReid Kleckner
58628082ab0SEugene Zelenko } // end namespace detail
58728082ab0SEugene Zelenko } // end namespace CodeViewYAML
58828082ab0SEugene Zelenko } // end namespace llvm
5891b88f4f3SZachary Turner
toCodeViewSymbol(BumpPtrAllocator & Allocator,CodeViewContainer Container) const5901b88f4f3SZachary Turner CVSymbol CodeViewYAML::SymbolRecord::toCodeViewSymbol(
591ebd3ae83SZachary Turner BumpPtrAllocator &Allocator, CodeViewContainer Container) const {
592ebd3ae83SZachary Turner return Symbol->toCodeViewSymbol(Allocator, Container);
5931b88f4f3SZachary Turner }
5941b88f4f3SZachary Turner
5951b88f4f3SZachary Turner namespace llvm {
5961b88f4f3SZachary Turner namespace yaml {
59728082ab0SEugene Zelenko
5981b88f4f3SZachary Turner template <> struct MappingTraits<SymbolRecordBase> {
mappingllvm::yaml::MappingTraits5991b88f4f3SZachary Turner static void mapping(IO &io, SymbolRecordBase &Record) { Record.map(io); }
6001b88f4f3SZachary Turner };
60128082ab0SEugene Zelenko
60228082ab0SEugene Zelenko } // end namespace yaml
60328082ab0SEugene Zelenko } // end namespace llvm
6041b88f4f3SZachary Turner
6051b88f4f3SZachary Turner template <typename SymbolType>
6061b88f4f3SZachary Turner static inline Expected<CodeViewYAML::SymbolRecord>
fromCodeViewSymbolImpl(CVSymbol Symbol)6071b88f4f3SZachary Turner fromCodeViewSymbolImpl(CVSymbol Symbol) {
6081b88f4f3SZachary Turner CodeViewYAML::SymbolRecord Result;
6091b88f4f3SZachary Turner
610606d7665SZachary Turner auto Impl = std::make_shared<SymbolType>(Symbol.kind());
6111b88f4f3SZachary Turner if (auto EC = Impl->fromCodeViewSymbol(Symbol))
612c55cf4afSBill Wendling return std::move(EC);
6131b88f4f3SZachary Turner Result.Symbol = Impl;
6141b88f4f3SZachary Turner return Result;
6151b88f4f3SZachary Turner }
6161b88f4f3SZachary Turner
6171b88f4f3SZachary Turner Expected<CodeViewYAML::SymbolRecord>
fromCodeViewSymbol(CVSymbol Symbol)6181b88f4f3SZachary Turner CodeViewYAML::SymbolRecord::fromCodeViewSymbol(CVSymbol Symbol) {
6191b88f4f3SZachary Turner #define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \
6201b88f4f3SZachary Turner case EnumName: \
621606d7665SZachary Turner return fromCodeViewSymbolImpl<SymbolRecordImpl<ClassName>>(Symbol);
6221b88f4f3SZachary Turner #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \
6231b88f4f3SZachary Turner SYMBOL_RECORD(EnumName, EnumVal, ClassName)
6241b88f4f3SZachary Turner switch (Symbol.kind()) {
6251b88f4f3SZachary Turner #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
626606d7665SZachary Turner default:
627606d7665SZachary Turner return fromCodeViewSymbolImpl<UnknownSymbolRecord>(Symbol);
6281b88f4f3SZachary Turner }
6291b88f4f3SZachary Turner return make_error<CodeViewError>(cv_error_code::corrupt_record);
6301b88f4f3SZachary Turner }
6311b88f4f3SZachary Turner
6321b88f4f3SZachary Turner template <typename ConcreteType>
mapSymbolRecordImpl(IO & IO,const char * Class,SymbolKind Kind,CodeViewYAML::SymbolRecord & Obj)6331b88f4f3SZachary Turner static void mapSymbolRecordImpl(IO &IO, const char *Class, SymbolKind Kind,
6341b88f4f3SZachary Turner CodeViewYAML::SymbolRecord &Obj) {
6351b88f4f3SZachary Turner if (!IO.outputting())
636606d7665SZachary Turner Obj.Symbol = std::make_shared<ConcreteType>(Kind);
6371b88f4f3SZachary Turner
6381b88f4f3SZachary Turner IO.mapRequired(Class, *Obj.Symbol);
6391b88f4f3SZachary Turner }
6401b88f4f3SZachary Turner
mapping(IO & IO,CodeViewYAML::SymbolRecord & Obj)6411b88f4f3SZachary Turner void MappingTraits<CodeViewYAML::SymbolRecord>::mapping(
6421b88f4f3SZachary Turner IO &IO, CodeViewYAML::SymbolRecord &Obj) {
6431b88f4f3SZachary Turner SymbolKind Kind;
6441b88f4f3SZachary Turner if (IO.outputting())
6451b88f4f3SZachary Turner Kind = Obj.Symbol->Kind;
6461b88f4f3SZachary Turner IO.mapRequired("Kind", Kind);
6471b88f4f3SZachary Turner
6481b88f4f3SZachary Turner #define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \
6491b88f4f3SZachary Turner case EnumName: \
650606d7665SZachary Turner mapSymbolRecordImpl<SymbolRecordImpl<ClassName>>(IO, #ClassName, Kind, \
651606d7665SZachary Turner Obj); \
6521b88f4f3SZachary Turner break;
6531b88f4f3SZachary Turner #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \
6541b88f4f3SZachary Turner SYMBOL_RECORD(EnumName, EnumVal, ClassName)
6551b88f4f3SZachary Turner switch (Kind) {
6561b88f4f3SZachary Turner #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
657606d7665SZachary Turner default:
658606d7665SZachary Turner mapSymbolRecordImpl<UnknownSymbolRecord>(IO, "UnknownSym", Kind, Obj);
6591b88f4f3SZachary Turner }
6601b88f4f3SZachary Turner }
661