71 return ScalarTraits<StringRef>::input(S, V,
T.value);
74void ScalarTraits<TypeName>::output(
const TypeName &
T,
void *V,
76 ScalarTraits<StringRef>::output(
T.value, V, R);
79void ScalarEnumerationTraits<SymbolKind>::enumeration(IO &io,
82 for (
const auto &E : SymbolNames)
83 io.enumCase(
Value, E.Name.str().c_str(), E.
Value);
86void ScalarBitSetTraits<CompileSym2Flags>::bitset(IO &io,
89 for (
const auto &E : FlagNames) {
90 io.bitSetCase(Flags, E.Name.str().c_str(),
95void ScalarBitSetTraits<CompileSym3Flags>::bitset(IO &io,
98 for (
const auto &E : FlagNames) {
99 io.bitSetCase(Flags, E.Name.str().c_str(),
104void ScalarBitSetTraits<ExportFlags>::bitset(IO &io,
ExportFlags &Flags) {
106 for (
const auto &E : FlagNames) {
107 io.bitSetCase(Flags, E.Name.str().c_str(),
112void ScalarBitSetTraits<PublicSymFlags>::bitset(IO &io,
PublicSymFlags &Flags) {
114 for (
const auto &E : FlagNames) {
115 io.bitSetCase(Flags, E.Name.str().c_str(),
120void ScalarBitSetTraits<LocalSymFlags>::bitset(IO &io,
LocalSymFlags &Flags) {
122 for (
const auto &E : FlagNames) {
123 io.bitSetCase(Flags, E.Name.str().c_str(),
128void ScalarBitSetTraits<ProcSymFlags>::bitset(IO &io,
ProcSymFlags &Flags) {
130 for (
const auto &E : FlagNames) {
131 io.bitSetCase(Flags, E.Name.str().c_str(),
136void ScalarBitSetTraits<FrameProcedureOptions>::bitset(
139 for (
const auto &E : FlagNames) {
140 io.bitSetCase(Flags, E.Name.str().c_str(),
145void ScalarEnumerationTraits<CPUType>::enumeration(IO &io,
CPUType &Cpu) {
147 for (
const auto &E : CpuNames) {
148 io.enumCase(Cpu, E.Name.str().c_str(),
static_cast<CPUType>(E.Value));
152void ScalarEnumerationTraits<RegisterId>::enumeration(IO &io,
RegisterId &Reg) {
153 const auto *Header =
static_cast<COFF::header *
>(io.getContext());
154 assert(Header &&
"The IO context is not initialized");
156 std::optional<CPUType> CpuType;
159 switch (Header->Machine) {
161 CpuType = CPUType::Pentium3;
164 CpuType = CPUType::X64;
167 CpuType = CPUType::ARMNT;
172 CpuType = CPUType::ARM64;
179 for (
const auto &E : RegNames) {
180 io.enumCase(Reg, E.Name.str().c_str(),
static_cast<RegisterId>(E.Value));
182 io.enumFallback<Hex16>(
Reg);
185void ScalarEnumerationTraits<TrampolineType>::enumeration(
188 for (
const auto &E : TrampNames) {
189 io.enumCase(Tramp, E.Name.str().c_str(),
194void ScalarEnumerationTraits<ThunkOrdinal>::enumeration(IO &io,
197 for (
const auto &E : ThunkNames) {
198 io.enumCase(Ord, E.Name.str().c_str(),
static_cast<ThunkOrdinal>(E.Value));
202void ScalarEnumerationTraits<FrameCookieKind>::enumeration(
205 for (
const auto &E : ThunkNames) {
206 io.enumCase(FC, E.Name.str().c_str(),
211void ScalarEnumerationTraits<JumpTableEntrySize>::enumeration(
214 for (
const auto &E : ThunkNames) {
215 io.enumCase(FC, E.Name.str().c_str(),
224 io.mapRequired(
"OffsetStart",
Range.OffsetStart);
225 io.mapRequired(
"ISectStart",
Range.ISectStart);
226 io.mapRequired(
"Range",
Range.Range);
232 io.mapRequired(
"Range", Gap.
Range);
239namespace CodeViewYAML {
248 virtual void map(yaml::IO &io) = 0;
259 void map(yaml::IO &io)
override;
268 return SymbolDeserializer::deserializeAs<T>(CVS,
Symbol);
277 void map(yaml::IO &io)
override;
283 Prefix.RecordKind =
Kind;
284 Prefix.RecordLen = TotalLen - 2;
285 uint8_t *Buffer =
Allocator.Allocate<uint8_t>(TotalLen);
306 io.mapRequired(
"Data", Binary);
307 if (!io.outputting()) {
310 Binary.writeAsBinary(
OS);
312 Data.assign(Str.begin(), Str.end());
317 IO.mapRequired(
"Parent", Symbol.Parent);
318 IO.mapRequired(
"End", Symbol.End);
319 IO.mapRequired(
"Next", Symbol.Next);
320 IO.mapRequired(
"Off", Symbol.Offset);
321 IO.mapRequired(
"Seg", Symbol.Segment);
322 IO.mapRequired(
"Len", Symbol.Length);
323 IO.mapRequired(
"Ordinal", Symbol.Thunk);
327 IO.mapRequired(
"Type", Symbol.Type);
328 IO.mapRequired(
"Size", Symbol.Size);
329 IO.mapRequired(
"ThunkOff", Symbol.ThunkOffset);
330 IO.mapRequired(
"TargetOff", Symbol.TargetOffset);
331 IO.mapRequired(
"ThunkSection", Symbol.ThunkSection);
332 IO.mapRequired(
"TargetSection", Symbol.TargetSection);
336 IO.mapRequired(
"SectionNumber", Symbol.SectionNumber);
337 IO.mapRequired(
"Alignment", Symbol.Alignment);
338 IO.mapRequired(
"Rva", Symbol.Rva);
339 IO.mapRequired(
"Length", Symbol.Length);
340 IO.mapRequired(
"Characteristics", Symbol.Characteristics);
341 IO.mapRequired(
"Name", Symbol.Name);
345 IO.mapRequired(
"Size", Symbol.Size);
346 IO.mapRequired(
"Characteristics", Symbol.Characteristics);
347 IO.mapRequired(
"Offset", Symbol.Offset);
348 IO.mapRequired(
"Segment", Symbol.Segment);
349 IO.mapRequired(
"Name", Symbol.Name);
353 IO.mapRequired(
"Ordinal", Symbol.Ordinal);
354 IO.mapRequired(
"Flags", Symbol.Flags);
355 IO.mapRequired(
"Name", Symbol.Name);
359 IO.mapOptional(
"PtrParent", Symbol.Parent, 0U);
360 IO.mapOptional(
"PtrEnd", Symbol.End, 0U);
361 IO.mapOptional(
"PtrNext", Symbol.Next, 0U);
362 IO.mapRequired(
"CodeSize", Symbol.CodeSize);
363 IO.mapRequired(
"DbgStart", Symbol.DbgStart);
364 IO.mapRequired(
"DbgEnd", Symbol.DbgEnd);
365 IO.mapRequired(
"FunctionType", Symbol.FunctionType);
366 IO.mapOptional(
"Offset", Symbol.CodeOffset, 0U);
367 IO.mapOptional(
"Segment", Symbol.Segment,
uint16_t(0));
368 IO.mapRequired(
"Flags", Symbol.Flags);
369 IO.mapRequired(
"DisplayName", Symbol.Name);
373 IO.mapRequired(
"Type", Symbol.Index);
374 IO.mapRequired(
"Seg", Symbol.Register);
375 IO.mapRequired(
"Name", Symbol.Name);
379 IO.mapRequired(
"Flags", Symbol.Flags);
380 IO.mapOptional(
"Offset", Symbol.Offset, 0U);
381 IO.mapOptional(
"Segment", Symbol.Segment,
uint16_t(0));
382 IO.mapRequired(
"Name", Symbol.Name);
386 IO.mapRequired(
"SumName", Symbol.SumName);
387 IO.mapRequired(
"SymOffset", Symbol.SymOffset);
388 IO.mapRequired(
"Mod", Symbol.Module);
389 IO.mapRequired(
"Name", Symbol.Name);
393 IO.mapRequired(
"Entries", Symbol.Fields);
397 IO.mapOptional(
"PtrParent", Symbol.Parent, 0U);
398 IO.mapOptional(
"PtrEnd", Symbol.End, 0U);
399 IO.mapRequired(
"Inlinee", Symbol.Inlinee);
404 IO.mapRequired(
"Type", Symbol.Type);
405 IO.mapRequired(
"Flags", Symbol.Flags);
407 IO.mapRequired(
"VarName", Symbol.Name);
411 IO.mapRequired(
"Program", Symbol.Program);
412 IO.mapRequired(
"Range", Symbol.Range);
413 IO.mapRequired(
"Gaps", Symbol.Gaps);
417 IO.mapRequired(
"Program", Symbol.Program);
418 IO.mapRequired(
"OffsetInParent", Symbol.OffsetInParent);
419 IO.mapRequired(
"Range", Symbol.Range);
420 IO.mapRequired(
"Gaps", Symbol.Gaps);
424 IO.mapRequired(
"Register", Symbol.Hdr.Register);
425 IO.mapRequired(
"MayHaveNoName", Symbol.Hdr.MayHaveNoName);
426 IO.mapRequired(
"Range", Symbol.Range);
427 IO.mapRequired(
"Gaps", Symbol.Gaps);
431 IO.mapRequired(
"Offset", Symbol.Hdr.Offset);
432 IO.mapRequired(
"Range", Symbol.Range);
433 IO.mapRequired(
"Gaps", Symbol.Gaps);
437 IO.mapRequired(
"Register", Symbol.Hdr.Register);
438 IO.mapRequired(
"MayHaveNoName", Symbol.Hdr.MayHaveNoName);
439 IO.mapRequired(
"OffsetInParent", Symbol.Hdr.OffsetInParent);
440 IO.mapRequired(
"Range", Symbol.Range);
441 IO.mapRequired(
"Gaps", Symbol.Gaps);
446 IO.mapRequired(
"Register", Symbol.Offset);
450 IO.mapRequired(
"Register", Symbol.Hdr.Register);
451 IO.mapRequired(
"Flags", Symbol.Hdr.Flags);
452 IO.mapRequired(
"BasePointerOffset", Symbol.Hdr.BasePointerOffset);
453 IO.mapRequired(
"Range", Symbol.Range);
454 IO.mapRequired(
"Gaps", Symbol.Gaps);
458 IO.mapOptional(
"PtrParent", Symbol.Parent, 0U);
459 IO.mapOptional(
"PtrEnd", Symbol.End, 0U);
460 IO.mapRequired(
"CodeSize", Symbol.CodeSize);
461 IO.mapOptional(
"Offset", Symbol.CodeOffset, 0U);
462 IO.mapOptional(
"Segment", Symbol.Segment,
uint16_t(0));
463 IO.mapRequired(
"BlockName", Symbol.Name);
467 IO.mapOptional(
"Offset", Symbol.CodeOffset, 0U);
468 IO.mapOptional(
"Segment", Symbol.Segment,
uint16_t(0));
469 IO.mapRequired(
"Flags", Symbol.Flags);
470 IO.mapRequired(
"DisplayName", Symbol.Name);
474 IO.mapRequired(
"Signature", Symbol.Signature);
475 IO.mapRequired(
"ObjectName", Symbol.Name);
479 IO.mapRequired(
"Flags", Symbol.Flags);
480 IO.mapRequired(
"Machine", Symbol.Machine);
481 IO.mapRequired(
"FrontendMajor", Symbol.VersionFrontendMajor);
482 IO.mapRequired(
"FrontendMinor", Symbol.VersionFrontendMinor);
483 IO.mapRequired(
"FrontendBuild", Symbol.VersionFrontendBuild);
484 IO.mapRequired(
"BackendMajor", Symbol.VersionBackendMajor);
485 IO.mapRequired(
"BackendMinor", Symbol.VersionBackendMinor);
486 IO.mapRequired(
"BackendBuild", Symbol.VersionBackendBuild);
487 IO.mapRequired(
"Version", Symbol.Version);
491 IO.mapRequired(
"Flags", Symbol.Flags);
492 IO.mapRequired(
"Machine", Symbol.Machine);
493 IO.mapRequired(
"FrontendMajor", Symbol.VersionFrontendMajor);
494 IO.mapRequired(
"FrontendMinor", Symbol.VersionFrontendMinor);
495 IO.mapRequired(
"FrontendBuild", Symbol.VersionFrontendBuild);
496 IO.mapRequired(
"FrontendQFE", Symbol.VersionFrontendQFE);
497 IO.mapRequired(
"BackendMajor", Symbol.VersionBackendMajor);
498 IO.mapRequired(
"BackendMinor", Symbol.VersionBackendMinor);
499 IO.mapRequired(
"BackendBuild", Symbol.VersionBackendBuild);
500 IO.mapRequired(
"BackendQFE", Symbol.VersionBackendQFE);
501 IO.mapRequired(
"Version", Symbol.Version);
505 IO.mapRequired(
"TotalFrameBytes", Symbol.TotalFrameBytes);
506 IO.mapRequired(
"PaddingFrameBytes", Symbol.PaddingFrameBytes);
507 IO.mapRequired(
"OffsetToPadding", Symbol.OffsetToPadding);
508 IO.mapRequired(
"BytesOfCalleeSavedRegisters",
509 Symbol.BytesOfCalleeSavedRegisters);
510 IO.mapRequired(
"OffsetOfExceptionHandler", Symbol.OffsetOfExceptionHandler);
511 IO.mapRequired(
"SectionIdOfExceptionHandler",
512 Symbol.SectionIdOfExceptionHandler);
513 IO.mapRequired(
"Flags", Symbol.Flags);
517 IO.mapOptional(
"Offset", Symbol.CodeOffset, 0U);
518 IO.mapOptional(
"Segment", Symbol.Segment,
uint16_t(0));
519 IO.mapRequired(
"Type", Symbol.Type);
523 IO.mapRequired(
"Index", Symbol.Index);
524 IO.mapRequired(
"ModFilenameOffset", Symbol.ModFilenameOffset);
525 IO.mapRequired(
"Flags", Symbol.Flags);
526 IO.mapRequired(
"Name", Symbol.Name);
530 IO.mapOptional(
"Offset", Symbol.CodeOffset, 0U);
531 IO.mapOptional(
"Segment", Symbol.Segment,
uint16_t(0));
532 IO.mapRequired(
"CallInstructionSize", Symbol.CallInstructionSize);
533 IO.mapRequired(
"Type", Symbol.Type);
537 IO.mapRequired(
"Register", Symbol.Register);
538 IO.mapRequired(
"CookieKind", Symbol.CookieKind);
539 IO.mapRequired(
"Flags", Symbol.Flags);
543 IO.mapRequired(
"FuncID", Symbol.Indices);
547 IO.mapRequired(
"Type", Symbol.Type);
548 IO.mapRequired(
"UDTName", Symbol.Name);
552 IO.mapRequired(
"BuildId", Symbol.BuildId);
556 IO.mapRequired(
"Offset", Symbol.Offset);
557 IO.mapRequired(
"Type", Symbol.Type);
558 IO.mapRequired(
"VarName", Symbol.Name);
562 IO.mapRequired(
"Offset", Symbol.Offset);
563 IO.mapRequired(
"Type", Symbol.Type);
564 IO.mapRequired(
"Register", Symbol.Register);
565 IO.mapRequired(
"VarName", Symbol.Name);
569 IO.mapRequired(
"Type", Symbol.Type);
570 IO.mapRequired(
"Value", Symbol.Value);
571 IO.mapRequired(
"Name", Symbol.Name);
575 IO.mapRequired(
"Type", Symbol.Type);
576 IO.mapOptional(
"Offset", Symbol.DataOffset, 0U);
577 IO.mapOptional(
"Segment", Symbol.Segment,
uint16_t(0));
578 IO.mapRequired(
"DisplayName", Symbol.Name);
582 IO.mapRequired(
"Type", Symbol.Type);
583 IO.mapOptional(
"Offset", Symbol.DataOffset, 0U);
584 IO.mapOptional(
"Segment", Symbol.Segment,
uint16_t(0));
585 IO.mapRequired(
"DisplayName", Symbol.Name);
589 IO.mapRequired(
"Namespace", Symbol.Name);
593 IO.mapOptional(
"Offset", Symbol.CodeOffset, 0U);
594 IO.mapOptional(
"Segment", Symbol.Segment,
uint16_t(0));
595 IO.mapRequired(
"Strings", Symbol.Strings);
599 IO.mapRequired(
"BaseOffset", Symbol.BaseOffset);
600 IO.mapRequired(
"BaseSegment", Symbol.BaseSegment);
601 IO.mapRequired(
"SwitchType", Symbol.SwitchType);
602 IO.mapRequired(
"BranchOffset", Symbol.BranchOffset);
603 IO.mapRequired(
"TableOffset", Symbol.TableOffset);
604 IO.mapRequired(
"BranchSegment", Symbol.BranchSegment);
605 IO.mapRequired(
"TableSegment", Symbol.TableSegment);
606 IO.mapRequired(
"EntriesCount", Symbol.EntriesCount);
628template <
typename SymbolType>
633 auto Impl = std::make_shared<SymbolType>(Symbol.kind());
634 if (
auto EC = Impl->fromCodeViewSymbol(Symbol))
635 return std::move(
EC);
636 Result.Symbol = Impl;
642#define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \
644 return fromCodeViewSymbolImpl<SymbolRecordImpl<ClassName>>(Symbol);
645#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \
646 SYMBOL_RECORD(EnumName, EnumVal, ClassName)
647 switch (Symbol.kind()) {
648#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
650 return fromCodeViewSymbolImpl<UnknownSymbolRecord>(Symbol);
652 return make_error<CodeViewError>(cv_error_code::corrupt_record);
655template <
typename ConcreteType>
658 if (!IO.outputting())
659 Obj.
Symbol = std::make_shared<ConcreteType>(Kind);
661 IO.mapRequired(Class, *Obj.
Symbol);
669 IO.mapRequired(
"Kind", Kind);
671#define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \
673 mapSymbolRecordImpl<SymbolRecordImpl<ClassName>>(IO, #ClassName, Kind, \
676#define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \
677 SYMBOL_RECORD(EnumName, EnumVal, ClassName)
679#include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
681 mapSymbolRecordImpl<UnknownSymbolRecord>(IO,
"UnknownSym", Kind, Obj);
This file defines the BumpPtrAllocator interface.
static void mapSymbolRecordImpl(IO &IO, const char *Class, SymbolKind Kind, CodeViewYAML::SymbolRecord &Obj)
static Expected< CodeViewYAML::SymbolRecord > fromCodeViewSymbolImpl(CVSymbol Symbol)
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
#define LLVM_YAML_DECLARE_BITSET_TRAITS(Type)
#define LLVM_YAML_IS_SEQUENCE_VECTOR(type)
#define LLVM_YAML_DECLARE_SCALAR_TRAITS(Type, MustQuote)
#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(type)
#define LLVM_YAML_STRONG_TYPEDEF(_base, _type)
#define LLVM_YAML_DECLARE_ENUM_TRAITS(Type)
An arbitrary precision integer that knows its signedness.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
Allocate memory in an ever growing pool, as if by bump-pointer.
Lightweight error class with error context and mandatory checking.
static ErrorSuccess success()
Create a success value.
Tagged union holding either a T or a Error.
StringRef - Represent a constant reference to a string, i.e.
The instances of the Type class are immutable: once they are created, they are never changed.
LLVM Value Representation.
Value(Type *Ty, unsigned scid)
CVRecord is a fat pointer (base + size pair) to a symbol or type record.
ArrayRef< uint8_t > RecordData
static CVSymbol writeOneSymbol(SymType &Sym, BumpPtrAllocator &Storage, CodeViewContainer Container)
This class implements an extremely fast bulk output stream that can only output to a stream.
A raw_ostream that writes to an std::string.
Specialized YAMLIO scalar type for representing a binary blob.
@ IMAGE_FILE_MACHINE_ARM64
@ IMAGE_FILE_MACHINE_AMD64
@ IMAGE_FILE_MACHINE_ARM64EC
@ IMAGE_FILE_MACHINE_I386
@ IMAGE_FILE_MACHINE_ARM64X
@ IMAGE_FILE_MACHINE_ARMNT
Reg
All possible values of the reg field in the ModR/M byte.
ProcSymFlags
Corresponds to the CV_PROCFLAGS bitfield.
LocalSymFlags
Corresponds to CV_LVARFLAGS bitfield.
CompileSym2Flags
Corresponds to COMPILESYM2::Flags bitfield.
CPUType
These values correspond to the CV_CPU_TYPE_e enumeration, and are documented here: https://msdn....
CompileSym3Flags
Corresponds to COMPILESYM3::Flags bitfield.
ArrayRef< EnumEntry< uint32_t > > getCompileSym2FlagNames()
ArrayRef< EnumEntry< uint16_t > > getExportSymFlagNames()
ArrayRef< EnumEntry< uint16_t > > getJumpTableEntrySizeNames()
SymbolRecordKind
Distinguishes individual records in the Symbols subsection of a .debug$S section.
ArrayRef< EnumEntry< SymbolKind > > getSymbolTypeNames()
ThunkOrdinal
These values correspond to the THUNK_ORDINAL enumeration.
ArrayRef< EnumEntry< uint16_t > > getLocalFlagNames()
ArrayRef< EnumEntry< uint16_t > > getRegisterNames(CPUType Cpu)
ArrayRef< EnumEntry< uint8_t > > getThunkOrdinalNames()
ArrayRef< EnumEntry< uint8_t > > getProcSymFlagNames()
SymbolKind
Duplicate copy of the above enum, but using the official CV names.
ArrayRef< EnumEntry< unsigned > > getCPUTypeNames()
CVRecord< SymbolKind > CVSymbol
ArrayRef< EnumEntry< uint32_t > > getFrameProcSymFlagNames()
ArrayRef< EnumEntry< uint16_t > > getTrampolineNames()
PublicSymFlags
Corresponds to the CV_PUBSYMFLAGS bitfield.
ArrayRef< EnumEntry< uint32_t > > getPublicSymFlagNames()
ArrayRef< EnumEntry< uint32_t > > getCompileSym3FlagNames()
ArrayRef< EnumEntry< uint8_t > > getFrameCookieKindNames()
This is an optimization pass for GlobalISel generic memory operations.
codeview::CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator, codeview::CodeViewContainer Container) const
std::shared_ptr< detail::SymbolRecordBase > Symbol
static Expected< SymbolRecord > fromCodeViewSymbol(codeview::CVSymbol Symbol)
SymbolRecordBase(codeview::SymbolKind K)
codeview::SymbolKind Kind
virtual void map(yaml::IO &io)=0
virtual codeview::CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator, CodeViewContainer Container) const =0
virtual ~SymbolRecordBase()=default
virtual Error fromCodeViewSymbol(codeview::CVSymbol Type)=0
codeview::CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator, CodeViewContainer Container) const override
void map(yaml::IO &io) override
Error fromCodeViewSymbol(codeview::CVSymbol CVS) override
SymbolRecordImpl(codeview::SymbolKind K)
std::vector< uint8_t > Data
Error fromCodeViewSymbol(CVSymbol CVS) override
void map(yaml::IO &io) override
UnknownSymbolRecord(codeview::SymbolKind K)
CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator, CodeViewContainer Container) const override
static void mapping(IO &io, LocalVariableAddrGap &Gap)
static void mapping(IO &io, LocalVariableAddrRange &Range)
static void mapping(IO &io, SymbolRecordBase &Record)