summaryrefslogtreecommitdiff
path: root/src/vm/amd64/asmconstants.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/vm/amd64/asmconstants.h')
-rw-r--r--src/vm/amd64/asmconstants.h702
1 files changed, 702 insertions, 0 deletions
diff --git a/src/vm/amd64/asmconstants.h b/src/vm/amd64/asmconstants.h
new file mode 100644
index 0000000000..32b23c83c3
--- /dev/null
+++ b/src/vm/amd64/asmconstants.h
@@ -0,0 +1,702 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+//
+// See makefile.inc. During the build, this file is converted into a .inc
+// file for inclusion by .asm files. The #defines are converted into EQU's.
+//
+// Allow multiple inclusion.
+
+
+#ifndef _TARGET_AMD64_
+#error this file should only be used on an AMD64 platform
+#endif // _TARGET_AMD64_
+
+#include "../../inc/switches.h"
+
+#ifndef ASMCONSTANTS_C_ASSERT
+#define ASMCONSTANTS_C_ASSERT(cond)
+#endif
+
+#ifndef ASMCONSTANTS_RUNTIME_ASSERT
+#define ASMCONSTANTS_RUNTIME_ASSERT(cond)
+#endif
+
+
+// Some contants are different in _DEBUG builds. This macro factors out
+// ifdefs from below.
+#ifdef _DEBUG
+#define DBG_FRE(dbg,fre) dbg
+#else
+#define DBG_FRE(dbg,fre) fre
+#endif
+
+#define DynamicHelperFrameFlags_Default 0
+#define DynamicHelperFrameFlags_ObjectArg 1
+#define DynamicHelperFrameFlags_ObjectArg2 2
+
+#define ASMCONSTANT_OFFSETOF_ASSERT(struct, member) \
+ASMCONSTANTS_C_ASSERT(OFFSETOF__##struct##__##member == offsetof(struct, member));
+
+#define ASMCONSTANT_SIZEOF_ASSERT(classname) \
+ASMCONSTANTS_C_ASSERT(SIZEOF__##classname == sizeof(classname));
+
+#define ASM_ELEMENT_TYPE_R4 0xC
+ASMCONSTANTS_C_ASSERT(ASM_ELEMENT_TYPE_R4 == ELEMENT_TYPE_R4);
+
+#define ASM_ELEMENT_TYPE_R8 0xD
+ASMCONSTANTS_C_ASSERT(ASM_ELEMENT_TYPE_R8 == ELEMENT_TYPE_R8);
+
+#ifdef FEATURE_INCLUDE_ALL_INTERFACES
+#define ASM_CLRTASKHOSTED 0x2
+ASMCONSTANTS_C_ASSERT(ASM_CLRTASKHOSTED == CLRTASKHOSTED);
+#endif
+
+#define METHODDESC_REGNUM 10
+#define METHODDESC_REGISTER r10
+
+#define PINVOKE_CALLI_TARGET_REGNUM 10
+#define PINVOKE_CALLI_TARGET_REGISTER r10
+
+#define PINVOKE_CALLI_SIGTOKEN_REGNUM 11
+#define PINVOKE_CALLI_SIGTOKEN_REGISTER r11
+
+#ifdef UNIX_AMD64_ABI
+// rdi, rsi, rdx, rcx, r8, r9
+#define SIZEOF_MAX_INT_ARG_SPILL 0x30
+// xmm0...xmm7
+#define SIZEOF_MAX_FP_ARG_SPILL 0x80
+#else
+// rcx, rdx, r8, r9
+#define SIZEOF_MAX_OUTGOING_ARGUMENT_HOMES 0x20
+// xmm0...xmm3
+#define SIZEOF_MAX_FP_ARG_SPILL 0x40
+#endif
+
+
+
+#ifndef UNIX_AMD64_ABI
+#define SIZEOF_CalleeSavedRegisters 0x40
+ASMCONSTANTS_C_ASSERT(SIZEOF_CalleeSavedRegisters == sizeof(CalleeSavedRegisters));
+#else
+#define SIZEOF_CalleeSavedRegisters 0x30
+ASMCONSTANTS_C_ASSERT(SIZEOF_CalleeSavedRegisters == sizeof(CalleeSavedRegisters));
+#endif
+
+#define SIZEOF_GSCookie 0x8
+ASMCONSTANTS_C_ASSERT(SIZEOF_GSCookie == sizeof(GSCookie));
+
+#define OFFSETOF__Frame____VFN_table 0
+
+#define OFFSETOF__Frame__m_Next 0x8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__Frame__m_Next
+ == offsetof(Frame, m_Next));
+
+#define SIZEOF__Frame 0x10
+
+#ifdef FEATURE_COMINTEROP
+#define SIZEOF__ComPrestubMethodFrame 0x20
+ASMCONSTANTS_C_ASSERT(SIZEOF__ComPrestubMethodFrame
+ == sizeof(ComPrestubMethodFrame));
+
+#define SIZEOF__ComMethodFrame 0x20
+ASMCONSTANTS_C_ASSERT(SIZEOF__ComMethodFrame
+ == sizeof(ComMethodFrame));
+#endif // FEATURE_COMINTEROP
+
+#define OFFSETOF__UMEntryThunk__m_pUMThunkMarshInfo 0x18
+ASMCONSTANTS_C_ASSERT(OFFSETOF__UMEntryThunk__m_pUMThunkMarshInfo
+ == offsetof(UMEntryThunk, m_pUMThunkMarshInfo));
+
+#define OFFSETOF__UMEntryThunk__m_dwDomainId 0x20
+ASMCONSTANTS_C_ASSERT(OFFSETOF__UMEntryThunk__m_dwDomainId
+ == offsetof(UMEntryThunk, m_dwDomainId));
+
+#define OFFSETOF__UMThunkMarshInfo__m_pILStub 0x00
+ASMCONSTANTS_C_ASSERT(OFFSETOF__UMThunkMarshInfo__m_pILStub
+ == offsetof(UMThunkMarshInfo, m_pILStub));
+
+#define OFFSETOF__UMThunkMarshInfo__m_cbActualArgSize 0x08
+ASMCONSTANTS_C_ASSERT(OFFSETOF__UMThunkMarshInfo__m_cbActualArgSize
+ == offsetof(UMThunkMarshInfo, m_cbActualArgSize));
+
+#ifdef FEATURE_COMINTEROP
+
+#define OFFSETOF__ComPlusCallMethodDesc__m_pComPlusCallInfo DBG_FRE(0x30, 0x08)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__ComPlusCallMethodDesc__m_pComPlusCallInfo
+ == offsetof(ComPlusCallMethodDesc, m_pComPlusCallInfo));
+
+#define OFFSETOF__ComPlusCallInfo__m_pILStub 0x0
+ASMCONSTANTS_C_ASSERT(OFFSETOF__ComPlusCallInfo__m_pILStub
+ == offsetof(ComPlusCallInfo, m_pILStub));
+
+#endif // FEATURE_COMINTEROP
+
+#define OFFSETOF__Thread__m_fPreemptiveGCDisabled 0x0C
+#ifndef CROSSGEN_COMPILE
+ASMCONSTANTS_C_ASSERT(OFFSETOF__Thread__m_fPreemptiveGCDisabled
+ == offsetof(Thread, m_fPreemptiveGCDisabled));
+#endif
+#define Thread_m_fPreemptiveGCDisabled OFFSETOF__Thread__m_fPreemptiveGCDisabled
+
+#define OFFSETOF__Thread__m_pFrame 0x10
+#ifndef CROSSGEN_COMPILE
+ASMCONSTANTS_C_ASSERT(OFFSETOF__Thread__m_pFrame
+ == offsetof(Thread, m_pFrame));
+#endif
+#define Thread_m_pFrame OFFSETOF__Thread__m_pFrame
+
+#ifndef CROSSGEN_COMPILE
+#define OFFSETOF__Thread__m_State 0x8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__Thread__m_State
+ == offsetof(Thread, m_State));
+
+#define OFFSETOF__Thread__m_pDomain 0x20
+ASMCONSTANTS_C_ASSERT(OFFSETOF__Thread__m_pDomain
+ == offsetof(Thread, m_pDomain));
+
+#define OFFSETOF__Thread__m_dwLockCount 0x28
+ASMCONSTANTS_C_ASSERT(OFFSETOF__Thread__m_dwLockCount
+ == offsetof(Thread, m_dwLockCount));
+
+#define OFFSETOF__Thread__m_ThreadId 0x2C
+ASMCONSTANTS_C_ASSERT(OFFSETOF__Thread__m_ThreadId
+ == offsetof(Thread, m_ThreadId));
+
+#define OFFSET__Thread__m_alloc_context__alloc_ptr 0x60
+ASMCONSTANTS_C_ASSERT(OFFSET__Thread__m_alloc_context__alloc_ptr == offsetof(Thread, m_alloc_context) + offsetof(alloc_context, alloc_ptr));
+
+#define OFFSET__Thread__m_alloc_context__alloc_limit 0x68
+ASMCONSTANTS_C_ASSERT(OFFSET__Thread__m_alloc_context__alloc_limit == offsetof(Thread, m_alloc_context) + offsetof(alloc_context, alloc_limit));
+
+#define OFFSETOF__ThreadExceptionState__m_pCurrentTracker 0x000
+ASMCONSTANTS_C_ASSERT(OFFSETOF__ThreadExceptionState__m_pCurrentTracker
+ == offsetof(ThreadExceptionState, m_pCurrentTracker));
+
+#define THREAD_CATCHATSAFEPOINT_BITS 0x5F
+ASMCONSTANTS_C_ASSERT(THREAD_CATCHATSAFEPOINT_BITS == Thread::TS_CatchAtSafePoint);
+#endif // CROSSGEN_COMPILE
+
+
+#ifdef FEATURE_REMOTING
+#define TransparentProxyObject___stubData 0x10
+ASMCONSTANTS_C_ASSERT(TransparentProxyObject___stubData == offsetof(TransparentProxyObject, _stubData))
+
+#define TransparentProxyObject___stub 0x28
+ASMCONSTANTS_C_ASSERT(TransparentProxyObject___stub == offsetof(TransparentProxyObject, _stub))
+
+#define TransparentProxyObject___pMT 0x18
+ASMCONSTANTS_C_ASSERT(TransparentProxyObject___pMT == offsetof(TransparentProxyObject, _pMT))
+#endif // FEATURE_REMOTING
+
+#define OFFSETOF__NDirectMethodDesc__m_pWriteableData DBG_FRE(0x48, 0x20)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__NDirectMethodDesc__m_pWriteableData == offsetof(NDirectMethodDesc, ndirect.m_pWriteableData));
+
+#define OFFSETOF__ObjHeader__SyncBlkIndex 0x4
+ASMCONSTANTS_C_ASSERT(OFFSETOF__ObjHeader__SyncBlkIndex
+ == (sizeof(ObjHeader) - offsetof(ObjHeader, m_SyncBlockValue)));
+
+#define SIZEOF__SyncTableEntry 0x10
+ASMCONSTANT_SIZEOF_ASSERT(SyncTableEntry);
+
+#define OFFSETOF__SyncTableEntry__m_SyncBlock 0x0
+ASMCONSTANT_OFFSETOF_ASSERT(SyncTableEntry, m_SyncBlock);
+
+#define OFFSETOF__SyncBlock__m_Monitor 0x0
+ASMCONSTANT_OFFSETOF_ASSERT(SyncBlock, m_Monitor);
+
+#define OFFSETOF__DelegateObject___methodPtr 0x18
+ASMCONSTANT_OFFSETOF_ASSERT(DelegateObject, _methodPtr);
+
+#define OFFSETOF__DelegateObject___target 0x08
+ASMCONSTANT_OFFSETOF_ASSERT(DelegateObject, _target);
+
+#define OFFSETOF__AwareLock__m_MonitorHeld 0x0
+ASMCONSTANTS_C_ASSERT(OFFSETOF__AwareLock__m_MonitorHeld
+ == offsetof(AwareLock, m_MonitorHeld));
+
+#define OFFSETOF__AwareLock__m_Recursion 0x4
+ASMCONSTANTS_C_ASSERT(OFFSETOF__AwareLock__m_Recursion
+ == offsetof(AwareLock, m_Recursion));
+
+#define OFFSETOF__AwareLock__m_HoldingThread 0x8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__AwareLock__m_HoldingThread
+ == offsetof(AwareLock, m_HoldingThread));
+
+#define OFFSETOF__g_SystemInfo__dwNumberOfProcessors 0x20
+ASMCONSTANTS_C_ASSERT(OFFSETOF__g_SystemInfo__dwNumberOfProcessors
+ == offsetof(SYSTEM_INFO, dwNumberOfProcessors));
+
+#define OFFSETOF__g_SpinConstants__dwInitialDuration 0x0
+ASMCONSTANTS_C_ASSERT(OFFSETOF__g_SpinConstants__dwInitialDuration
+ == offsetof(SpinConstants, dwInitialDuration));
+
+#define OFFSETOF__g_SpinConstants__dwMaximumDuration 0x4
+ASMCONSTANTS_C_ASSERT(OFFSETOF__g_SpinConstants__dwMaximumDuration
+ == offsetof(SpinConstants, dwMaximumDuration));
+
+#define OFFSETOF__g_SpinConstants__dwBackoffFactor 0x8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__g_SpinConstants__dwBackoffFactor
+ == offsetof(SpinConstants, dwBackoffFactor));
+
+#define OFFSETOF__MethodTable__m_dwFlags 0x00
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MethodTable__m_dwFlags
+ == offsetof(MethodTable, m_dwFlags));
+
+#define OFFSET__MethodTable__m_BaseSize 0x04
+ASMCONSTANTS_C_ASSERT(OFFSET__MethodTable__m_BaseSize
+ == offsetof(MethodTable, m_BaseSize));
+
+#define OFFSETOF__MethodTable__m_wNumInterfaces 0x0E
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MethodTable__m_wNumInterfaces
+ == offsetof(MethodTable, m_wNumInterfaces));
+
+#define OFFSETOF__MethodTable__m_pParentMethodTable DBG_FRE(0x18, 0x10)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MethodTable__m_pParentMethodTable
+ == offsetof(MethodTable, m_pParentMethodTable));
+
+#define OFFSETOF__MethodTable__m_pWriteableData DBG_FRE(0x28, 0x20)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MethodTable__m_pWriteableData
+ == offsetof(MethodTable, m_pWriteableData));
+
+#define OFFSETOF__MethodTable__m_pEEClass DBG_FRE(0x30, 0x28)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MethodTable__m_pEEClass
+ == offsetof(MethodTable, m_pEEClass));
+
+#define METHODTABLE_OFFSET_VTABLE DBG_FRE(0x48, 0x40)
+ASMCONSTANTS_C_ASSERT(METHODTABLE_OFFSET_VTABLE == sizeof(MethodTable));
+
+#define OFFSETOF__MethodTable__m_ElementType DBG_FRE(0x38, 0x30)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MethodTable__m_ElementType
+ == offsetof(MethodTable, m_pMultipurposeSlot1));
+
+#define OFFSETOF__MethodTable__m_pInterfaceMap DBG_FRE(0x40, 0x38)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MethodTable__m_pInterfaceMap
+ == offsetof(MethodTable, m_pMultipurposeSlot2));
+
+
+#define MethodTable_VtableSlotsPerChunk 8
+ASMCONSTANTS_C_ASSERT(MethodTable_VtableSlotsPerChunk == VTABLE_SLOTS_PER_CHUNK)
+
+#define MethodTable_VtableSlotsPerChunkLog2 3
+ASMCONSTANTS_C_ASSERT(MethodTable_VtableSlotsPerChunkLog2 == VTABLE_SLOTS_PER_CHUNK_LOG2)
+
+#if defined(FEATURE_TYPEEQUIVALENCE) || defined(FEATURE_REMOTING)
+#define METHODTABLE_EQUIVALENCE_FLAGS 0x02000000
+ASMCONSTANTS_C_ASSERT(METHODTABLE_EQUIVALENCE_FLAGS
+ == MethodTable::enum_flag_HasTypeEquivalence);
+#else
+#define METHODTABLE_EQUIVALENCE_FLAGS 0x0
+#endif
+
+#define METHODTABLE_NONTRIVIALINTERFACECAST_FLAGS (0x00080000 + 0x40000000 + 0x00400000)
+ASMCONSTANTS_C_ASSERT(METHODTABLE_NONTRIVIALINTERFACECAST_FLAGS
+ == MethodTable::enum_flag_NonTrivialInterfaceCast);
+
+#define MethodTable__enum_flag_ContainsPointers 0x01000000
+ASMCONSTANTS_C_ASSERT(MethodTable__enum_flag_ContainsPointers
+ == MethodTable::enum_flag_ContainsPointers);
+
+#define OFFSETOF__MethodTableWriteableData__m_dwFlags 0
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MethodTableWriteableData__m_dwFlags
+ == offsetof(MethodTableWriteableData, m_dwFlags));
+
+#define MethodTableWriteableData__enum_flag_Unrestored 0x04
+ASMCONSTANTS_C_ASSERT(MethodTableWriteableData__enum_flag_Unrestored
+ == MethodTableWriteableData::enum_flag_Unrestored);
+
+#define OFFSETOF__InterfaceInfo_t__m_pMethodTable 0
+ASMCONSTANTS_C_ASSERT(OFFSETOF__InterfaceInfo_t__m_pMethodTable
+ == offsetof(InterfaceInfo_t, m_pMethodTable));
+
+#define SIZEOF__InterfaceInfo_t 0x8
+ASMCONSTANTS_C_ASSERT(SIZEOF__InterfaceInfo_t
+ == sizeof(InterfaceInfo_t));
+
+#define OFFSETOF__AppDomain__m_dwId 0x8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__AppDomain__m_dwId
+ == offsetof(AppDomain, m_dwId));
+
+#define OFFSETOF__AppDomain__m_sDomainLocalBlock DBG_FRE(0x10, 0x10)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__AppDomain__m_sDomainLocalBlock
+ == offsetof(AppDomain, m_sDomainLocalBlock));
+
+#define OFFSETOF__DomainLocalBlock__m_pModuleSlots 0x8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__DomainLocalBlock__m_pModuleSlots
+ == offsetof(DomainLocalBlock, m_pModuleSlots));
+
+#define OFFSETOF__DomainLocalModule__m_pDataBlob 0x030
+ASMCONSTANTS_C_ASSERT(OFFSETOF__DomainLocalModule__m_pDataBlob
+ == offsetof(DomainLocalModule, m_pDataBlob));
+
+// If this changes then we can't just test one bit in the assembly code.
+ASMCONSTANTS_C_ASSERT(ClassInitFlags::INITIALIZED_FLAG == 1);
+
+// End for JIT_GetSharedNonGCStaticBaseWorker
+
+// For JIT_GetSharedGCStaticBaseWorker
+
+#define OFFSETOF__DomainLocalModule__m_pGCStatics 0x020
+ASMCONSTANTS_C_ASSERT(OFFSETOF__DomainLocalModule__m_pGCStatics
+ == offsetof(DomainLocalModule, m_pGCStatics));
+
+// End for JIT_GetSharedGCStaticBaseWorker
+
+#define CORINFO_NullReferenceException_ASM 0
+ASMCONSTANTS_C_ASSERT( CORINFO_NullReferenceException_ASM
+ == CORINFO_NullReferenceException);
+
+#define CORINFO_InvalidCastException_ASM 2
+ASMCONSTANTS_C_ASSERT( CORINFO_InvalidCastException_ASM
+ == CORINFO_InvalidCastException);
+
+#define CORINFO_IndexOutOfRangeException_ASM 3
+ASMCONSTANTS_C_ASSERT( CORINFO_IndexOutOfRangeException_ASM
+ == CORINFO_IndexOutOfRangeException);
+
+#define CORINFO_SynchronizationLockException_ASM 5
+ASMCONSTANTS_C_ASSERT( CORINFO_SynchronizationLockException_ASM
+ == CORINFO_SynchronizationLockException);
+
+#define CORINFO_ArrayTypeMismatchException_ASM 6
+ASMCONSTANTS_C_ASSERT( CORINFO_ArrayTypeMismatchException_ASM
+ == CORINFO_ArrayTypeMismatchException);
+
+#define CORINFO_ArgumentNullException_ASM 8
+ASMCONSTANTS_C_ASSERT( CORINFO_ArgumentNullException_ASM
+ == CORINFO_ArgumentNullException);
+
+#define CORINFO_ArgumentException_ASM 9
+ASMCONSTANTS_C_ASSERT( CORINFO_ArgumentException_ASM
+ == CORINFO_ArgumentException);
+
+
+// MachState offsets (AMD64\gmscpu.h)
+
+#define OFFSETOF__MachState__m_Rip 0x00
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MachState__m_Rip
+ == offsetof(MachState, m_Rip));
+
+#define OFFSETOF__MachState__m_Rsp 0x08
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MachState__m_Rsp
+ == offsetof(MachState, m_Rsp));
+
+#define OFFSETOF__MachState__m_Capture 0x10
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MachState__m_Capture
+ == offsetof(MachState, m_Capture));
+
+#ifdef UNIX_AMD64_ABI
+#define OFFSETOF__MachState__m_Ptrs 0x40
+#define OFFSETOF__MachState___pRetAddr 0x70
+#define OFFSETOF__LazyMachState__m_CaptureRip 0xA8
+#define OFFSETOF__LazyMachState__m_CaptureRsp 0xB0
+#else
+#define OFFSETOF__MachState__m_Ptrs 0x50
+#define OFFSETOF__MachState___pRetAddr 0x90
+#define OFFSETOF__LazyMachState__m_CaptureRip 0x98
+#define OFFSETOF__LazyMachState__m_CaptureRsp 0xA0
+#endif
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MachState__m_Ptrs
+ == offsetof(MachState, m_Ptrs));
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MachState___pRetAddr
+ == offsetof(MachState, _pRetAddr));
+ASMCONSTANTS_C_ASSERT(OFFSETOF__LazyMachState__m_CaptureRip
+ == offsetof(LazyMachState, m_CaptureRip));
+ASMCONSTANTS_C_ASSERT(OFFSETOF__LazyMachState__m_CaptureRsp
+ == offsetof(LazyMachState, m_CaptureRsp));
+
+#define OFFSETOF__MethodDesc__m_wFlags DBG_FRE(0x2E, 0x06)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__MethodDesc__m_wFlags == offsetof(MethodDesc, m_wFlags));
+
+#define OFFSETOF__VASigCookie__pNDirectILStub 0x8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__VASigCookie__pNDirectILStub
+ == offsetof(VASigCookie, pNDirectILStub));
+
+#define SIZEOF__CONTEXT (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + /*XMM_SAVE_AREA32*/(2*2 + 1*2 + 2 + 4 + 2*2 + 4 + 2*2 + 4*2 + 16*8 + 16*16 + 1*96) + 26*16 + 8 + 8*5)
+ASMCONSTANTS_C_ASSERT(SIZEOF__CONTEXT
+ == sizeof(CONTEXT));
+
+#define OFFSETOF__CONTEXT__Rax (8*6 + 4*2 + 2*6 + 4 + 8*6)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Rax
+ == offsetof(CONTEXT, Rax));
+
+#define OFFSETOF__CONTEXT__Rcx (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Rcx
+ == offsetof(CONTEXT, Rcx));
+
+#define OFFSETOF__CONTEXT__Rdx (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*2)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Rdx
+ == offsetof(CONTEXT, Rdx));
+
+#define OFFSETOF__CONTEXT__Rbx (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*3)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Rbx
+ == offsetof(CONTEXT, Rbx));
+
+#define OFFSETOF__CONTEXT__Rsp (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*4)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Rsp
+ == offsetof(CONTEXT, Rsp));
+
+#define OFFSETOF__CONTEXT__Rbp (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*5)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Rbp
+ == offsetof(CONTEXT, Rbp));
+
+#define OFFSETOF__CONTEXT__Rsi (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*6)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Rsi
+ == offsetof(CONTEXT, Rsi));
+
+#define OFFSETOF__CONTEXT__Rdi (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*7)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Rdi
+ == offsetof(CONTEXT, Rdi));
+
+#define OFFSETOF__CONTEXT__R8 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*8)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__R8
+ == offsetof(CONTEXT, R8));
+
+#define OFFSETOF__CONTEXT__R9 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*9)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__R9
+ == offsetof(CONTEXT, R9));
+
+#define OFFSETOF__CONTEXT__R10 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*10)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__R10
+ == offsetof(CONTEXT, R10));
+
+#define OFFSETOF__CONTEXT__R11 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*11)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__R11
+ == offsetof(CONTEXT, R11));
+
+#define OFFSETOF__CONTEXT__R12 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*12)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__R12
+ == offsetof(CONTEXT, R12));
+
+#define OFFSETOF__CONTEXT__R13 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*13)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__R13
+ == offsetof(CONTEXT, R13));
+
+#define OFFSETOF__CONTEXT__R14 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*14)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__R14
+ == offsetof(CONTEXT, R14));
+
+#define OFFSETOF__CONTEXT__R15 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*15)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__R15
+ == offsetof(CONTEXT, R15));
+
+#define OFFSETOF__CONTEXT__Rip (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Rip
+ == offsetof(CONTEXT, Rip));
+
+#define OFFSETOF__CONTEXT__Xmm0 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm0
+ == offsetof(CONTEXT, Xmm0));
+
+#define OFFSETOF__CONTEXT__Xmm1 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm1
+ == offsetof(CONTEXT, Xmm1));
+
+#define OFFSETOF__CONTEXT__Xmm2 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*2)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm2
+ == offsetof(CONTEXT, Xmm2));
+
+#define OFFSETOF__CONTEXT__Xmm3 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*3)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm3
+ == offsetof(CONTEXT, Xmm3));
+
+#define OFFSETOF__CONTEXT__Xmm4 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*4)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm4
+ == offsetof(CONTEXT, Xmm4));
+
+#define OFFSETOF__CONTEXT__Xmm5 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*5)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm5
+ == offsetof(CONTEXT, Xmm5));
+
+#define OFFSETOF__CONTEXT__Xmm6 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*6)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm6
+ == offsetof(CONTEXT, Xmm6));
+
+#define OFFSETOF__CONTEXT__Xmm7 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*7)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm7
+ == offsetof(CONTEXT, Xmm7));
+
+#define OFFSETOF__CONTEXT__Xmm8 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*8)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm8
+ == offsetof(CONTEXT, Xmm8));
+
+#define OFFSETOF__CONTEXT__Xmm9 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*9)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm9
+ == offsetof(CONTEXT, Xmm9));
+
+#define OFFSETOF__CONTEXT__Xmm10 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*10)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm10
+ == offsetof(CONTEXT, Xmm10));
+
+#define OFFSETOF__CONTEXT__Xmm11 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*11)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm11
+ == offsetof(CONTEXT, Xmm11));
+
+#define OFFSETOF__CONTEXT__Xmm12 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*12)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm12
+ == offsetof(CONTEXT, Xmm12));
+
+#define OFFSETOF__CONTEXT__Xmm13 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*13)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm13
+ == offsetof(CONTEXT, Xmm13));
+
+#define OFFSETOF__CONTEXT__Xmm14 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*14)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm14
+ == offsetof(CONTEXT, Xmm14));
+
+#define OFFSETOF__CONTEXT__Xmm15 (8*6 + 4*2 + 2*6 + 4 + 8*6 + 8*16 + 8 + 2*16 + 8*16 + 16*15)
+ASMCONSTANTS_C_ASSERT(OFFSETOF__CONTEXT__Xmm15
+ == offsetof(CONTEXT, Xmm15));
+
+#define SIZEOF__FaultingExceptionFrame (0x20 + SIZEOF__CONTEXT)
+ASMCONSTANTS_C_ASSERT(SIZEOF__FaultingExceptionFrame
+ == sizeof(FaultingExceptionFrame));
+
+#define OFFSETOF__FaultingExceptionFrame__m_fFilterExecuted 0x10
+ASMCONSTANTS_C_ASSERT(OFFSETOF__FaultingExceptionFrame__m_fFilterExecuted
+ == offsetof(FaultingExceptionFrame, m_fFilterExecuted));
+
+#define OFFSETOF__PtrArray__m_NumComponents 0x8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__PtrArray__m_NumComponents
+ == offsetof(PtrArray, m_NumComponents));
+
+#define OFFSETOF__PtrArray__m_Array 0x10
+ASMCONSTANTS_C_ASSERT(OFFSETOF__PtrArray__m_Array
+ == offsetof(PtrArray, m_Array));
+
+
+#define MethodDescClassification__mdcClassification 0x7
+ASMCONSTANTS_C_ASSERT(MethodDescClassification__mdcClassification == mdcClassification);
+
+#define MethodDescClassification__mcInstantiated 0x5
+ASMCONSTANTS_C_ASSERT(MethodDescClassification__mcInstantiated == mcInstantiated);
+
+#ifndef FEATURE_PAL
+
+#define OFFSET__TEB__TlsSlots 0x1480
+ASMCONSTANTS_C_ASSERT(OFFSET__TEB__TlsSlots == offsetof(TEB, TlsSlots));
+
+#define OFFSETOF__TEB__LastErrorValue 0x68
+ASMCONSTANTS_C_ASSERT(OFFSETOF__TEB__LastErrorValue == offsetof(TEB, LastErrorValue));
+
+#endif // !FEATURE_PAL
+
+#ifdef _DEBUG
+#define TLS_GETTER_MAX_SIZE_ASM 0x30
+#else
+#define TLS_GETTER_MAX_SIZE_ASM 0x18
+#endif
+ASMCONSTANTS_C_ASSERT(TLS_GETTER_MAX_SIZE_ASM == TLS_GETTER_MAX_SIZE)
+
+
+// If you change these constants, you need to update code in
+// RedirectHandledJITCase.asm and ExcepAMD64.cpp.
+#define REDIRECTSTUB_ESTABLISHER_OFFSET_RBP 0
+#define REDIRECTSTUB_RBP_OFFSET_CONTEXT 0x20
+
+#define THROWSTUB_ESTABLISHER_OFFSET_FaultingExceptionFrame 0x30
+
+#define UMTHUNKSTUB_HOST_NOTIFY_FLAG_RBPOFFSET (0x40) // xmm save size
+
+#define Thread__ObjectRefFlush ?ObjectRefFlush@Thread@@SAXPEAV1@@Z
+
+
+#define DELEGATE_FIELD_OFFSET__METHOD_AUX 0x20
+ASMCONSTANTS_RUNTIME_ASSERT(DELEGATE_FIELD_OFFSET__METHOD_AUX == Object::GetOffsetOfFirstField() +
+ MscorlibBinder::GetFieldOffset(FIELD__DELEGATE__METHOD_PTR_AUX));
+
+
+#define ASM_LARGE_OBJECT_SIZE 85000
+ASMCONSTANTS_C_ASSERT(ASM_LARGE_OBJECT_SIZE == LARGE_OBJECT_SIZE);
+
+#define OFFSETOF__ArrayBase__m_NumComponents 8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__ArrayBase__m_NumComponents
+ == offsetof(ArrayBase, m_NumComponents));
+
+#define OFFSETOF__StringObject__m_StringLength 0x8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__StringObject__m_StringLength
+ == offsetof(StringObject, m_StringLength));
+
+#define OFFSETOF__ArrayTypeDesc__m_TemplateMT 8
+ASMCONSTANTS_C_ASSERT(OFFSETOF__ArrayTypeDesc__m_TemplateMT
+ == offsetof(ArrayTypeDesc, m_TemplateMT));
+
+#define OFFSETOF__ArrayTypeDesc__m_Arg 0x10
+ASMCONSTANTS_C_ASSERT(OFFSETOF__ArrayTypeDesc__m_Arg
+ == offsetof(ArrayTypeDesc, m_Arg));
+
+#define SYNCBLOCKINDEX_OFFSET 0x4
+ASMCONSTANTS_C_ASSERT(SYNCBLOCKINDEX_OFFSET
+ == (sizeof(ObjHeader) - offsetof(ObjHeader, m_SyncBlockValue)));
+
+#define CallDescrData__pSrc 0x00
+#define CallDescrData__numStackSlots 0x08
+#ifdef UNIX_AMD64_ABI
+#define CallDescrData__pArgumentRegisters 0x10
+#define CallDescrData__pFloatArgumentRegisters 0x18
+#define CallDescrData__fpReturnSize 0x20
+#define CallDescrData__pTarget 0x28
+#define CallDescrData__returnValue 0x30
+#else
+#define CallDescrData__dwRegTypeMap 0x10
+#define CallDescrData__fpReturnSize 0x18
+#define CallDescrData__pTarget 0x20
+#define CallDescrData__returnValue 0x28
+#endif
+
+ASMCONSTANTS_C_ASSERT(CallDescrData__pSrc == offsetof(CallDescrData, pSrc))
+ASMCONSTANTS_C_ASSERT(CallDescrData__numStackSlots == offsetof(CallDescrData, numStackSlots))
+#ifdef UNIX_AMD64_ABI
+ASMCONSTANTS_C_ASSERT(CallDescrData__pArgumentRegisters == offsetof(CallDescrData, pArgumentRegisters))
+ASMCONSTANTS_C_ASSERT(CallDescrData__pFloatArgumentRegisters == offsetof(CallDescrData, pFloatArgumentRegisters))
+#else
+ASMCONSTANTS_C_ASSERT(CallDescrData__dwRegTypeMap == offsetof(CallDescrData, dwRegTypeMap))
+#endif
+ASMCONSTANTS_C_ASSERT(CallDescrData__fpReturnSize == offsetof(CallDescrData, fpReturnSize))
+ASMCONSTANTS_C_ASSERT(CallDescrData__pTarget == offsetof(CallDescrData, pTarget))
+ASMCONSTANTS_C_ASSERT(CallDescrData__returnValue == offsetof(CallDescrData, returnValue))
+
+#ifdef UNIX_AMD64_ABI
+#define OFFSETOF__TransitionBlock__m_argumentRegisters 0x00
+ASMCONSTANTS_C_ASSERT(OFFSETOF__TransitionBlock__m_argumentRegisters == offsetof(TransitionBlock, m_argumentRegisters))
+#endif // UNIX_AMD64_ABI
+
+#undef ASMCONSTANTS_RUNTIME_ASSERT
+#undef ASMCONSTANTS_C_ASSERT
+#ifndef UNIX_AMD64_ABI
+#undef DBG_FRE
+#endif // UNIX_AMD64_ABI
+
+
+//#define USE_COMPILE_TIME_CONSTANT_FINDER // Uncomment this line to use the constant finder
+#if defined(__cplusplus) && defined(USE_COMPILE_TIME_CONSTANT_FINDER)
+// This class causes the compiler to emit an error with the constant we're interested in
+// in the error message. This is useful if a size or offset changes. To use, comment out
+// the compile-time assert that is firing, enable the constant finder, add the appropriate
+// constant to find to BogusFunction(), and build.
+//
+// Here's a sample compiler error:
+// d:\dd\clr\src\ndp\clr\src\vm\i386\asmconstants.h(326) : error C2248: 'FindCompileTimeConstant<N>::FindCompileTimeConstant' : cannot access private member declared in class 'FindCompileTimeConstant<N>'
+// with
+// [
+// N=1520
+// ]
+// d:\dd\clr\src\ndp\clr\src\vm\i386\asmconstants.h(321) : see declaration of 'FindCompileTimeConstant<N>::FindCompileTimeConstant'
+// with
+// [
+// N=1520
+// ]
+template<size_t N>
+class FindCompileTimeConstant
+{
+private:
+ FindCompileTimeConstant();
+};
+
+void BogusFunction()
+{
+ // Sample usage to generate the error
+ FindCompileTimeConstant<offsetof(Thread, m_pDomain)> bogus_variable;
+ FindCompileTimeConstant<offsetof(Thread, m_ExceptionState)> bogus_variable2;
+}
+#endif // defined(__cplusplus) && defined(USE_COMPILE_TIME_CONSTANT_FINDER)