summaryrefslogtreecommitdiff
path: root/src/inc/gcinfotypes.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/inc/gcinfotypes.h')
-rw-r--r--src/inc/gcinfotypes.h373
1 files changed, 373 insertions, 0 deletions
diff --git a/src/inc/gcinfotypes.h b/src/inc/gcinfotypes.h
new file mode 100644
index 0000000000..7852f8687f
--- /dev/null
+++ b/src/inc/gcinfotypes.h
@@ -0,0 +1,373 @@
+//
+// Copyright (c) Microsoft. All rights reserved.
+// Licensed under the MIT license. See LICENSE file in the project root for full license information.
+//
+
+
+#ifndef __GCINFOTYPES_H__
+#define __GCINFOTYPES_H__
+
+// This file is included when building an "alt jit". In that case, we are doing a cross-compile:
+// we may be building the ARM jit on x86, for example. We generally make that work by conditionalizing on
+// a _TARGET_XXX_ variable that we explicitly set in the build, rather than the _XXX_ variable implicitly
+// set by the compiler. But this file is *also* included by the runtime, and needs in that case to be
+// conditionalized by the actual platform we're compiling for. We solve this by:
+// 1) conditionalizing on _TARGET_XXX_ in this file,
+// 2) having a _TARGET_SET_ variable so we know whether we're in a compilation for JIT in which some
+// _TARGET_XXX_ has already been set, and
+// 3) if _TARGET_SET_ is not set, set the _TARGET_XXX_ variable appropriate for the current _XXX_.
+//
+#ifndef _TARGET_SET_
+
+//#ifdef _X86_
+//#define _TARGET_X86_
+//#endif
+
+//#ifdef _AMD64_
+//#define _TARGET_AMD64_
+//#endif
+
+//#ifdef _ARM_
+//#define _TARGET_ARM_
+//#endif
+
+#endif // _TARGET_SET_
+
+#if defined(_TARGET_AMD64_) || defined(_TARGET_ARM_) || defined(_TARGET_ARM64_)
+#define PARTIALLY_INTERRUPTIBLE_GC_SUPPORTED
+#endif
+
+#ifdef PARTIALLY_INTERRUPTIBLE_GC_SUPPORTED
+//
+// The EH vector mechanism is not completely worked out,
+// so it's temporarily disabled. We rely on fully-interruptible instead.
+//
+#define DISABLE_EH_VECTORS
+#endif
+
+
+#if defined(_TARGET_AMD64_) || defined(_TARGET_ARM_) || defined(_TARGET_ARM64_)
+#define FIXED_STACK_PARAMETER_SCRATCH_AREA
+#endif
+
+#define BITS_PER_SIZE_T ((int)sizeof(size_t)*8)
+
+
+//--------------------------------------------------------------------------------
+// It turns out, that ((size_t)x) << y == x, when y is not a literal
+// and its value is BITS_PER_SIZE_T
+// I guess the processor only shifts of the right operand modulo BITS_PER_SIZE_T
+// In many cases, we want the above operation to yield 0,
+// hence the following macros
+//--------------------------------------------------------------------------------
+__forceinline size_t SAFE_SHIFT_LEFT(size_t x, size_t count)
+{
+ LIMITED_METHOD_DAC_CONTRACT;
+ _ASSERTE(count <= BITS_PER_SIZE_T);
+ return (x << 1) << (count-1);
+}
+__forceinline size_t SAFE_SHIFT_RIGHT(size_t x, size_t count)
+{
+ _ASSERTE(count <= BITS_PER_SIZE_T);
+ return (x >> 1) >> (count-1);
+}
+
+inline UINT32 CeilOfLog2(size_t x)
+{
+ _ASSERTE(x > 0);
+ UINT32 result = (x & (x-1)) ? 1 : 0;
+ while(x != 1)
+ {
+ result++;
+ x >>= 1;
+ }
+ return result;
+}
+
+enum GcSlotFlags
+{
+ GC_SLOT_BASE = 0x0,
+ GC_SLOT_INTERIOR = 0x1,
+ GC_SLOT_PINNED = 0x2,
+ GC_SLOT_UNTRACKED = 0x4,
+
+ // For internal use by the encoder/decoder
+ GC_SLOT_IS_REGISTER = 0x8,
+ GC_SLOT_IS_DELETED = 0x10,
+};
+
+enum GcStackSlotBase
+{
+ GC_CALLER_SP_REL = 0x0,
+ GC_SP_REL = 0x1,
+ GC_FRAMEREG_REL = 0x2,
+
+ GC_SPBASE_FIRST = GC_CALLER_SP_REL,
+ GC_SPBASE_LAST = GC_FRAMEREG_REL,
+};
+
+#ifdef _DEBUG
+const char* const GcStackSlotBaseNames[] =
+{
+ "caller.sp",
+ "sp",
+ "frame",
+};
+#endif
+
+
+enum GcSlotState
+{
+ GC_SLOT_DEAD = 0x0,
+ GC_SLOT_LIVE = 0x1,
+};
+
+struct GcStackSlot
+{
+ INT32 SpOffset;
+ GcStackSlotBase Base;
+
+ bool operator==(const GcStackSlot& other)
+ {
+ return ((SpOffset == other.SpOffset) && (Base == other.Base));
+ }
+ bool operator!=(const GcStackSlot& other)
+ {
+ return ((SpOffset != other.SpOffset) || (Base != other.Base));
+ }
+};
+
+// Stack offsets must be 8-byte aligned, so we use this unaligned
+// offset to represent that the method doesn't have a security object
+#define NO_SECURITY_OBJECT (-1)
+#define NO_GS_COOKIE (-1)
+#define NO_STACK_BASE_REGISTER (0xffffffff)
+#define NO_SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA (0xffffffff)
+#define NO_GENERICS_INST_CONTEXT (-1)
+#define NO_PSP_SYM (-1)
+
+
+#if defined(_TARGET_AMD64_)
+
+#ifndef TARGET_POINTER_SIZE
+#define TARGET_POINTER_SIZE 8 // equal to sizeof(void*) and the managed pointer size in bytes for this target
+#endif
+#define NUM_NORM_CODE_OFFSETS_PER_CHUNK (64)
+#define NUM_NORM_CODE_OFFSETS_PER_CHUNK_LOG2 (6)
+#define NORMALIZE_STACK_SLOT(x) ((x)>>3)
+#define DENORMALIZE_STACK_SLOT(x) ((x)<<3)
+#define NORMALIZE_CODE_LENGTH(x) (x)
+#define DENORMALIZE_CODE_LENGTH(x) (x)
+// Encode RBP as 0
+#define NORMALIZE_STACK_BASE_REGISTER(x) ((x) ^ 5)
+#define DENORMALIZE_STACK_BASE_REGISTER(x) ((x) ^ 5)
+#define NORMALIZE_SIZE_OF_STACK_AREA(x) ((x)>>3)
+#define DENORMALIZE_SIZE_OF_STACK_AREA(x) ((x)<<3)
+#define CODE_OFFSETS_NEED_NORMALIZATION 0
+#define NORMALIZE_CODE_OFFSET(x) (x)
+#define DENORMALIZE_CODE_OFFSET(x) (x)
+#define NORMALIZE_REGISTER(x) (x)
+#define DENORMALIZE_REGISTER(x) (x)
+#define NORMALIZE_NUM_SAFE_POINTS(x) (x)
+#define DENORMALIZE_NUM_SAFE_POINTS(x) (x)
+#define NORMALIZE_NUM_INTERRUPTIBLE_RANGES(x) (x)
+#define DENORMALIZE_NUM_INTERRUPTIBLE_RANGES(x) (x)
+
+#define PSP_SYM_STACK_SLOT_ENCBASE 6
+#define GENERICS_INST_CONTEXT_STACK_SLOT_ENCBASE 6
+#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 6
+#define GS_COOKIE_STACK_SLOT_ENCBASE 6
+#define CODE_LENGTH_ENCBASE 8
+#define STACK_BASE_REGISTER_ENCBASE 3
+#define SIZE_OF_STACK_AREA_ENCBASE 3
+#define SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE 4
+#define NUM_REGISTERS_ENCBASE 2
+#define NUM_STACK_SLOTS_ENCBASE 2
+#define NUM_UNTRACKED_SLOTS_ENCBASE 1
+#define NORM_PROLOG_SIZE_ENCBASE 5
+#define NORM_EPILOG_SIZE_ENCBASE 3
+#define NORM_CODE_OFFSET_DELTA_ENCBASE 3
+#define INTERRUPTIBLE_RANGE_DELTA1_ENCBASE 6
+#define INTERRUPTIBLE_RANGE_DELTA2_ENCBASE 6
+#define REGISTER_ENCBASE 3
+#define REGISTER_DELTA_ENCBASE 2
+#define STACK_SLOT_ENCBASE 6
+#define STACK_SLOT_DELTA_ENCBASE 4
+#define NUM_SAFE_POINTS_ENCBASE 2
+#define NUM_INTERRUPTIBLE_RANGES_ENCBASE 1
+#define NUM_EH_CLAUSES_ENCBASE 2
+#define POINTER_SIZE_ENCBASE 3
+#define LIVESTATE_RLE_RUN_ENCBASE 2
+#define LIVESTATE_RLE_SKIP_ENCBASE 4
+
+#elif defined(_TARGET_ARM_)
+
+#ifndef TARGET_POINTER_SIZE
+#define TARGET_POINTER_SIZE 4 // equal to sizeof(void*) and the managed pointer size in bytes for this target
+#endif
+#define NUM_NORM_CODE_OFFSETS_PER_CHUNK (64)
+#define NUM_NORM_CODE_OFFSETS_PER_CHUNK_LOG2 (6)
+#define NORMALIZE_STACK_SLOT(x) ((x)>>2)
+#define DENORMALIZE_STACK_SLOT(x) ((x)<<2)
+#define NORMALIZE_CODE_LENGTH(x) ((x)>>1)
+#define DENORMALIZE_CODE_LENGTH(x) ((x)<<1)
+// Encode R11 as zero
+#define NORMALIZE_STACK_BASE_REGISTER(x) ((((x) - 4) & 7) ^ 7)
+#define DENORMALIZE_STACK_BASE_REGISTER(x) (((x) ^ 7) + 4)
+#define NORMALIZE_SIZE_OF_STACK_AREA(x) ((x)>>2)
+#define DENORMALIZE_SIZE_OF_STACK_AREA(x) ((x)<<2)
+#define CODE_OFFSETS_NEED_NORMALIZATION 1
+#define NORMALIZE_CODE_OFFSET(x) ((x)>>1)
+#define DENORMALIZE_CODE_OFFSET(x) ((x)<<1)
+#define NORMALIZE_REGISTER(x) (x)
+#define DENORMALIZE_REGISTER(x) (x)
+#define NORMALIZE_NUM_SAFE_POINTS(x) (x)
+#define DENORMALIZE_NUM_SAFE_POINTS(x) (x)
+#define NORMALIZE_NUM_INTERRUPTIBLE_RANGES(x) (x)
+#define DENORMALIZE_NUM_INTERRUPTIBLE_RANGES(x) (x)
+
+// The choices of these encoding bases only affects space overhead
+// and performance, not semantics/correctness.
+#define PSP_SYM_STACK_SLOT_ENCBASE 5
+#define GENERICS_INST_CONTEXT_STACK_SLOT_ENCBASE 5
+#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 5
+#define GS_COOKIE_STACK_SLOT_ENCBASE 5
+#define CODE_LENGTH_ENCBASE 7
+#define STACK_BASE_REGISTER_ENCBASE 1
+#define SIZE_OF_STACK_AREA_ENCBASE 3
+#define SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE 3
+#define NUM_REGISTERS_ENCBASE 2
+#define NUM_STACK_SLOTS_ENCBASE 3
+#define NUM_UNTRACKED_SLOTS_ENCBASE 3
+#define NORM_PROLOG_SIZE_ENCBASE 5
+#define NORM_EPILOG_SIZE_ENCBASE 3
+#define NORM_CODE_OFFSET_DELTA_ENCBASE 3
+#define INTERRUPTIBLE_RANGE_DELTA1_ENCBASE 4
+#define INTERRUPTIBLE_RANGE_DELTA2_ENCBASE 6
+#define REGISTER_ENCBASE 2
+#define REGISTER_DELTA_ENCBASE 1
+#define STACK_SLOT_ENCBASE 6
+#define STACK_SLOT_DELTA_ENCBASE 4
+#define NUM_SAFE_POINTS_ENCBASE 3
+#define NUM_INTERRUPTIBLE_RANGES_ENCBASE 2
+#define NUM_EH_CLAUSES_ENCBASE 3
+#define POINTER_SIZE_ENCBASE 3
+#define LIVESTATE_RLE_RUN_ENCBASE 2
+#define LIVESTATE_RLE_SKIP_ENCBASE 4
+
+#elif defined(_TARGET_ARM64_)
+
+// ARM64TODO: these were copied from AMD64, and need to be reviewed
+
+#ifndef TARGET_POINTER_SIZE
+#define TARGET_POINTER_SIZE 8 // equal to sizeof(void*) and the managed pointer size in bytes for this target
+#endif
+#define NUM_NORM_CODE_OFFSETS_PER_CHUNK (64)
+#define NUM_NORM_CODE_OFFSETS_PER_CHUNK_LOG2 (6)
+#define NORMALIZE_STACK_SLOT(x) ((x)>>3)
+#define DENORMALIZE_STACK_SLOT(x) ((x)<<3)
+#define NORMALIZE_CODE_LENGTH(x) (x)
+#define DENORMALIZE_CODE_LENGTH(x) (x)
+#define NORMALIZE_STACK_BASE_REGISTER(x) ((x) ^ 5)
+#define DENORMALIZE_STACK_BASE_REGISTER(x) ((x) ^ 5)
+#define NORMALIZE_SIZE_OF_STACK_AREA(x) ((x)>>3)
+#define DENORMALIZE_SIZE_OF_STACK_AREA(x) ((x)<<3)
+#define CODE_OFFSETS_NEED_NORMALIZATION 0
+#define NORMALIZE_CODE_OFFSET(x) (x)
+#define DENORMALIZE_CODE_OFFSET(x) (x)
+#define NORMALIZE_REGISTER(x) (x)
+#define DENORMALIZE_REGISTER(x) (x)
+#define NORMALIZE_NUM_SAFE_POINTS(x) (x)
+#define DENORMALIZE_NUM_SAFE_POINTS(x) (x)
+#define NORMALIZE_NUM_INTERRUPTIBLE_RANGES(x) (x)
+#define DENORMALIZE_NUM_INTERRUPTIBLE_RANGES(x) (x)
+
+#define PSP_SYM_STACK_SLOT_ENCBASE 6
+#define GENERICS_INST_CONTEXT_STACK_SLOT_ENCBASE 6
+#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 6
+#define GS_COOKIE_STACK_SLOT_ENCBASE 6
+#define CODE_LENGTH_ENCBASE 8
+#define STACK_BASE_REGISTER_ENCBASE 3
+#define SIZE_OF_STACK_AREA_ENCBASE 3
+#define SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE 4
+#define NUM_REGISTERS_ENCBASE 2
+#define NUM_STACK_SLOTS_ENCBASE 2
+#define NUM_UNTRACKED_SLOTS_ENCBASE 1
+#define NORM_PROLOG_SIZE_ENCBASE 5
+#define NORM_EPILOG_SIZE_ENCBASE 3
+#define NORM_CODE_OFFSET_DELTA_ENCBASE 3
+#define INTERRUPTIBLE_RANGE_DELTA1_ENCBASE 6
+#define INTERRUPTIBLE_RANGE_DELTA2_ENCBASE 6
+#define REGISTER_ENCBASE 3
+#define REGISTER_DELTA_ENCBASE 2
+#define STACK_SLOT_ENCBASE 6
+#define STACK_SLOT_DELTA_ENCBASE 4
+#define NUM_SAFE_POINTS_ENCBASE 2
+#define NUM_INTERRUPTIBLE_RANGES_ENCBASE 1
+#define NUM_EH_CLAUSES_ENCBASE 2
+#define POINTER_SIZE_ENCBASE 3
+#define LIVESTATE_RLE_RUN_ENCBASE 2
+#define LIVESTATE_RLE_SKIP_ENCBASE 4
+
+#else
+
+#ifndef _TARGET_X86_
+#ifdef PORTABILITY_WARNING
+PORTABILITY_WARNING("Please specialize these definitions for your platform!")
+#endif
+#endif
+
+#ifndef TARGET_POINTER_SIZE
+#define TARGET_POINTER_SIZE 4 // equal to sizeof(void*) and the managed pointer size in bytes for this target
+#endif
+#define NUM_NORM_CODE_OFFSETS_PER_CHUNK (64)
+#define NUM_NORM_CODE_OFFSETS_PER_CHUNK_LOG2 (6)
+#define NORMALIZE_STACK_SLOT(x) (x)
+#define DENORMALIZE_STACK_SLOT(x) (x)
+#define NORMALIZE_CODE_LENGTH(x) (x)
+#define DENORMALIZE_CODE_LENGTH(x) (x)
+#define NORMALIZE_STACK_BASE_REGISTER(x) (x)
+#define DENORMALIZE_STACK_BASE_REGISTER(x) (x)
+#define NORMALIZE_SIZE_OF_STACK_AREA(x) (x)
+#define DENORMALIZE_SIZE_OF_STACK_AREA(x) (x)
+#define CODE_OFFSETS_NEED_NORMALIZATION 0
+#define NORMALIZE_CODE_OFFSET(x) (x)
+#define DENORMALIZE_CODE_OFFSET(x) (x)
+#define NORMALIZE_REGISTER(x) (x)
+#define DENORMALIZE_REGISTER(x) (x)
+#define NORMALIZE_NUM_SAFE_POINTS(x) (x)
+#define DENORMALIZE_NUM_SAFE_POINTS(x) (x)
+#define NORMALIZE_NUM_INTERRUPTIBLE_RANGES(x) (x)
+#define DENORMALIZE_NUM_INTERRUPTIBLE_RANGES(x) (x)
+
+#define PSP_SYM_STACK_SLOT_ENCBASE 6
+#define GENERICS_INST_CONTEXT_STACK_SLOT_ENCBASE 6
+#define SECURITY_OBJECT_STACK_SLOT_ENCBASE 6
+#define GS_COOKIE_STACK_SLOT_ENCBASE 6
+#define CODE_LENGTH_ENCBASE 6
+#define STACK_BASE_REGISTER_ENCBASE 3
+#define SIZE_OF_STACK_AREA_ENCBASE 6
+#define SIZE_OF_EDIT_AND_CONTINUE_PRESERVED_AREA_ENCBASE 3
+#define NUM_REGISTERS_ENCBASE 3
+#define NUM_STACK_SLOTS_ENCBASE 5
+#define NUM_UNTRACKED_SLOTS_ENCBASE 5
+#define NORM_PROLOG_SIZE_ENCBASE 4
+#define NORM_EPILOG_SIZE_ENCBASE 3
+#define NORM_CODE_OFFSET_DELTA_ENCBASE 3
+#define INTERRUPTIBLE_RANGE_DELTA1_ENCBASE 5
+#define INTERRUPTIBLE_RANGE_DELTA2_ENCBASE 5
+#define REGISTER_ENCBASE 3
+#define REGISTER_DELTA_ENCBASE REGISTER_ENCBASE
+#define STACK_SLOT_ENCBASE 6
+#define STACK_SLOT_DELTA_ENCBASE 4
+#define NUM_SAFE_POINTS_ENCBASE 4
+#define NUM_INTERRUPTIBLE_RANGES_ENCBASE 1
+#define NUM_EH_CLAUSES_ENCBASE 2
+#define POINTER_SIZE_ENCBASE 3
+#define LIVESTATE_RLE_RUN_ENCBASE 2
+#define LIVESTATE_RLE_SKIP_ENCBASE 4
+
+#endif
+
+#endif // !__GCINFOTYPES_H__
+