Go to the documentation of this file.
77 void ScalarEnumerationTraits<SymbolKind>::enumeration(IO &io,
80 for (
const auto &
E : SymbolNames)
81 io.enumCase(
Value,
E.Name.str().c_str(),
E.Value);
84 void ScalarBitSetTraits<CompileSym2Flags>::bitset(IO &io,
87 for (
const auto &
E : FlagNames) {
88 io.bitSetCase(Flags,
E.Name.str().c_str(),
93 void ScalarBitSetTraits<CompileSym3Flags>::bitset(IO &io,
96 for (
const auto &
E : FlagNames) {
97 io.bitSetCase(Flags,
E.Name.str().c_str(),
102 void ScalarBitSetTraits<ExportFlags>::bitset(IO &io,
ExportFlags &Flags) {
104 for (
const auto &
E : FlagNames) {
105 io.bitSetCase(Flags,
E.Name.str().c_str(),
110 void ScalarBitSetTraits<PublicSymFlags>::bitset(IO &io,
PublicSymFlags &Flags) {
112 for (
const auto &
E : FlagNames) {
113 io.bitSetCase(Flags,
E.Name.str().c_str(),
118 void ScalarBitSetTraits<LocalSymFlags>::bitset(IO &io,
LocalSymFlags &Flags) {
120 for (
const auto &
E : FlagNames) {
121 io.bitSetCase(Flags,
E.Name.str().c_str(),
126 void ScalarBitSetTraits<ProcSymFlags>::bitset(IO &io,
ProcSymFlags &Flags) {
128 for (
const auto &
E : FlagNames) {
129 io.bitSetCase(Flags,
E.Name.str().c_str(),
134 void ScalarBitSetTraits<FrameProcedureOptions>::bitset(
137 for (
const auto &
E : FlagNames) {
138 io.bitSetCase(Flags,
E.Name.str().c_str(),
143 void ScalarEnumerationTraits<CPUType>::enumeration(IO &io,
CPUType &Cpu) {
145 for (
const auto &
E : CpuNames) {
146 io.enumCase(Cpu,
E.Name.str().c_str(),
static_cast<CPUType>(
E.Value));
150 void ScalarEnumerationTraits<RegisterId>::enumeration(IO &io,
RegisterId &
Reg) {
151 const auto *Header =
static_cast<COFF::header *
>(io.getContext());
152 assert(Header &&
"The IO context is not initialized");
157 switch (Header->Machine) {
175 for (
const auto &
E : RegNames) {
176 io.enumCase(
Reg,
E.Name.str().c_str(),
static_cast<RegisterId>(
E.Value));
178 io.enumFallback<Hex16>(
Reg);
181 void ScalarEnumerationTraits<TrampolineType>::enumeration(
184 for (
const auto &
E : TrampNames) {
185 io.enumCase(Tramp,
E.Name.str().c_str(),
190 void ScalarEnumerationTraits<ThunkOrdinal>::enumeration(IO &io,
193 for (
const auto &
E : ThunkNames) {
194 io.enumCase(Ord,
E.Name.str().c_str(),
static_cast<ThunkOrdinal>(
E.Value));
198 void ScalarEnumerationTraits<FrameCookieKind>::enumeration(
201 for (
const auto &
E : ThunkNames) {
202 io.enumCase(
FC,
E.Name.str().c_str(),
212 io.mapRequired(
"ISectStart", Range.
ISectStart);
213 io.mapRequired(
"Range", Range.
Range);
219 io.mapRequired(
"Range", Gap.
Range);
226 namespace CodeViewYAML {
235 virtual void map(yaml::IO &io) = 0;
246 void map(yaml::IO &io)
override;
255 return SymbolDeserializer::deserializeAs<T>(CVS,
Symbol);
264 void map(yaml::IO &io)
override;
271 Prefix.RecordLen = TotalLen - 2;
272 uint8_t *Buffer =
Allocator.Allocate<uint8_t>(TotalLen);
289 void UnknownSymbolRecord::map(yaml::IO &io) {
293 io.mapRequired(
"Data", Binary);
294 if (!io.outputting()) {
297 Binary.writeAsBinary(OS);
299 Data.assign(Str.begin(), Str.end());
304 IO.mapRequired(
"Parent",
Symbol.Parent);
305 IO.mapRequired(
"End",
Symbol.End);
306 IO.mapRequired(
"Next",
Symbol.Next);
307 IO.mapRequired(
"Off",
Symbol.Offset);
308 IO.mapRequired(
"Seg",
Symbol.Segment);
309 IO.mapRequired(
"Len",
Symbol.Length);
310 IO.mapRequired(
"Ordinal",
Symbol.Thunk);
314 IO.mapRequired(
"Type",
Symbol.Type);
315 IO.mapRequired(
"Size",
Symbol.Size);
316 IO.mapRequired(
"ThunkOff",
Symbol.ThunkOffset);
317 IO.mapRequired(
"TargetOff",
Symbol.TargetOffset);
318 IO.mapRequired(
"ThunkSection",
Symbol.ThunkSection);
319 IO.mapRequired(
"TargetSection",
Symbol.TargetSection);
323 IO.mapRequired(
"SectionNumber",
Symbol.SectionNumber);
324 IO.mapRequired(
"Alignment",
Symbol.Alignment);
325 IO.mapRequired(
"Rva",
Symbol.Rva);
326 IO.mapRequired(
"Length",
Symbol.Length);
327 IO.mapRequired(
"Characteristics",
Symbol.Characteristics);
328 IO.mapRequired(
"Name",
Symbol.Name);
332 IO.mapRequired(
"Size",
Symbol.Size);
333 IO.mapRequired(
"Characteristics",
Symbol.Characteristics);
334 IO.mapRequired(
"Offset",
Symbol.Offset);
335 IO.mapRequired(
"Segment",
Symbol.Segment);
336 IO.mapRequired(
"Name",
Symbol.Name);
340 IO.mapRequired(
"Ordinal",
Symbol.Ordinal);
341 IO.mapRequired(
"Flags",
Symbol.Flags);
342 IO.mapRequired(
"Name",
Symbol.Name);
346 IO.mapOptional(
"PtrParent",
Symbol.Parent, 0U);
347 IO.mapOptional(
"PtrEnd",
Symbol.End, 0U);
348 IO.mapOptional(
"PtrNext",
Symbol.Next, 0U);
349 IO.mapRequired(
"CodeSize",
Symbol.CodeSize);
350 IO.mapRequired(
"DbgStart",
Symbol.DbgStart);
351 IO.mapRequired(
"DbgEnd",
Symbol.DbgEnd);
352 IO.mapRequired(
"FunctionType",
Symbol.FunctionType);
353 IO.mapOptional(
"Offset",
Symbol.CodeOffset, 0U);
355 IO.mapRequired(
"Flags",
Symbol.Flags);
356 IO.mapRequired(
"DisplayName",
Symbol.Name);
360 IO.mapRequired(
"Type",
Symbol.Index);
361 IO.mapRequired(
"Seg",
Symbol.Register);
362 IO.mapRequired(
"Name",
Symbol.Name);
366 IO.mapRequired(
"Flags",
Symbol.Flags);
367 IO.mapOptional(
"Offset",
Symbol.Offset, 0U);
369 IO.mapRequired(
"Name",
Symbol.Name);
373 IO.mapRequired(
"SumName",
Symbol.SumName);
374 IO.mapRequired(
"SymOffset",
Symbol.SymOffset);
375 IO.mapRequired(
"Mod",
Symbol.Module);
376 IO.mapRequired(
"Name",
Symbol.Name);
380 IO.mapRequired(
"Entries",
Symbol.Fields);
384 IO.mapOptional(
"PtrParent",
Symbol.Parent, 0U);
385 IO.mapOptional(
"PtrEnd",
Symbol.End, 0U);
386 IO.mapRequired(
"Inlinee",
Symbol.Inlinee);
391 IO.mapRequired(
"Type",
Symbol.Type);
392 IO.mapRequired(
"Flags",
Symbol.Flags);
394 IO.mapRequired(
"VarName",
Symbol.Name);
398 IO.mapRequired(
"Program",
Symbol.Program);
399 IO.mapRequired(
"Range",
Symbol.Range);
400 IO.mapRequired(
"Gaps",
Symbol.Gaps);
404 IO.mapRequired(
"Program",
Symbol.Program);
405 IO.mapRequired(
"OffsetInParent",
Symbol.OffsetInParent);
406 IO.mapRequired(
"Range",
Symbol.Range);
407 IO.mapRequired(
"Gaps",
Symbol.Gaps);
411 IO.mapRequired(
"Register",
Symbol.Hdr.Register);
412 IO.mapRequired(
"MayHaveNoName",
Symbol.Hdr.MayHaveNoName);
413 IO.mapRequired(
"Range",
Symbol.Range);
414 IO.mapRequired(
"Gaps",
Symbol.Gaps);
418 IO.mapRequired(
"Offset",
Symbol.Hdr.Offset);
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(
"OffsetInParent",
Symbol.Hdr.OffsetInParent);
427 IO.mapRequired(
"Range",
Symbol.Range);
428 IO.mapRequired(
"Gaps",
Symbol.Gaps);
433 IO.mapRequired(
"Register",
Symbol.Offset);
437 IO.mapRequired(
"Register",
Symbol.Hdr.Register);
438 IO.mapRequired(
"Flags",
Symbol.Hdr.Flags);
439 IO.mapRequired(
"BasePointerOffset",
Symbol.Hdr.BasePointerOffset);
440 IO.mapRequired(
"Range",
Symbol.Range);
441 IO.mapRequired(
"Gaps",
Symbol.Gaps);
445 IO.mapOptional(
"PtrParent",
Symbol.Parent, 0U);
446 IO.mapOptional(
"PtrEnd",
Symbol.End, 0U);
447 IO.mapRequired(
"CodeSize",
Symbol.CodeSize);
448 IO.mapOptional(
"Offset",
Symbol.CodeOffset, 0U);
450 IO.mapRequired(
"BlockName",
Symbol.Name);
454 IO.mapOptional(
"Offset",
Symbol.CodeOffset, 0U);
456 IO.mapRequired(
"Flags",
Symbol.Flags);
457 IO.mapRequired(
"Flags",
Symbol.Flags);
458 IO.mapRequired(
"DisplayName",
Symbol.Name);
462 IO.mapRequired(
"Signature",
Symbol.Signature);
463 IO.mapRequired(
"ObjectName",
Symbol.Name);
467 IO.mapRequired(
"Flags",
Symbol.Flags);
468 IO.mapRequired(
"Machine",
Symbol.Machine);
469 IO.mapRequired(
"FrontendMajor",
Symbol.VersionFrontendMajor);
470 IO.mapRequired(
"FrontendMinor",
Symbol.VersionFrontendMinor);
471 IO.mapRequired(
"FrontendBuild",
Symbol.VersionFrontendBuild);
472 IO.mapRequired(
"BackendMajor",
Symbol.VersionBackendMajor);
473 IO.mapRequired(
"BackendMinor",
Symbol.VersionBackendMinor);
474 IO.mapRequired(
"BackendBuild",
Symbol.VersionBackendBuild);
475 IO.mapRequired(
"Version",
Symbol.Version);
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(
"FrontendQFE",
Symbol.VersionFrontendQFE);
485 IO.mapRequired(
"BackendMajor",
Symbol.VersionBackendMajor);
486 IO.mapRequired(
"BackendMinor",
Symbol.VersionBackendMinor);
487 IO.mapRequired(
"BackendBuild",
Symbol.VersionBackendBuild);
488 IO.mapRequired(
"BackendQFE",
Symbol.VersionBackendQFE);
489 IO.mapRequired(
"Version",
Symbol.Version);
493 IO.mapRequired(
"TotalFrameBytes",
Symbol.TotalFrameBytes);
494 IO.mapRequired(
"PaddingFrameBytes",
Symbol.PaddingFrameBytes);
495 IO.mapRequired(
"OffsetToPadding",
Symbol.OffsetToPadding);
496 IO.mapRequired(
"BytesOfCalleeSavedRegisters",
497 Symbol.BytesOfCalleeSavedRegisters);
498 IO.mapRequired(
"OffsetOfExceptionHandler",
Symbol.OffsetOfExceptionHandler);
499 IO.mapRequired(
"SectionIdOfExceptionHandler",
500 Symbol.SectionIdOfExceptionHandler);
501 IO.mapRequired(
"Flags",
Symbol.Flags);
505 IO.mapOptional(
"Offset",
Symbol.CodeOffset, 0U);
507 IO.mapRequired(
"Type",
Symbol.Type);
511 IO.mapRequired(
"Index",
Symbol.Index);
512 IO.mapRequired(
"ModFilenameOffset",
Symbol.ModFilenameOffset);
513 IO.mapRequired(
"Flags",
Symbol.Flags);
514 IO.mapRequired(
"Name",
Symbol.Name);
518 IO.mapOptional(
"Offset",
Symbol.CodeOffset, 0U);
520 IO.mapRequired(
"CallInstructionSize",
Symbol.CallInstructionSize);
521 IO.mapRequired(
"Type",
Symbol.Type);
525 IO.mapRequired(
"Register",
Symbol.Register);
526 IO.mapRequired(
"CookieKind",
Symbol.CookieKind);
527 IO.mapRequired(
"Flags",
Symbol.Flags);
531 IO.mapRequired(
"FuncID",
Symbol.Indices);
535 IO.mapRequired(
"Type",
Symbol.Type);
536 IO.mapRequired(
"UDTName",
Symbol.Name);
540 IO.mapRequired(
"BuildId",
Symbol.BuildId);
544 IO.mapRequired(
"Offset",
Symbol.Offset);
545 IO.mapRequired(
"Type",
Symbol.Type);
546 IO.mapRequired(
"VarName",
Symbol.Name);
550 IO.mapRequired(
"Offset",
Symbol.Offset);
551 IO.mapRequired(
"Type",
Symbol.Type);
552 IO.mapRequired(
"Register",
Symbol.Register);
553 IO.mapRequired(
"VarName",
Symbol.Name);
557 IO.mapRequired(
"Type",
Symbol.Type);
558 IO.mapRequired(
"Value",
Symbol.Value);
559 IO.mapRequired(
"Name",
Symbol.Name);
563 IO.mapRequired(
"Type",
Symbol.Type);
564 IO.mapOptional(
"Offset",
Symbol.DataOffset, 0U);
566 IO.mapRequired(
"DisplayName",
Symbol.Name);
570 IO.mapRequired(
"Type",
Symbol.Type);
571 IO.mapOptional(
"Offset",
Symbol.DataOffset, 0U);
573 IO.mapRequired(
"DisplayName",
Symbol.Name);
577 IO.mapRequired(
"Namespace",
Symbol.Name);
581 IO.mapOptional(
"Offset",
Symbol.CodeOffset, 0U);
583 IO.mapRequired(
"Strings",
Symbol.Strings);
605 template <
typename SymbolType>
610 auto Impl = std::make_shared<SymbolType>(
Symbol.kind());
611 if (
auto EC = Impl->fromCodeViewSymbol(
Symbol))
613 Result.Symbol = Impl;
619 #define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \
621 return fromCodeViewSymbolImpl<SymbolRecordImpl<ClassName>>(Symbol);
622 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \
623 SYMBOL_RECORD(EnumName, EnumVal, ClassName)
625 #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
627 return fromCodeViewSymbolImpl<UnknownSymbolRecord>(
Symbol);
632 template <
typename ConcreteType>
635 if (!IO.outputting())
636 Obj.
Symbol = std::make_shared<ConcreteType>(
Kind);
638 IO.mapRequired(Class, *Obj.
Symbol);
646 IO.mapRequired(
"Kind",
Kind);
648 #define SYMBOL_RECORD(EnumName, EnumVal, ClassName) \
650 mapSymbolRecordImpl<SymbolRecordImpl<ClassName>>(IO, #ClassName, Kind, \
653 #define SYMBOL_RECORD_ALIAS(EnumName, EnumVal, AliasName, ClassName) \
654 SYMBOL_RECORD(EnumName, EnumVal, ClassName)
656 #include "llvm/DebugInfo/CodeView/CodeViewSymbols.def"
658 mapSymbolRecordImpl<UnknownSymbolRecord>(IO,
"UnknownSym",
Kind, Obj);
Error fromCodeViewSymbol(CVSymbol CVS) override
codeview::CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator, codeview::CodeViewContainer Container) const
This is an optimization pass for GlobalISel generic memory operations.
#define LLVM_YAML_DECLARE_ENUM_TRAITS(Type)
ArrayRef< EnumEntry< uint32_t > > getCompileSym3FlagNames()
SymbolKind
Duplicate copy of the above enum, but using the official CV names.
ProcSymFlags
Corresponds to the CV_PROCFLAGS bitfield.
A raw_ostream that writes to an std::string.
Reg
All possible values of the reg field in the ModR/M byte.
static ErrorSuccess success()
Create a success value.
@ IMAGE_FILE_MACHINE_AMD64
#define LLVM_YAML_IS_SEQUENCE_VECTOR(type)
ArrayRef< EnumEntry< uint16_t > > getLocalFlagNames()
The instances of the Type class are immutable: once they are created, they are never changed.
static void mapSymbolRecordImpl(IO &IO, const char *Class, SymbolKind Kind, CodeViewYAML::SymbolRecord &Obj)
@ IMAGE_FILE_MACHINE_ARMNT
Tagged union holding either a T or a Error.
ArrayRef< uint8_t > RecordData
SymbolRecordBase(codeview::SymbolKind K)
@ IMAGE_FILE_MACHINE_I386
ArrayRef< EnumEntry< uint8_t > > getThunkOrdinalNames()
static Expected< SymbolRecord > fromCodeViewSymbol(codeview::CVSymbol Symbol)
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
CVRecord< SymbolKind > CVSymbol
static CVSymbol writeOneSymbol(SymType &Sym, BumpPtrAllocator &Storage, CodeViewContainer Container)
Error fromCodeViewSymbol(codeview::CVSymbol CVS) override
ArrayRef< EnumEntry< uint32_t > > getPublicSymFlagNames()
An arbitrary precision integer that knows its signedness.
This class implements an extremely fast bulk output stream that can only output to a stream.
codeview::CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator, CodeViewContainer Container) const override
ArrayRef< EnumEntry< uint8_t > > getProcSymFlagNames()
The initial backend is deliberately restricted to z10 We should add support for later architectures at some point If an asm ties an i32 r result to an i64 input
static void mapping(IO &io, LocalVariableAddrGap &Gap)
UnknownSymbolRecord(codeview::SymbolKind K)
#define LLVM_YAML_DECLARE_SCALAR_TRAITS(Type, MustQuote)
ArrayRef< EnumEntry< unsigned > > getCPUTypeNames()
std::vector< uint8_t > Data
ArrayRef< T > drop_front(size_t N=1) const
Drop the first N elements of the array.
#define LLVM_YAML_IS_FLOW_SEQUENCE_VECTOR(type)
PublicSymFlags
Corresponds to the CV_PUBSYMFLAGS bitfield.
Allocate memory in an ever growing pool, as if by bump-pointer.
#define LLVM_YAML_STRONG_TYPEDEF(_base, _type)
compiles ldr LCPI1_0 ldr ldr mov lsr tst moveq r1 ldr LCPI1_1 and r0 bx lr It would be better to do something like to fold the shift into the conditional move
codeview::SymbolKind Kind
#define LLVM_YAML_DECLARE_BITSET_TRAITS(Type)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
<%struct.s * > cast struct s *S to sbyte *< sbyte * > sbyte uint cast struct s *agg result to sbyte *< sbyte * > sbyte uint cast struct s *memtmp to sbyte *< sbyte * > sbyte uint ret void llc ends up issuing two memcpy or custom lower memcpy(of small size) to be ldmia/stmia. I think option 2 is better but the current register allocator cannot allocate a chunk of registers at a time. A feasible temporary solution is to use specific physical registers at the lowering time for small(<
ArrayRef< EnumEntry< uint8_t > > getFrameCookieKindNames()
ArrayRef< EnumEntry< SymbolKind > > getSymbolTypeNames()
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
StringRef - Represent a constant reference to a string, i.e.
CVRecord is a fat pointer (base + size pair) to a symbol or type record.
Specialized YAMLIO scalar type for representing a binary blob.
add sub stmia L5 ldr r0 bl L_printf $stub Instead of a and a wouldn t it be better to do three moves *Return an aggregate type is even return S
@ IMAGE_FILE_MACHINE_ARM64
CompileSym2Flags
Corresponds to COMPILESYM2::Flags bitfield.
SymbolRecordImpl(codeview::SymbolKind K)
ArrayRef< EnumEntry< uint16_t > > getTrampolineNames()
CVSymbol toCodeViewSymbol(BumpPtrAllocator &Allocator, CodeViewContainer Container) const override
constexpr char TypeName[]
Key for Kernel::Arg::Metadata::mTypeName.
Lightweight error class with error context and mandatory checking.
CPUType
These values correspond to the CV_CPU_TYPE_e enumeration, and are documented here: https://msdn....
ArrayRef< EnumEntry< uint32_t > > getFrameProcSymFlagNames()
std::shared_ptr< detail::SymbolRecordBase > Symbol
SymbolRecordKind
Distinguishes individual records in the Symbols subsection of a .debug$S section.
ArrayRef< EnumEntry< uint32_t > > getCompileSym2FlagNames()
ThunkOrdinal
These values correspond to the THUNK_ORDINAL enumeration.
LocalSymFlags
Corresponds to CV_LVARFLAGS bitfield.
static void mapping(IO &io, LocalVariableAddrRange &Range)
static Expected< CodeViewYAML::SymbolRecord > fromCodeViewSymbolImpl(CVSymbol Symbol)
ArrayRef< EnumEntry< uint16_t > > getExportSymFlagNames()
CompileSym3Flags
Corresponds to COMPILESYM3::Flags bitfield.
static void mapping(IO &io, SymbolRecordBase &Record)
LLVM Value Representation.
ArrayRef< EnumEntry< uint16_t > > getRegisterNames(CPUType Cpu)