//===- CodeView.h -----------------------------------------------*- C++ -*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef LLVM_DEBUGINFO_CODEVIEW_CODEVIEW_H #define LLVM_DEBUGINFO_CODEVIEW_CODEVIEW_H #include namespace llvm { namespace codeview { enum class CallingConvention : uint8_t { NearC = 0x00, // near right to left push, caller pops stack FarC = 0x01, // far right to left push, caller pops stack NearPascal = 0x02, // near left to right push, callee pops stack FarPascal = 0x03, // far left to right push, callee pops stack NearFast = 0x04, // near left to right push with regs, callee pops stack FarFast = 0x05, // far left to right push with regs, callee pops stack NearStdCall = 0x07, // near standard call FarStdCall = 0x08, // far standard call NearSysCall = 0x09, // near sys call FarSysCall = 0x0a, // far sys call ThisCall = 0x0b, // this call (this passed in register) MipsCall = 0x0c, // Mips call Generic = 0x0d, // Generic call sequence AlphaCall = 0x0e, // Alpha call PpcCall = 0x0f, // PPC call SHCall = 0x10, // Hitachi SuperH call ArmCall = 0x11, // ARM call AM33Call = 0x12, // AM33 call TriCall = 0x13, // TriCore Call SH5Call = 0x14, // Hitachi SuperH-5 call M32RCall = 0x15, // M32R Call ClrCall = 0x16, // clr call Inline = 0x17, // Marker for routines always inlined and thus lacking a convention NearVector = 0x18 // near left to right push with regs, callee pops stack }; enum class ClassOptions : uint16_t { None = 0x0000, Packed = 0x0001, HasConstructorOrDestructor = 0x0002, HasOverloadedOperator = 0x0004, Nested = 0x0008, ContainsNestedClass = 0x0010, HasOverloadedAssignmentOperator = 0x0020, HasConversionOperator = 0x0040, ForwardReference = 0x0080, Scoped = 0x0100, HasUniqueName = 0x0200, Sealed = 0x0400, Intrinsic = 0x2000 }; inline ClassOptions operator|(ClassOptions a, ClassOptions b) { return static_cast(static_cast(a) | static_cast(b)); } inline ClassOptions operator&(ClassOptions a, ClassOptions b) { return static_cast(static_cast(a) & static_cast(b)); } inline ClassOptions operator~(ClassOptions a) { return static_cast(~static_cast(a)); } enum class FrameProcedureOptions : uint32_t { None = 0x00000000, HasAlloca = 0x00000001, HasSetJmp = 0x00000002, HasLongJmp = 0x00000004, HasInlineAssembly = 0x00000008, HasExceptionHandling = 0x00000010, MarkedInline = 0x00000020, HasStructuredExceptionHandling = 0x00000040, Naked = 0x00000080, SecurityChecks = 0x00000100, AsynchronousExceptionHandling = 0x00000200, NoStackOrderingForSecurityChecks = 0x00000400, Inlined = 0x00000800, StrictSecurityChecks = 0x00001000, SafeBuffers = 0x00002000, ProfileGuidedOptimization = 0x00040000, ValidProfileCounts = 0x00080000, OptimizedForSpeed = 0x00100000, GuardCfg = 0x00200000, GuardCfw = 0x00400000 }; inline FrameProcedureOptions operator|(FrameProcedureOptions a, FrameProcedureOptions b) { return static_cast(static_cast(a) | static_cast(b)); } inline FrameProcedureOptions operator&(FrameProcedureOptions a, FrameProcedureOptions b) { return static_cast(static_cast(a) & static_cast(b)); } inline FrameProcedureOptions operator~(FrameProcedureOptions a) { return static_cast(~static_cast(a)); } enum class FunctionOptions : uint8_t { None = 0x00, CxxReturnUdt = 0x01, Constructor = 0x02, ConstructorWithVirtualBases = 0x04 }; inline FunctionOptions operator|(FunctionOptions a, FunctionOptions b) { return static_cast(static_cast(a) | static_cast(b)); } inline FunctionOptions operator&(FunctionOptions a, FunctionOptions b) { return static_cast(static_cast(a) & static_cast(b)); } inline FunctionOptions operator~(FunctionOptions a) { return static_cast(~static_cast(a)); } enum class HfaKind : uint8_t { None = 0x00, Float = 0x01, Double = 0x02, Other = 0x03 }; enum class MemberAccess : uint8_t { None = 0, Private = 1, Protected = 2, Public = 3 }; enum class MethodKind : uint8_t { Vanilla = 0x00, Virtual = 0x01, Static = 0x02, Friend = 0x03, IntroducingVirtual = 0x04, PureVirtual = 0x05, PureIntroducingVirtual = 0x06 }; enum class MethodOptions : uint16_t { None = 0x0000, Pseudo = 0x0020, CompilerGenerated = 0x0100, Sealed = 0x0200 }; inline MethodOptions operator|(MethodOptions a, MethodOptions b) { return static_cast(static_cast(a) | static_cast(b)); } inline MethodOptions operator&(MethodOptions a, MethodOptions b) { return static_cast(static_cast(a) & static_cast(b)); } inline MethodOptions operator~(MethodOptions a) { return static_cast(~static_cast(a)); } enum class ModifierOptions : uint16_t { None = 0x0000, Const = 0x0001, Volatile = 0x0002, Unaligned = 0x0004 }; inline ModifierOptions operator|(ModifierOptions a, ModifierOptions b) { return static_cast(static_cast(a) | static_cast(b)); } inline ModifierOptions operator&(ModifierOptions a, ModifierOptions b) { return static_cast(static_cast(a) & static_cast(b)); } inline ModifierOptions operator~(ModifierOptions a) { return static_cast(~static_cast(a)); } enum class ModuleSubstreamKind : uint32_t { Symbols = 0xf1, Lines = 0xf2, StringTable = 0xf3, FileChecksums = 0xf4, FrameData = 0xf5, InlineeLines = 0xf6, CrossScopeImports = 0xf7, CrossScopeExports = 0xf8 }; enum class PointerKind : uint8_t { Near16 = 0x00, // 16 bit pointer Far16 = 0x01, // 16:16 far pointer Huge16 = 0x02, // 16:16 huge pointer BasedOnSegment = 0x03, // based on segment BasedOnValue = 0x04, // based on value of base BasedOnSegmentValue = 0x05, // based on segment value of base BasedOnAddress = 0x06, // based on address of base BasedOnSegmentAddress = 0x07, // based on segment address of base BasedOnType = 0x08, // based on type BasedOnSelf = 0x09, // based on self Near32 = 0x0a, // 32 bit pointer Far32 = 0x0b, // 16:32 pointer Near64 = 0x0c // 64 bit pointer }; enum class PointerMode : uint8_t { Pointer = 0x00, // "normal" pointer LValueReference = 0x01, // "old" reference PointerToDataMember = 0x02, // pointer to data member PointerToMemberFunction = 0x03, // pointer to member function RValueReference = 0x04 // r-value reference }; enum class PointerOptions : uint32_t { None = 0x00000000, Flat32 = 0x00000100, Volatile = 0x00000200, Const = 0x00000400, Unaligned = 0x00000800, Restrict = 0x00001000, WinRTSmartPointer = 0x00080000 }; inline PointerOptions operator|(PointerOptions a, PointerOptions b) { return static_cast(static_cast(a) | static_cast(b)); } inline PointerOptions operator&(PointerOptions a, PointerOptions b) { return static_cast(static_cast(a) & static_cast(b)); } inline PointerOptions operator~(PointerOptions a) { return static_cast(~static_cast(a)); } enum class PointerToMemberRepresentation : uint16_t { Unknown = 0x00, // not specified (pre VC8) SingleInheritanceData = 0x01, // member data, single inheritance MultipleInheritanceData = 0x02, // member data, multiple inheritance VirtualInheritanceData = 0x03, // member data, virtual inheritance GeneralData = 0x04, // member data, most general SingleInheritanceFunction = 0x05, // member function, single inheritance MultipleInheritanceFunction = 0x06, // member function, multiple inheritance VirtualInheritanceFunction = 0x07, // member function, virtual inheritance GeneralFunction = 0x08 // member function, most general }; enum class TypeRecordKind : uint16_t { None = 0, VirtualTableShape = 0x000a, Label = 0x000e, EndPrecompiledHeader = 0x0014, Modifier = 0x1001, Pointer = 0x1002, Procedure = 0x1008, MemberFunction = 0x1009, Oem = 0x100f, Oem2 = 0x1011, ArgumentList = 0x1201, FieldList = 0x1203, BitField = 0x1205, MethodList = 0x1206, BaseClass = 0x1400, VirtualBaseClass = 0x1401, IndirectVirtualBaseClass = 0x1402, Index = 0x1404, VirtualFunctionTablePointer = 0x1409, Enumerate = 0x1502, Array = 0x1503, Class = 0x1504, Structure = 0x1505, Union = 0x1506, Enum = 0x1507, Alias = 0x150a, Member = 0x150d, StaticMember = 0x150e, Method = 0x150f, NestedType = 0x1510, OneMethod = 0x1511, VirtualFunctionTable = 0x151d, FunctionId = 0x1601, MemberFunctionId = 0x1602, BuildInfo = 0x1603, SubstringList = 0x1604, StringId = 0x1605, UdtSourceLine = 0x1606, SByte = 0x8000, Int16 = 0x8001, UInt16 = 0x8002, Int32 = 0x8003, UInt32 = 0x8004, Single = 0x8005, Double = 0x8006, Float80 = 0x8007, Float128 = 0x8008, Int64 = 0x8009, UInt64 = 0x800a, Float48 = 0x800b, Complex32 = 0x800c, Complex64 = 0x800d, Complex80 = 0x800e, Complex128 = 0x800f, VarString = 0x8010, Int128 = 0x8017, UInt128 = 0x8018, Decimal = 0x8019, Date = 0x801a, Utf8String = 0x801b, Float16 = 0x801c }; enum class VirtualTableSlotKind : uint8_t { Near16 = 0x00, Far16 = 0x01, This = 0x02, Outer = 0x03, Meta = 0x04, Near = 0x05, Far = 0x06 }; enum class WindowsRTClassKind : uint8_t { None = 0x00, RefClass = 0x01, ValueClass = 0x02, Interface = 0x03 }; } } #endif