summaryrefslogtreecommitdiff
path: root/src/inc
diff options
context:
space:
mode:
Diffstat (limited to 'src/inc')
-rw-r--r--src/inc/CMakeLists.txt9
-rw-r--r--src/inc/bitposition.h6
-rw-r--r--src/inc/clrconfigvalues.h24
-rw-r--r--src/inc/clrnt.h12
-rw-r--r--src/inc/corcompile.h16
-rw-r--r--src/inc/cordebug.idl135
-rw-r--r--src/inc/corinfo.h28
-rw-r--r--src/inc/corjit.h170
-rw-r--r--src/inc/corprof.idl87
-rw-r--r--src/inc/daccess.h4
-rw-r--r--src/inc/dacprivate.h113
-rw-r--r--src/inc/dacvars.h14
-rw-r--r--src/inc/debugreturn.h12
-rw-r--r--src/inc/eetwain.h54
-rw-r--r--src/inc/eventtrace.h22
-rw-r--r--src/inc/fstring.h3
-rw-r--r--src/inc/gcdecoder.cpp372
-rw-r--r--src/inc/gcdump.h12
-rw-r--r--src/inc/gcinfo.h20
-rw-r--r--src/inc/gcinfodecoder.h91
-rw-r--r--src/inc/gcinfoencoder.h11
-rw-r--r--src/inc/gcinfotypes.h95
-rw-r--r--src/inc/jithelpers.h17
-rw-r--r--src/inc/livedatatarget.h2
-rw-r--r--src/inc/longfilepathwrappers.h8
-rw-r--r--src/inc/shash.inl4
-rw-r--r--src/inc/sortversioning.h12
-rw-r--r--src/inc/stacktrace.h6
-rw-r--r--src/inc/stresslog.h2
-rw-r--r--src/inc/utilcode.h20
-rw-r--r--src/inc/winwrap.h7
-rw-r--r--src/inc/xmlparser_i.cpp (renamed from src/inc/xmlparser_i.c)0
-rw-r--r--src/inc/zapper.h2
33 files changed, 953 insertions, 437 deletions
diff --git a/src/inc/CMakeLists.txt b/src/inc/CMakeLists.txt
index 803ca3bcc7..d38fa40773 100644
--- a/src/inc/CMakeLists.txt
+++ b/src/inc/CMakeLists.txt
@@ -50,23 +50,22 @@ add_compile_options(/TC)
else()
-#The MIDL tool exists for Windows only, so for other systems, we have the prebuilt xxx_i.c files checked in
+#The MIDL tool exists for Windows only, so for other systems, we have the prebuilt xxx_i.cpp files checked in
# The prebuilt files contain extra '!_MIDL_USE_GUIDDEF_' after the #endif, but not in the comment.
# In order to not to have to modify these prebuilt files, we disable the extra tokens warning.
add_compile_options(-Wno-extra-tokens)
-
+add_compile_options(-D_MIDL_USE_GUIDDEF_)
foreach(IDL_SOURCE IN LISTS CORGUIDS_IDL_SOURCES)
get_filename_component(IDLNAME ${IDL_SOURCE} NAME_WE)
- set(C_SOURCE ../pal/prebuilt/idl/${IDLNAME}_i.c)
+ set(C_SOURCE ../pal/prebuilt/idl/${IDLNAME}_i.cpp)
list(APPEND CORGUIDS_SOURCES ${C_SOURCE})
endforeach(IDL_SOURCE)
add_compile_options(-fPIC)
-
endif(WIN32)
-# Compile *_i.c to lib
+# Compile *_i.cpp to lib
_add_library(corguids ${CORGUIDS_SOURCES})
# Binplace the inc files for packaging later.
diff --git a/src/inc/bitposition.h b/src/inc/bitposition.h
index 0f3831fce9..392d9a6632 100644
--- a/src/inc/bitposition.h
+++ b/src/inc/bitposition.h
@@ -25,7 +25,11 @@ inline
unsigned BitPosition(unsigned value)
{
_ASSERTE((value != 0) && ((value & (value-1)) == 0));
-#ifndef _TARGET_AMD64_
+#if defined(_TARGET_ARM_) && defined(__llvm__)
+ // use intrinsic functions for arm32
+ // this is applied for LLVM only but it may work for some compilers
+ DWORD index = __builtin_clz(__builtin_arm_rbit(value));
+#elif !defined(_TARGET_AMD64_)
const unsigned PRIME = 37;
static const char hashTable[PRIME] =
diff --git a/src/inc/clrconfigvalues.h b/src/inc/clrconfigvalues.h
index d6a362e0df..a0183d2b51 100644
--- a/src/inc/clrconfigvalues.h
+++ b/src/inc/clrconfigvalues.h
@@ -477,6 +477,12 @@ RETAIL_CONFIG_DWORD_INFO(EXTERNAL_UseLegacyJit, W("useLegacyJit"), 0, "Set to 1
RETAIL_CONFIG_STRING_INFO_EX(EXTERNAL_DisableNativeImageLoadList, W("DisableNativeImageLoadList"), "Refuse to load native images corresponding to one of the assemblies on this semicolon-delimited list of assembly names.", CLRConfig::REGUTIL_default)
#endif
+#if defined(FEATURE_CORECLR) && defined(_TARGET_X86_)
+RETAIL_CONFIG_DWORD_INFO(EXTERNAL_UseWindowsX86CoreLegacyJit, W("UseWindowsX86CoreLegacyJit"), 0, "Set to 1 to do all JITing with compatjit.dll. Only applicable to Windows x86 .NET Core.")
+#endif
+
+RETAIL_CONFIG_DWORD_INFO(EXTERNAL_RequireLegacyJit, W("RequireLegacyJit"), 0, "Set to 1 to require the use of legacy JIT (via COMPlus_useLegacyJit=1 or COMPlus_UseWindowsX86CoreLegacyJit=1).")
+
CONFIG_STRING_INFO_EX(INTERNAL_JitValNumCSE, W("JitValNumCSE"), "Enables ValNum CSE for the specified methods", CLRConfig::REGUTIL_default)
CONFIG_STRING_INFO_EX(INTERNAL_JitLexicalCSE, W("JitLexicalCSE"), "Enables Lexical CSE for the specified methods", CLRConfig::REGUTIL_default)
CONFIG_DWORD_INFO_EX(INTERNAL_JitNoCSE, W("JitNoCSE"), 0, "", CLRConfig::REGUTIL_default)
@@ -493,7 +499,7 @@ CONFIG_DWORD_INFO_EX(INTERNAL_JitNoStructPromotion, W("JitNoStructPromotion"), 0
CONFIG_DWORD_INFO_EX(INTERNAL_JitNoUnroll, W("JitNoUnroll"), 0, "", CLRConfig::REGUTIL_default)
CONFIG_DWORD_INFO_EX(INTERNAL_JitNoMemoryBarriers, W("JitNoMemoryBarriers"), 0, "If 1, don't generate memory barriers", CLRConfig::REGUTIL_default)
#ifdef FEATURE_ENABLE_NO_RANGE_CHECKS
-RETAIL_CONFIG_DWORD_INFO(PRIVATE_JitNoRangeChks, W("JitNoRngChks"), 0, "If 1, don't generate range checks")
+RETAIL_CONFIG_DWORD_INFO_EX(PRIVATE_JitNoRangeChks, W("JitNoRngChks"), 0, "If 1, don't generate range checks", CLRConfig::REGUTIL_default)
#endif
RETAIL_CONFIG_DWORD_INFO_DIRECT_ACCESS(EXTERNAL_JitOptimizeType, W("JitOptimizeType"), "")
CONFIG_DWORD_INFO_EX(INTERNAL_JitOrder, W("JitOrder"), 0, "", CLRConfig::REGUTIL_default)
@@ -551,7 +557,7 @@ CONFIG_DWORD_INFO_EX(INTERNAL_JitSplitFunctionSize, W("JitSplitFunctionSize"), 0
RETAIL_CONFIG_DWORD_INFO_EX(EXTERNAL_JitRegisterFP, W("JitRegisterFP"), 3, "Control FP enregistration", CLRConfig::REGUTIL_default)
RETAIL_CONFIG_DWORD_INFO(INTERNAL_JitELTHookEnabled, W("JitELTHookEnabled"), 0, "On ARM, setting this will emit Enter/Leave/TailCall callbacks")
CONFIG_DWORD_INFO_EX(INTERNAL_JitComponentUnitTests, W("JitComponentUnitTests"), 0, "Run JIT component unit tests", CLRConfig::REGUTIL_default)
-CONFIG_DWORD_INFO_EX(INTERNAL_JitMemStats, W("JitMemStats"), 0, "Display JIT memory usage statistics", CLRConfig::REGUTIL_default)
+RETAIL_CONFIG_DWORD_INFO_EX(INTERNAL_JitMemStats, W("JitMemStats"), 0, "Display JIT memory usage statistics", CLRConfig::REGUTIL_default)
CONFIG_DWORD_INFO_EX(INTERNAL_JitLoopHoistStats, W("JitLoopHoistStats"), 0, "Display JIT loop hoisting statistics", CLRConfig::REGUTIL_default)
CONFIG_DWORD_INFO_EX(INTERNAL_JitDebugLogLoopCloning, W("JitDebugLogLoopCloning"), 0, "In debug builds log places where loop cloning optimizations are performed on the fast path.", CLRConfig::REGUTIL_default);
CONFIG_DWORD_INFO_EX(INTERNAL_JitVNMapSelLimit, W("JitVNMapSelLimit"), 0, "If non-zero, assert if # of VNF_MapSelect applications considered reaches this", CLRConfig::REGUTIL_default)
@@ -600,11 +606,11 @@ RETAIL_CONFIG_DWORD_INFO(INTERNAL_InterpreterDoLoopMethods, W("InterpreterDoLoop
RETAIL_CONFIG_DWORD_INFO_EX(INTERNAL_InterpreterUseCaching, W("InterpreterUseCaching"), 1, "If non-zero, use the caching mechanism.", CLRConfig::REGUTIL_default)
RETAIL_CONFIG_DWORD_INFO_EX(INTERNAL_InterpreterLooseRules, W("InterpreterLooseRules"), 1, "If non-zero, allow ECMA spec violations required by managed C++.", CLRConfig::REGUTIL_default)
RETAIL_CONFIG_DWORD_INFO(INTERNAL_InterpreterPrintPostMortem, W("InterpreterPrintPostMortem"), 0, "Prints summary information about the execution to the console")
-CONFIG_STRING_INFO_EX(INTERNAL_InterpreterLogFile, W("InterpreterLogFile"), "If non-null, append interpreter logging to this file, else use stdout", CLRConfig::REGUTIL_default)
-CONFIG_DWORD_INFO(INTERNAL_DumpInterpreterStubs, W("DumpInterpreterStubs"), 0, "Prints all interpreter stubs that are created to the console")
-CONFIG_DWORD_INFO(INTERNAL_TraceInterpreterEntries, W("TraceInterpreterEntries"), 0, "Logs entries to interpreted methods to the console")
-CONFIG_DWORD_INFO(INTERNAL_TraceInterpreterIL, W("TraceInterpreterIL"), 0, "Logs individual instructions of interpreted methods to the console")
-CONFIG_DWORD_INFO(INTERNAL_TraceInterpreterOstack, W("TraceInterpreterOstack"), 0, "Logs operand stack after each IL instruction of interpreted methods to the console")
+RETAIL_CONFIG_STRING_INFO_EX(INTERNAL_InterpreterLogFile, W("InterpreterLogFile"), "If non-null, append interpreter logging to this file, else use stdout", CLRConfig::REGUTIL_default)
+RETAIL_CONFIG_DWORD_INFO(INTERNAL_DumpInterpreterStubs, W("DumpInterpreterStubs"), 0, "Prints all interpreter stubs that are created to the console")
+RETAIL_CONFIG_DWORD_INFO(INTERNAL_TraceInterpreterEntries, W("TraceInterpreterEntries"), 0, "Logs entries to interpreted methods to the console")
+RETAIL_CONFIG_DWORD_INFO(INTERNAL_TraceInterpreterIL, W("TraceInterpreterIL"), 0, "Logs individual instructions of interpreted methods to the console")
+RETAIL_CONFIG_DWORD_INFO(INTERNAL_TraceInterpreterOstack, W("TraceInterpreterOstack"), 0, "Logs operand stack after each IL instruction of interpreted methods to the console")
CONFIG_DWORD_INFO(INTERNAL_TraceInterpreterVerbose, W("TraceInterpreterVerbose"), 0, "Logs interpreter progress with detailed messages to the console")
CONFIG_DWORD_INFO(INTERNAL_TraceInterpreterJITTransition, W("TraceInterpreterJITTransition"), 0, "Logs when the interpreter determines a method should be JITted")
#endif
@@ -1122,12 +1128,12 @@ CONFIG_DWORD_INFO_EX(INTERNAL_MscorsnLogging, W("MscorsnLogging"), 0, "Enables s
RETAIL_CONFIG_DWORD_INFO_EX(EXTERNAL_NativeImageRequire, W("NativeImageRequire"), 0, "", CLRConfig::REGUTIL_default)
CONFIG_DWORD_INFO_EX(INTERNAL_NestedEhOom, W("NestedEhOom"), 0, "", CLRConfig::REGUTIL_default)
RETAIL_CONFIG_DWORD_INFO_EX(EXTERNAL_NO_SO_NOT_MAINLINE, W("NO_SO_NOT_MAINLINE"), 0, "", CLRConfig::REGUTIL_default)
-#if defined(CROSSGEN_COMPILE)
+#if defined(CROSSGEN_COMPILE) || defined(FEATURE_CORECLR)
#define INTERNAL_NoGuiOnAssert_Default 1
#else
#define INTERNAL_NoGuiOnAssert_Default 0
#endif
-CONFIG_DWORD_INFO_EX(INTERNAL_NoGuiOnAssert, W("NoGuiOnAssert"), INTERNAL_NoGuiOnAssert_Default, "", CLRConfig::REGUTIL_default)
+RETAIL_CONFIG_DWORD_INFO_EX(INTERNAL_NoGuiOnAssert, W("NoGuiOnAssert"), INTERNAL_NoGuiOnAssert_Default, "", CLRConfig::REGUTIL_default)
RETAIL_CONFIG_DWORD_INFO_EX(EXTERNAL_NoProcedureSplitting, W("NoProcedureSplitting"), 0, "", CLRConfig::REGUTIL_default)
CONFIG_DWORD_INFO_EX(INTERNAL_NoStringInterning, W("NoStringInterning"), 1, "Disallows string interning. I see no value in it anymore.", CLRConfig::REGUTIL_default)
RETAIL_CONFIG_DWORD_INFO_DIRECT_ACCESS(EXTERNAL_NotifyBadAppCfg, W("NotifyBadAppCfg"), "Whether to show a message box for bad application config file.")
diff --git a/src/inc/clrnt.h b/src/inc/clrnt.h
index c15bd48fa8..0e082c79d5 100644
--- a/src/inc/clrnt.h
+++ b/src/inc/clrnt.h
@@ -835,17 +835,17 @@ RtlVirtualUnwind_Unsafe(
// X86
//
-#if defined(_TARGET_X86_)
-
-#pragma warning(push)
-#pragma warning (disable:4035) // disable 4035 (function must return something)
-#define PcTeb 0x18
-#pragma warning(pop)
+#ifdef _TARGET_X86_
+#ifndef FEATURE_PAL
typedef struct _DISPATCHER_CONTEXT {
_EXCEPTION_REGISTRATION_RECORD* RegistrationPointer;
} DISPATCHER_CONTEXT, *PDISPATCHER_CONTEXT;
+#endif // !FEATURE_PAL
+
+#define RUNTIME_FUNCTION__BeginAddress(prf) (prf)->BeginAddress
+
#endif // _TARGET_X86_
#ifdef _TARGET_ARM_
diff --git a/src/inc/corcompile.h b/src/inc/corcompile.h
index 70db9f162b..3b517ae212 100644
--- a/src/inc/corcompile.h
+++ b/src/inc/corcompile.h
@@ -72,6 +72,7 @@ typedef DPTR(struct CORCOMPILE_IMPORT_SECTION)
PTR_CORCOMPILE_IMPORT_SECTION;
#ifdef _TARGET_X86_
+#ifndef FEATURE_PAL
//
// x86 ABI does not define RUNTIME_FUNCTION. Define our own to allow unification between x86 and other platforms.
//
@@ -80,14 +81,15 @@ typedef struct _RUNTIME_FUNCTION {
DWORD UnwindData;
} RUNTIME_FUNCTION, *PRUNTIME_FUNCTION;
+#endif // !FEATURE_PAL
+
typedef DPTR(RUNTIME_FUNCTION) PTR_RUNTIME_FUNCTION;
-#define RUNTIME_FUNCTION__BeginAddress(prf) (prf)->BeginAddress
// Chained unwind info. Used for cold methods.
#define RUNTIME_FUNCTION_INDIRECT 0x80000000
-#endif
+#endif // _TARGET_X86_
// The stride is choosen as maximum value that still gives good page locality of RUNTIME_FUNCTION table touches (only one page of
// RUNTIME_FUNCTION table is going to be touched during most IP2MD lookups).
@@ -1164,7 +1166,7 @@ enum CorCompileILRegion
class ICorCompilePreloader
{
public:
- typedef void (__stdcall *CORCOMPILE_CompileStubCallback)(LPVOID pContext, CORINFO_METHOD_HANDLE hStub, DWORD dwJitFlags);
+ typedef void (__stdcall *CORCOMPILE_CompileStubCallback)(LPVOID pContext, CORINFO_METHOD_HANDLE hStub, CORJIT_FLAGS jitFlags);
//
// Map methods are available after Serialize() is called
@@ -1849,7 +1851,7 @@ class ICorCompileInfo
// Get the compilation flags that are shared between JIT and NGen
virtual HRESULT GetBaseJitFlags(
IN CORINFO_METHOD_HANDLE hMethod,
- OUT DWORD *pFlags) = 0;
+ OUT CORJIT_FLAGS *pFlags) = 0;
// needed for stubs to obtain the number of bytes to copy into the native image
// return the beginning of the stub and the size to copy (in bytes)
@@ -1887,16 +1889,16 @@ class ICorCompileInfo
/*****************************************************************************/
// This function determines the compile flags to use for a generic intatiation
// since only the open instantiation can be verified.
-// See the comment associated with CORJIT_FLG_SKIP_VERIFICATION for details.
+// See the comment associated with CORJIT_FLAG_SKIP_VERIFICATION for details.
//
// On return:
// if *raiseVerificationException=TRUE, the caller should raise a VerificationException.
// if *unverifiableGenericCode=TRUE, the method is a generic instantiation with
// unverifiable code
-CorJitFlag GetCompileFlagsIfGenericInstantiation(
+CORJIT_FLAGS GetCompileFlagsIfGenericInstantiation(
CORINFO_METHOD_HANDLE method,
- CorJitFlag compileFlags,
+ CORJIT_FLAGS compileFlags,
ICorJitInfo * pCorJitInfo,
BOOL * raiseVerificationException,
BOOL * unverifiableGenericCode);
diff --git a/src/inc/cordebug.idl b/src/inc/cordebug.idl
index 49b8acc923..093b893dbc 100644
--- a/src/inc/cordebug.idl
+++ b/src/inc/cordebug.idl
@@ -177,6 +177,7 @@ interface ICorDebugTypeEnum;
interface ICorDebugCodeEnum;
interface ICorDebugFrameEnum;
interface ICorDebugValueEnum;
+interface ICorDebugVariableHomeEnum;
interface ICorDebugAppDomainEnum;
interface ICorDebugAssemblyEnum;
interface ICorDebugBlockingObjectEnum;
@@ -5594,6 +5595,23 @@ interface ICorDebugCode3 : IUnknown
[out, size_is(bufferSize), length_is(*pFetched)] ULONG32 pOffsets[]);
};
+[
+ object,
+ local,
+ uuid(18221fa4-20cb-40fa-b19d-9f91c4fa8c14),
+ pointer_default(unique)
+]
+interface ICorDebugCode4 : IUnknown
+{
+ /*
+ * EnumerateVariableHomes - gives an enum for local variables and arguments
+ * in the function.
+ * This may include multiple ICorDebugVariableHomes for the same slot or
+ * argument index if they have different homes at different points in the
+ * function.
+ */
+ HRESULT EnumerateVariableHomes([out] ICorDebugVariableHomeEnum **ppEnum);
+}
[
object,
@@ -6488,8 +6506,79 @@ interface ICorDebugArrayValue : ICorDebugHeapValue
[out] ICorDebugValue **ppValue);
};
+[
+ object,
+ local,
+ uuid(50847b8d-f43f-41b0-924c-6383a5f2278b),
+ pointer_default(unique)
+]
+interface ICorDebugVariableHome : IUnknown
+{
+ /*
+ * GetCode - gives the ICorDebugCode instance containing this
+ * ICorDebugVariableHome.
+ */
+ HRESULT GetCode([out] ICorDebugCode **ppCode);
+ /*
+ * GetSlotIndex - gives the managed slot-index of a local variable.
+ * The slot-index can be used to retrieve the metadata for this local.
+ * Returns E_FAIL if the variable is a function argument.
+ */
+ HRESULT GetSlotIndex([out] ULONG32 *pSlotIndex);
+
+ /*
+ * GetArgumentIndex - gives the argument index of a function argument.
+ * The argument index can be used to retrieve the metadata for this
+ * argument.
+ * Returns E_FAIL if the variable is a local variable.
+ */
+ HRESULT GetArgumentIndex([out] ULONG32* pArgumentIndex);
-/*
+ /*
+ * GetLiveRange - gives the native range over which this variable is live.
+ * pStartOffset is the logical offset at which the variable is first live.
+ * pEndOffset is the logical offset immediately after that at which the
+ * variable is last live.
+ */
+ HRESULT GetLiveRange([out] ULONG32* pStartOffset,
+ [out] ULONG32 *pEndOffset);
+
+ typedef enum VariableLocationType
+ {
+ VLT_REGISTER, // variable is in a register
+ VLT_REGISTER_RELATIVE, // variable is in a register-relative memory
+ // location
+ VLT_INVALID
+ } VariableLocationType;
+
+ /*
+ * GetLocationType - gives the type of native location. See
+ * VariableLocationType.
+ * Returns VLT_INVALID if the variable is not stored in a register or in a
+ * register-relative memory location.
+ */
+ HRESULT GetLocationType([out] VariableLocationType *pLocationType);
+
+ /*
+ * GetRegister - gives the register containing the variables with location
+ * type VLT_REGISTER, and the base register for variables with location
+ * type VLT_REGISTER_RELATIVE.
+ * Returns E_FAIL if the variable is not in a register or in a
+ * register-relative location.
+ */
+ HRESULT GetRegister([out] CorDebugRegister *pRegister);
+
+ /*
+ * GetOffset - gives the offset from the base register for a variable.
+ * Returns E_FAIL if the variable is not in a register-relative memory
+ * location.
+ */
+ HRESULT GetOffset([out] LONG *pOffset);
+}
+
+
+
+/*
* ICorDebugHandleValue represents a reference value that the debugger has
* explicitly created a GC handle to. It does not represent GC Handles in the debuggee process,
@@ -6802,6 +6891,28 @@ interface ICorDebugValueEnum : ICorDebugEnum
[
object,
local,
+ uuid(e76b7a57-4f7a-4309-85a7-5d918c3deaf7),
+ pointer_default(unique)
+]
+interface ICorDebugVariableHomeEnum : ICorDebugEnum
+{
+ /*
+ * Next - gives the specified number of ICorDebugVariableHome instances from
+ * the enumeration, starting at the current position.
+ * celt is the number of requested instances.
+ * pceltFetched is the number of instances retrieved.
+ * returns S_FALSE if the actual number of instances retrieved is smaller
+ * than the number of instances requested.
+ */
+ HRESULT Next([in] ULONG celt,
+ [out, size_is(celt), length_is(*pceltFetched)]
+ ICorDebugVariableHome *homes[],
+ [out] ULONG *pceltFetched);
+};
+
+[
+ object,
+ local,
uuid(55E96461-9645-45e4-A2FF-0367877ABCDE),
pointer_default(unique)
]
@@ -6951,6 +7062,28 @@ interface ICorDebugType : IUnknown
};
+[
+ object,
+ local,
+ uuid(e6e91d79-693d-48bc-b417-8284b4f10fb5),
+ pointer_default(unique)
+]
+interface ICorDebugType2 : IUnknown
+{
+ /*
+ * GetTypeID - gives a COR_TYPEID for the ICorDebugType. This
+ * provides a mapping from the ICorDebugType, which represents a
+ * type that may or may not have been loaded into the runtime, to
+ * a COR_TYPEID, which serves as an opaque handle identifying a
+ * type loaded into the runtime. When the type that the
+ * ICorDebugType represents has not yet been loaded, this returns
+ * CORDBG_E_CLASS_NOT_LOADED. Returns CORDBG_E_UNSUPPORTED for
+ * unsupported types.
+ */
+ HRESULT GetTypeID([out] COR_TYPEID *id);
+};
+
+
/* ------------------------------------------------------------------------- *
* DEPRECATED
*
diff --git a/src/inc/corinfo.h b/src/inc/corinfo.h
index 6e41d8e035..e899a23379 100644
--- a/src/inc/corinfo.h
+++ b/src/inc/corinfo.h
@@ -231,11 +231,11 @@ TODO: Talk about initializing strutures before use
#if COR_JIT_EE_VERSION > 460
// Update this one
-SELECTANY const GUID JITEEVersionIdentifier = { /* 0b17dfeb-1ead-4e06-b025-d60d3a493b53 */
- 0x0b17dfeb,
- 0x1ead,
- 0x4e06,
- { 0xb0, 0x25, 0xd6, 0x0d, 0x3a, 0x49, 0x3b, 0x53 }
+SELECTANY const GUID JITEEVersionIdentifier = { /* 4bd06266-8ef7-4172-bec6-d3149fde7859 */
+ 0x4bd06266,
+ 0x8ef7,
+ 0x4172,
+ {0xbe, 0xc6, 0xd3, 0x14, 0x9f, 0xde, 0x78, 0x59}
};
#else
@@ -642,6 +642,7 @@ enum CorInfoHelpFunc
#if COR_JIT_EE_VERSION > 460
CORINFO_HELP_READYTORUN_GENERIC_HANDLE,
CORINFO_HELP_READYTORUN_DELEGATE_CTOR,
+ CORINFO_HELP_READYTORUN_GENERIC_STATIC_BASE,
#else
#define CORINFO_HELP_READYTORUN_DELEGATE_CTOR CORINFO_HELP_EE_PRESTUB
#endif // COR_JIT_EE_VERSION
@@ -910,10 +911,12 @@ enum CORINFO_ACCESS_FLAGS
// These are the flags set on an CORINFO_EH_CLAUSE
enum CORINFO_EH_CLAUSE_FLAGS
{
- CORINFO_EH_CLAUSE_NONE = 0,
- CORINFO_EH_CLAUSE_FILTER = 0x0001, // If this bit is on, then this EH entry is for a filter
- CORINFO_EH_CLAUSE_FINALLY = 0x0002, // This clause is a finally clause
- CORINFO_EH_CLAUSE_FAULT = 0x0004, // This clause is a fault clause
+ CORINFO_EH_CLAUSE_NONE = 0,
+ CORINFO_EH_CLAUSE_FILTER = 0x0001, // If this bit is on, then this EH entry is for a filter
+ CORINFO_EH_CLAUSE_FINALLY = 0x0002, // This clause is a finally clause
+ CORINFO_EH_CLAUSE_FAULT = 0x0004, // This clause is a fault clause
+ CORINFO_EH_CLAUSE_DUPLICATE = 0x0008, // Duplicated clause. This clause was duplicated to a funclet which was pulled out of line
+ CORINFO_EH_CLAUSE_SAMETRY = 0x0010, // This clause covers same try block as the previous one. (Used by CoreRT ABI.)
};
// This enumeration is passed to InternalThrow
@@ -1706,6 +1709,9 @@ enum CORINFO_FIELD_ACCESSOR
CORINFO_FIELD_STATIC_GENERICS_STATIC_HELPER, // static field access using the "generic static" helper (argument is MethodTable *)
CORINFO_FIELD_STATIC_ADDR_HELPER, // static field accessed using address-of helper (argument is FieldDesc *)
CORINFO_FIELD_STATIC_TLS, // unmanaged TLS access
+#if COR_JIT_EE_VERSION > 460
+ CORINFO_FIELD_STATIC_READYTORUN_HELPER, // static field access using a runtime lookup helper
+#endif
CORINFO_FIELD_INTRINSIC_ZERO, // intrinsic zero (IntPtr.Zero, UIntPtr.Zero)
CORINFO_FIELD_INTRINSIC_EMPTY_STRING, // intrinsic emptry string (String.Empty)
@@ -2631,7 +2637,7 @@ public:
// in the code are. The native compiler will ensure that these places
// have a corresponding break point in native code.
//
- // Note that unless CORJIT_FLG_DEBUG_CODE is specified, this function will
+ // Note that unless CORJIT_FLAG_DEBUG_CODE is specified, this function will
// be used only as a hint and the native compiler should not change its
// code generation.
virtual void getBoundaries(
@@ -2661,7 +2667,7 @@ public:
// under debugging, the JIT needs to keep them live over their
// entire scope so that they can be inspected.
//
- // Note that unless CORJIT_FLG_DEBUG_CODE is specified, this function will
+ // Note that unless CORJIT_FLAG_DEBUG_CODE is specified, this function will
// be used only as a hint and the native compiler should not change its
// code generation.
virtual void getVars(
diff --git a/src/inc/corjit.h b/src/inc/corjit.h
index e4deabd0e1..6d01b9f9d9 100644
--- a/src/inc/corjit.h
+++ b/src/inc/corjit.h
@@ -73,6 +73,8 @@ enum CorJitResult
};
+#if COR_JIT_EE_VERSION <= 460
+
/* values for flags in compileMethod */
enum CorJitFlag
@@ -133,21 +135,11 @@ enum CorJitFlag
CORJIT_FLG_ALIGN_LOOPS = 0x20000000, // add NOPs before loops to align them at 16 byte boundaries
CORJIT_FLG_PUBLISH_SECRET_PARAM= 0x40000000, // JIT must place stub secret param into local 0. (used by IL stubs)
CORJIT_FLG_GCPOLL_INLINE = 0x80000000, // JIT must inline calls to GCPoll when possible
-
-#if COR_JIT_EE_VERSION > 460
- CORJIT_FLG_CALL_GETJITFLAGS = 0xffffffff, // Indicates that the JIT should retrieve flags in the form of a
- // pointer to a CORJIT_FLAGS value via ICorJitInfo::getJitFlags().
-#endif
};
enum CorJitFlag2
{
CORJIT_FLG2_SAMPLING_JIT_BACKGROUND = 0x00000001, // JIT is being invoked as a result of stack sampling for hot methods in the background
-#if COR_JIT_EE_VERSION > 460
- CORJIT_FLG2_USE_PINVOKE_HELPERS = 0x00000002, // The JIT should use the PINVOKE_{BEGIN,END} helpers instead of emitting inline transitions
- CORJIT_FLG2_REVERSE_PINVOKE = 0x00000004, // The JIT should insert REVERSE_PINVOKE_{ENTER,EXIT} helpers into method prolog/epilog
- CORJIT_FLG2_DESKTOP_QUIRKS = 0x00000008, // The JIT should generate desktop-quirk-compatible code
-#endif
};
struct CORJIT_FLAGS
@@ -156,11 +148,157 @@ struct CORJIT_FLAGS
unsigned corJitFlags2; // Values are from CorJitFlag2
};
+#endif // COR_JIT_EE_VERSION <= 460
+
+#if COR_JIT_EE_VERSION > 460
+
+class CORJIT_FLAGS
+{
+public:
+
+ enum CorJitFlag
+ {
+ CORJIT_FLAG_CALL_GETJITFLAGS = 0xffffffff, // Indicates that the JIT should retrieve flags in the form of a
+ // pointer to a CORJIT_FLAGS value via ICorJitInfo::getJitFlags().
+ CORJIT_FLAG_SPEED_OPT = 0,
+ CORJIT_FLAG_SIZE_OPT = 1,
+ CORJIT_FLAG_DEBUG_CODE = 2, // generate "debuggable" code (no code-mangling optimizations)
+ CORJIT_FLAG_DEBUG_EnC = 3, // We are in Edit-n-Continue mode
+ CORJIT_FLAG_DEBUG_INFO = 4, // generate line and local-var info
+ CORJIT_FLAG_MIN_OPT = 5, // disable all jit optimizations (not necesarily debuggable code)
+ CORJIT_FLAG_GCPOLL_CALLS = 6, // Emit calls to JIT_POLLGC for thread suspension.
+ CORJIT_FLAG_MCJIT_BACKGROUND = 7, // Calling from multicore JIT background thread, do not call JitComplete
+
+ #if defined(_TARGET_X86_)
+
+ CORJIT_FLAG_PINVOKE_RESTORE_ESP = 8, // Restore ESP after returning from inlined PInvoke
+ CORJIT_FLAG_TARGET_P4 = 9,
+ CORJIT_FLAG_USE_FCOMI = 10, // Generated code may use fcomi(p) instruction
+ CORJIT_FLAG_USE_CMOV = 11, // Generated code may use cmov instruction
+ CORJIT_FLAG_USE_SSE2 = 12, // Generated code may use SSE-2 instructions
+
+ #else // !defined(_TARGET_X86_)
+
+ CORJIT_FLAG_UNUSED1 = 8,
+ CORJIT_FLAG_UNUSED2 = 9,
+ CORJIT_FLAG_UNUSED3 = 10,
+ CORJIT_FLAG_UNUSED4 = 11,
+ CORJIT_FLAG_UNUSED5 = 12,
+
+ #endif // !defined(_TARGET_X86_)
+
+ #if defined(_TARGET_X86_) || defined(_TARGET_AMD64_)
+
+ CORJIT_FLAG_USE_SSE3_4 = 13,
+ CORJIT_FLAG_USE_AVX = 14,
+ CORJIT_FLAG_USE_AVX2 = 15,
+ CORJIT_FLAG_USE_AVX_512 = 16,
+ CORJIT_FLAG_FEATURE_SIMD = 17,
+
+ #else // !defined(_TARGET_X86_) && !defined(_TARGET_AMD64_)
+
+ CORJIT_FLAG_UNUSED6 = 13,
+ CORJIT_FLAG_UNUSED7 = 14,
+ CORJIT_FLAG_UNUSED8 = 15,
+ CORJIT_FLAG_UNUSED9 = 16,
+ CORJIT_FLAG_UNUSED10 = 17,
+
+ #endif // !defined(_TARGET_X86_) && !defined(_TARGET_AMD64_)
+
+ CORJIT_FLAG_MAKEFINALCODE = 18, // Use the final code generator, i.e., not the interpreter.
+ CORJIT_FLAG_READYTORUN = 19, // Use version-resilient code generation
+ CORJIT_FLAG_PROF_ENTERLEAVE = 20, // Instrument prologues/epilogues
+ CORJIT_FLAG_PROF_REJIT_NOPS = 21, // Insert NOPs to ensure code is re-jitable
+ CORJIT_FLAG_PROF_NO_PINVOKE_INLINE = 22, // Disables PInvoke inlining
+ CORJIT_FLAG_SKIP_VERIFICATION = 23, // (lazy) skip verification - determined without doing a full resolve. See comment below
+ CORJIT_FLAG_PREJIT = 24, // jit or prejit is the execution engine.
+ CORJIT_FLAG_RELOC = 25, // Generate relocatable code
+ CORJIT_FLAG_IMPORT_ONLY = 26, // Only import the function
+ CORJIT_FLAG_IL_STUB = 27, // method is an IL stub
+ CORJIT_FLAG_PROCSPLIT = 28, // JIT should separate code into hot and cold sections
+ CORJIT_FLAG_BBINSTR = 29, // Collect basic block profile information
+ CORJIT_FLAG_BBOPT = 30, // Optimize method based on profile information
+ CORJIT_FLAG_FRAMED = 31, // All methods have an EBP frame
+ CORJIT_FLAG_ALIGN_LOOPS = 32, // add NOPs before loops to align them at 16 byte boundaries
+ CORJIT_FLAG_PUBLISH_SECRET_PARAM = 33, // JIT must place stub secret param into local 0. (used by IL stubs)
+ CORJIT_FLAG_GCPOLL_INLINE = 34, // JIT must inline calls to GCPoll when possible
+ CORJIT_FLAG_SAMPLING_JIT_BACKGROUND = 35, // JIT is being invoked as a result of stack sampling for hot methods in the background
+ CORJIT_FLAG_USE_PINVOKE_HELPERS = 36, // The JIT should use the PINVOKE_{BEGIN,END} helpers instead of emitting inline transitions
+ CORJIT_FLAG_REVERSE_PINVOKE = 37, // The JIT should insert REVERSE_PINVOKE_{ENTER,EXIT} helpers into method prolog/epilog
+ CORJIT_FLAG_DESKTOP_QUIRKS = 38, // The JIT should generate desktop-quirk-compatible code
+ };
+
+ CORJIT_FLAGS()
+ : corJitFlags(0)
+ {
+ // empty
+ }
+
+ // Convenience constructor to set exactly one flag.
+ CORJIT_FLAGS(CorJitFlag flag)
+ : corJitFlags(0)
+ {
+ Set(flag);
+ }
+
+ CORJIT_FLAGS(const CORJIT_FLAGS& other)
+ {
+ corJitFlags = other.corJitFlags;
+ }
+
+ void Reset()
+ {
+ corJitFlags = 0;
+ }
+
+ void Set(CorJitFlag flag)
+ {
+ corJitFlags |= 1ULL << (unsigned __int64)flag;
+ }
+
+ void Clear(CorJitFlag flag)
+ {
+ corJitFlags &= ~(1ULL << (unsigned __int64)flag);
+ }
+
+ bool IsSet(CorJitFlag flag) const
+ {
+ return (corJitFlags & (1ULL << (unsigned __int64)flag)) != 0;
+ }
+
+ void Add(const CORJIT_FLAGS& other)
+ {
+ corJitFlags |= other.corJitFlags;
+ }
+
+ void Remove(const CORJIT_FLAGS& other)
+ {
+ corJitFlags &= ~other.corJitFlags;
+ }
+
+ bool IsEmpty() const
+ {
+ return corJitFlags == 0;
+ }
+
+ // DO NOT USE THIS FUNCTION! (except in very restricted special cases)
+ unsigned __int64 GetFlagsRaw()
+ {
+ return corJitFlags;
+ }
+
+private:
+
+ unsigned __int64 corJitFlags;
+};
+
+#endif // COR_JIT_EE_VERSION > 460
+
/*****************************************************************************
-Here is how CORJIT_FLG_SKIP_VERIFICATION should be interepreted.
+Here is how CORJIT_FLAG_SKIP_VERIFICATION should be interepreted.
Note that even if any method is inlined, it need not be verified.
-if (CORJIT_FLG_SKIP_VERIFICATION is passed in to ICorJitCompiler::compileMethod())
+if (CORJIT_FLAG_SKIP_VERIFICATION is passed in to ICorJitCompiler::compileMethod())
{
No verification needs to be done.
Just compile the method, generating unverifiable code if necessary
@@ -245,7 +383,7 @@ else
case INSTVER_GENERIC_PASSED_VERIFICATION:
{
- This cannot ever happen because the VM would pass in CORJIT_FLG_SKIP_VERIFICATION.
+ This cannot ever happen because the VM would pass in CORJIT_FLAG_SKIP_VERIFICATION.
}
case INSTVER_GENERIC_FAILED_VERIFICATION:
@@ -260,7 +398,7 @@ else
case CORINFO_VERIFICATION_CAN_SKIP:
{
- This cannot ever happen because the CLR would pass in CORJIT_FLG_SKIP_VERIFICATION.
+ This cannot ever happen because the CLR would pass in CORJIT_FLAG_SKIP_VERIFICATION.
}
case CORINFO_VERIFICATION_RUNTIME_CHECK:
@@ -377,7 +515,11 @@ public:
// When the EE loads the System.Numerics.Vectors assembly, it asks the JIT what length (in bytes) of
// SIMD vector it supports as an intrinsic type. Zero means that the JIT does not support SIMD
// intrinsics, so the EE should use the default size (i.e. the size of the IL implementation).
+#if COR_JIT_EE_VERSION > 460
+ virtual unsigned getMaxIntrinsicSIMDVectorLength(CORJIT_FLAGS cpuCompileFlags) { return 0; }
+#else
virtual unsigned getMaxIntrinsicSIMDVectorLength(DWORD cpuCompileFlags) { return 0; }
+#endif
// IL obfuscators sometimes interpose on the EE-JIT interface. This function allows the VM to
// tell the JIT to use a particular ICorJitCompiler to implement the methods of this interface,
diff --git a/src/inc/corprof.idl b/src/inc/corprof.idl
index 4288897844..9af1cd97a8 100644
--- a/src/inc/corprof.idl
+++ b/src/inc/corprof.idl
@@ -60,6 +60,10 @@ cpp_quote("#endif")
typedef const BYTE *LPCBYTE;
typedef BYTE *LPBYTE;
+typedef BYTE COR_SIGNATURE;
+typedef COR_SIGNATURE* PCOR_SIGNATURE;
+typedef const COR_SIGNATURE* PCCOR_SIGNATURE;
+
#endif
@@ -2375,6 +2379,36 @@ interface ICorProfilerCallback7 : ICorProfilerCallback6
}
+[
+ object,
+ uuid(5BED9B15-C079-4D47-BFE2-215A140C07E0),
+ pointer_default(unique),
+ local
+]
+interface ICorProfilerCallback8 : ICorProfilerCallback7
+{
+ // This event is triggered whenever a dynamic method is jit compiled.
+ // These include various IL Stubs and LCG Methods.
+ // The goal is to provide profiler writers with enough information to identify
+ // it to users as beyond unknown code addresses.
+ // Note: FunctionID's provided here cannot be used to resolve to their metadata
+ // tokens since dynamic methods have no metadata.
+ //
+ // Documentation Note: pILHeader is only valid during the callback
+
+ HRESULT DynamicMethodJITCompilationStarted(
+ [in] FunctionID functionId,
+ [in] BOOL fIsSafeToBlock,
+ [in] LPCBYTE pILHeader,
+ [in] ULONG cbILHeader);
+
+ HRESULT DynamicMethodJITCompilationFinished(
+ [in] FunctionID functionId,
+ [in] HRESULT hrStatus,
+ [in] BOOL fIsSafeToBlock);
+}
+
+
/*
* COR_PRF_CODEGEN_FLAGS controls various flags and hooks for a specific
* method. A combination of COR_PRF_CODEGEN_FLAGS is provided by the
@@ -3781,6 +3815,59 @@ interface ICorProfilerInfo7 : ICorProfilerInfo6
};
+[
+ object,
+ uuid(C5AC80A6-782E-4716-8044-39598C60CFBF),
+ pointer_default(unique),
+ local
+]
+interface ICorProfilerInfo8 : ICorProfilerInfo7
+{
+ /*
+ * Determines if a function has associated metadata
+ *
+ * Certain methods like IL Stubs or LCG Methods do not have
+ * associated metadata that can be retrieved using the IMetaDataImport APIs.
+ *
+ * Such methods can be encountered by profilers through instruction pointers
+ * or by listening to ICorProfilerCallback::DynamicMethodJITCompilationStarted
+ *
+ * This API can be used to determine whether a FunctionID is dynamic.
+ */
+ HRESULT IsFunctionDynamic( [in] FunctionID functionId,
+ [out] BOOL *isDynamic);
+
+ /*
+ * Maps a managed code instruction pointer to a FunctionID.
+ *
+ * GetFunctionFromIP2 fails for dynamic methods, this method works for
+ * both dynamic and non-dynamic methods. It is a superset of GetFunctionFromIP2
+ */
+ HRESULT GetFunctionFromIP3([in] LPCBYTE ip,
+ [out] FunctionID *functionId,
+ [out] ReJITID * pReJitId);
+
+ /*
+ * Retrieves informaiton about dynamic methods
+ *
+ * Certain methods like IL Stubs or LCG do not have
+ * associated metadata that can be retrieved using the IMetaDataImport APIs.
+ *
+ * Such methods can be encountered by profilers through instruction pointers
+ * or by listening to ICorProfilerCallback::DynamicMethodJITCompilationStarted
+ *
+ * This API can be used to retrieve information about dynamic methods
+ * including a friendly name if available.
+ */
+ HRESULT GetDynamicFunctionInfo( [in] FunctionID functionId,
+ [out] ModuleID *moduleId,
+ [out] PCCOR_SIGNATURE *ppvSig,
+ [out] ULONG *pbSig,
+ [in] ULONG cchName,
+ [out] ULONG *pcchName,
+ [out] WCHAR wszName[]);
+};
+
/*
* This interface lets you iterate over methods in the runtime.
*/
diff --git a/src/inc/daccess.h b/src/inc/daccess.h
index b4c5044bd9..6d9fb3265f 100644
--- a/src/inc/daccess.h
+++ b/src/inc/daccess.h
@@ -774,18 +774,18 @@ interface IMDInternalImport* DacGetMDImport(const ReflectionModule* reflectionMo
int DacGetIlMethodSize(TADDR methAddr);
struct COR_ILMETHOD* DacGetIlMethod(TADDR methAddr);
-#if defined(WIN64EXCEPTIONS)
+#ifdef WIN64EXCEPTIONS
struct _UNWIND_INFO * DacGetUnwindInfo(TADDR taUnwindInfo);
// virtually unwind a CONTEXT out-of-process
struct _KNONVOLATILE_CONTEXT_POINTERS;
BOOL DacUnwindStackFrame(T_CONTEXT * pContext, T_KNONVOLATILE_CONTEXT_POINTERS* pContextPointers);
+#endif // WIN64EXCEPTIONS
#if defined(FEATURE_PAL)
// call back through data target to unwind out-of-process
HRESULT DacVirtualUnwind(ULONG32 threadId, PCONTEXT context, PT_KNONVOLATILE_CONTEXT_POINTERS contextPointers);
#endif // FEATURE_PAL
-#endif // _WIN64
#ifdef FEATURE_MINIMETADATA_IN_TRIAGEDUMPS
class SString;
diff --git a/src/inc/dacprivate.h b/src/inc/dacprivate.h
index 5a09abe113..0db4affcfc 100644
--- a/src/inc/dacprivate.h
+++ b/src/inc/dacprivate.h
@@ -20,6 +20,29 @@
#include <msodw.h>
#endif // FEATURE_PAL
+//
+// Whenever a structure is marshalled between different platforms, we need to ensure the
+// layout is the same in both cases. We tell GCC to use the MSVC-style packing with
+// the following attribute. The main thing this appears to control is whether
+// 8-byte values are aligned at 4-bytes (GCC default) or 8-bytes (MSVC default).
+// This attribute affects only the immediate struct it is applied to, you must also apply
+// it to any nested structs if you want their layout affected as well. You also must
+// apply this to unions embedded in other structures, since it can influence the starting
+// alignment.
+//
+// Note that there doesn't appear to be any disadvantage to applying this a little
+// more agressively than necessary, so we generally use it on all classes / structures
+// defined in a file that defines marshalled data types (eg. DacDbiStructures.h)
+// The -mms-bitfields compiler option also does this for the whole file, but we don't
+// want to go changing the layout of, for example, structures defined in OS header files
+// so we explicitly opt-in with this attribute.
+//
+#ifdef __GNUC__
+#define MSLAYOUT __attribute__((__ms_struct__))
+#else
+#define MSLAYOUT
+#endif
+
//----------------------------------------------------------------------------
//
// Utility class to allow for zero initialization of our Dacp- structs.
@@ -58,7 +81,7 @@ enum
};
enum DacpObjectType { OBJ_STRING=0,OBJ_FREE,OBJ_OBJECT,OBJ_ARRAY,OBJ_OTHER };
-struct DacpObjectData : ZeroInit<DacpObjectData>
+struct MSLAYOUT DacpObjectData : ZeroInit<DacpObjectData>
{
CLRDATA_ADDRESS MethodTable;
DacpObjectType ObjectType;
@@ -81,7 +104,7 @@ struct DacpObjectData : ZeroInit<DacpObjectData>
}
};
-struct DacpExceptionObjectData : ZeroInit<DacpExceptionObjectData>
+struct MSLAYOUT DacpExceptionObjectData : ZeroInit<DacpExceptionObjectData>
{
CLRDATA_ADDRESS Message;
CLRDATA_ADDRESS InnerException;
@@ -105,7 +128,7 @@ struct DacpExceptionObjectData : ZeroInit<DacpExceptionObjectData>
}
};
-struct DacpUsefulGlobalsData : ZeroInit<DacpUsefulGlobalsData>
+struct MSLAYOUT DacpUsefulGlobalsData : ZeroInit<DacpUsefulGlobalsData>
{
CLRDATA_ADDRESS ArrayMethodTable;
CLRDATA_ADDRESS StringMethodTable;
@@ -114,7 +137,7 @@ struct DacpUsefulGlobalsData : ZeroInit<DacpUsefulGlobalsData>
CLRDATA_ADDRESS FreeMethodTable;
};
-struct DacpFieldDescData : ZeroInit<DacpFieldDescData>
+struct MSLAYOUT DacpFieldDescData : ZeroInit<DacpFieldDescData>
{
CorElementType Type;
CorElementType sigType; // ELEMENT_TYPE_XXX from signature. We need this to disply pretty name for String in minidump's case
@@ -137,7 +160,7 @@ struct DacpFieldDescData : ZeroInit<DacpFieldDescData>
}
};
-struct DacpMethodTableFieldData : ZeroInit<DacpMethodTableFieldData>
+struct MSLAYOUT DacpMethodTableFieldData : ZeroInit<DacpMethodTableFieldData>
{
WORD wNumInstanceFields;
WORD wNumStaticFields;
@@ -154,7 +177,7 @@ struct DacpMethodTableFieldData : ZeroInit<DacpMethodTableFieldData>
}
};
-struct DacpMethodTableTransparencyData : ZeroInit<DacpMethodTableTransparencyData>
+struct MSLAYOUT DacpMethodTableTransparencyData : ZeroInit<DacpMethodTableTransparencyData>
{
BOOL bHasCriticalTransparentInfo;
BOOL bIsCritical;
@@ -166,7 +189,7 @@ struct DacpMethodTableTransparencyData : ZeroInit<DacpMethodTableTransparencyDat
}
};
-struct DacpDomainLocalModuleData : ZeroInit<DacpDomainLocalModuleData>
+struct MSLAYOUT DacpDomainLocalModuleData : ZeroInit<DacpDomainLocalModuleData>
{
// These two parameters are used as input params when calling the
// no-argument form of Request below.
@@ -186,7 +209,7 @@ struct DacpDomainLocalModuleData : ZeroInit<DacpDomainLocalModuleData>
};
-struct DacpThreadLocalModuleData : ZeroInit<DacpThreadLocalModuleData>
+struct MSLAYOUT DacpThreadLocalModuleData : ZeroInit<DacpThreadLocalModuleData>
{
// These two parameters are used as input params when calling the
// no-argument form of Request below.
@@ -200,7 +223,7 @@ struct DacpThreadLocalModuleData : ZeroInit<DacpThreadLocalModuleData>
};
-struct DacpModuleData : ZeroInit<DacpModuleData>
+struct MSLAYOUT DacpModuleData : ZeroInit<DacpModuleData>
{
CLRDATA_ADDRESS Address;
CLRDATA_ADDRESS File; // A PEFile addr
@@ -243,7 +266,7 @@ private:
void operator=(const DacpModuleData&);
};
-struct DacpMethodTableData : ZeroInit<DacpMethodTableData>
+struct MSLAYOUT DacpMethodTableData : ZeroInit<DacpMethodTableData>
{
BOOL bIsFree; // everything else is NULL if this is true.
CLRDATA_ADDRESS Module;
@@ -260,7 +283,7 @@ struct DacpMethodTableData : ZeroInit<DacpMethodTableData>
BOOL bIsShared; // flags & enum_flag_DomainNeutral
BOOL bIsDynamic;
BOOL bContainsPointers;
-
+
HRESULT Request(ISOSDacInterface *sos, CLRDATA_ADDRESS addr)
{
return sos->GetMethodTableData(addr, this);
@@ -279,7 +302,7 @@ struct DacpMethodTableData : ZeroInit<DacpMethodTableData>
#define CLRSECURITYHOSTED 0x80
#define CLRHOSTED 0x80000000
-struct DacpThreadStoreData : ZeroInit<DacpThreadStoreData>
+struct MSLAYOUT DacpThreadStoreData : ZeroInit<DacpThreadStoreData>
{
LONG threadCount;
LONG unstartedThreadCount;
@@ -290,14 +313,14 @@ struct DacpThreadStoreData : ZeroInit<DacpThreadStoreData>
CLRDATA_ADDRESS finalizerThread;
CLRDATA_ADDRESS gcThread;
DWORD fHostConfig; // Uses hosting flags defined above
-
+
HRESULT Request(ISOSDacInterface *sos)
{
return sos->GetThreadStoreData(this);
}
};
-struct DacpAppDomainStoreData : ZeroInit<DacpAppDomainStoreData>
+struct MSLAYOUT DacpAppDomainStoreData : ZeroInit<DacpAppDomainStoreData>
{
CLRDATA_ADDRESS sharedDomain;
CLRDATA_ADDRESS systemDomain;
@@ -309,14 +332,14 @@ struct DacpAppDomainStoreData : ZeroInit<DacpAppDomainStoreData>
}
};
-struct DacpCOMInterfacePointerData : ZeroInit<DacpCOMInterfacePointerData>
+struct MSLAYOUT DacpCOMInterfacePointerData : ZeroInit<DacpCOMInterfacePointerData>
{
CLRDATA_ADDRESS methodTable;
CLRDATA_ADDRESS interfacePtr;
CLRDATA_ADDRESS comContext;
};
-struct DacpRCWData : ZeroInit<DacpRCWData>
+struct MSLAYOUT DacpRCWData : ZeroInit<DacpRCWData>
{
CLRDATA_ADDRESS identityPointer;
CLRDATA_ADDRESS unknownPointer;
@@ -355,7 +378,7 @@ struct DacpRCWData : ZeroInit<DacpRCWData>
}
};
-struct DacpCCWData : ZeroInit<DacpCCWData>
+struct MSLAYOUT DacpCCWData : ZeroInit<DacpCCWData>
{
CLRDATA_ADDRESS outerIUnknown;
CLRDATA_ADDRESS managedObject;
@@ -397,7 +420,7 @@ enum DacpAppDomainDataStage {
// Information about a BaseDomain (AppDomain, SharedDomain or SystemDomain).
// For types other than AppDomain, some fields (like dwID, DomainLocalBlock, etc.) will be 0/null.
-struct DacpAppDomainData : ZeroInit<DacpAppDomainData>
+struct MSLAYOUT DacpAppDomainData : ZeroInit<DacpAppDomainData>
{
// The pointer to the BaseDomain (not necessarily an AppDomain).
// It's useful to keep this around in the structure
@@ -420,7 +443,7 @@ struct DacpAppDomainData : ZeroInit<DacpAppDomainData>
}
};
-struct DacpAssemblyData : ZeroInit<DacpAssemblyData>
+struct MSLAYOUT DacpAssemblyData : ZeroInit<DacpAssemblyData>
{
CLRDATA_ADDRESS AssemblyPtr; //useful to have
CLRDATA_ADDRESS ClassLoader;
@@ -445,7 +468,7 @@ struct DacpAssemblyData : ZeroInit<DacpAssemblyData>
};
-struct DacpThreadData : ZeroInit<DacpThreadData>
+struct MSLAYOUT DacpThreadData : ZeroInit<DacpThreadData>
{
DWORD corThreadId;
DWORD osThreadId;
@@ -470,7 +493,7 @@ struct DacpThreadData : ZeroInit<DacpThreadData>
};
-struct DacpReJitData : ZeroInit<DacpReJitData>
+struct MSLAYOUT DacpReJitData : ZeroInit<DacpReJitData>
{
enum Flags
{
@@ -485,7 +508,7 @@ struct DacpReJitData : ZeroInit<DacpReJitData>
CLRDATA_ADDRESS NativeCodeAddr;
};
-struct DacpMethodDescData : ZeroInit<DacpMethodDescData>
+struct MSLAYOUT DacpMethodDescData : ZeroInit<DacpMethodDescData>
{
BOOL bHasNativeCode;
BOOL bIsDynamic;
@@ -529,7 +552,7 @@ struct DacpMethodDescData : ZeroInit<DacpMethodDescData>
}
};
-struct DacpMethodDescTransparencyData : ZeroInit<DacpMethodDescTransparencyData>
+struct MSLAYOUT DacpMethodDescTransparencyData : ZeroInit<DacpMethodDescTransparencyData>
{
BOOL bHasCriticalTransparentInfo;
BOOL bIsCritical;
@@ -544,7 +567,7 @@ struct DacpMethodDescTransparencyData : ZeroInit<DacpMethodDescTransparencyData>
// for JITType
enum JITTypes {TYPE_UNKNOWN=0,TYPE_JIT,TYPE_PJIT};
-struct DacpCodeHeaderData : ZeroInit<DacpCodeHeaderData>
+struct MSLAYOUT DacpCodeHeaderData : ZeroInit<DacpCodeHeaderData>
{
CLRDATA_ADDRESS GCInfo;
JITTypes JITType;
@@ -561,7 +584,7 @@ struct DacpCodeHeaderData : ZeroInit<DacpCodeHeaderData>
}
};
-struct DacpWorkRequestData : ZeroInit<DacpWorkRequestData>
+struct MSLAYOUT DacpWorkRequestData : ZeroInit<DacpWorkRequestData>
{
CLRDATA_ADDRESS Function;
CLRDATA_ADDRESS Context;
@@ -573,7 +596,7 @@ struct DacpWorkRequestData : ZeroInit<DacpWorkRequestData>
}
};
-struct DacpHillClimbingLogEntry : ZeroInit<DacpHillClimbingLogEntry>
+struct MSLAYOUT DacpHillClimbingLogEntry : ZeroInit<DacpHillClimbingLogEntry>
{
DWORD TickCount;
int Transition;
@@ -589,7 +612,7 @@ struct DacpHillClimbingLogEntry : ZeroInit<DacpHillClimbingLogEntry>
// Used for CLR versions >= 4.0
-struct DacpThreadpoolData : ZeroInit<DacpThreadpoolData>
+struct MSLAYOUT DacpThreadpoolData : ZeroInit<DacpThreadpoolData>
{
LONG cpuUtilization;
int NumIdleWorkerThreads;
@@ -623,7 +646,7 @@ struct DacpThreadpoolData : ZeroInit<DacpThreadpoolData>
}
};
-struct DacpGenerationData : ZeroInit<DacpGenerationData>
+struct MSLAYOUT DacpGenerationData : ZeroInit<DacpGenerationData>
{
CLRDATA_ADDRESS start_segment;
CLRDATA_ADDRESS allocation_start;
@@ -636,18 +659,18 @@ struct DacpGenerationData : ZeroInit<DacpGenerationData>
#define DAC_NUMBERGENERATIONS 4
-struct DacpAllocData : ZeroInit<DacpAllocData>
+struct MSLAYOUT DacpAllocData : ZeroInit<DacpAllocData>
{
CLRDATA_ADDRESS allocBytes;
CLRDATA_ADDRESS allocBytesLoh;
};
-struct DacpGenerationAllocData : ZeroInit<DacpGenerationAllocData>
+struct MSLAYOUT DacpGenerationAllocData : ZeroInit<DacpGenerationAllocData>
{
DacpAllocData allocData[DAC_NUMBERGENERATIONS];
};
-struct DacpGcHeapDetails : ZeroInit<DacpGcHeapDetails>
+struct MSLAYOUT DacpGcHeapDetails : ZeroInit<DacpGcHeapDetails>
{
CLRDATA_ADDRESS heapAddr; // Only filled in in server mode, otherwise NULL
CLRDATA_ADDRESS alloc_allocated;
@@ -681,7 +704,7 @@ struct DacpGcHeapDetails : ZeroInit<DacpGcHeapDetails>
}
};
-struct DacpGcHeapData
+struct MSLAYOUT DacpGcHeapData
: ZeroInit<DacpGcHeapData>
{
BOOL bServerMode;
@@ -695,7 +718,7 @@ struct DacpGcHeapData
}
};
-struct DacpHeapSegmentData
+struct MSLAYOUT DacpHeapSegmentData
: ZeroInit<DacpHeapSegmentData>
{
CLRDATA_ADDRESS segmentAddr;
@@ -730,7 +753,7 @@ struct DacpHeapSegmentData
}
};
-struct DacpOomData : ZeroInit<DacpOomData>
+struct MSLAYOUT DacpOomData : ZeroInit<DacpOomData>
{
int reason;
ULONG64 alloc_size;
@@ -761,7 +784,7 @@ struct DacpOomData : ZeroInit<DacpOomData>
#define MAX_GC_MECHANISM_BITS_COUNT 2
// This is from ndp\clr\src\vm\common.h
#define MAX_GLOBAL_GC_MECHANISMS_COUNT 6
-struct DacpGCInterestingInfoData : ZeroInit<DacpGCInterestingInfoData>
+struct MSLAYOUT DacpGCInterestingInfoData : ZeroInit<DacpGCInterestingInfoData>
{
size_t interestingDataPoints[NUM_GC_DATA_POINTS];
size_t compactReasons[MAX_COMPACT_REASONS_COUNT];
@@ -808,7 +831,7 @@ struct DacpGCInterestingInfoData : ZeroInit<DacpGCInterestingInfoData>
}
};
-struct DacpGcHeapAnalyzeData
+struct MSLAYOUT DacpGcHeapAnalyzeData
: ZeroInit<DacpGcHeapAnalyzeData>
{
CLRDATA_ADDRESS heapAddr; // Only filled in in server mode, otherwise NULL
@@ -836,7 +859,7 @@ struct DacpGcHeapAnalyzeData
#define SYNCBLOCKDATA_COMFLAGS_RCW 2
#define SYNCBLOCKDATA_COMFLAGS_CF 4
-struct DacpSyncBlockData : ZeroInit<DacpSyncBlockData>
+struct MSLAYOUT DacpSyncBlockData : ZeroInit<DacpSyncBlockData>
{
CLRDATA_ADDRESS Object;
BOOL bFree; // if set, no other fields are useful
@@ -863,7 +886,7 @@ struct DacpSyncBlockData : ZeroInit<DacpSyncBlockData>
}
};
-struct DacpSyncBlockCleanupData : ZeroInit<DacpSyncBlockCleanupData>
+struct MSLAYOUT DacpSyncBlockCleanupData : ZeroInit<DacpSyncBlockCleanupData>
{
CLRDATA_ADDRESS SyncBlockPointer;
@@ -883,7 +906,7 @@ struct DacpSyncBlockCleanupData : ZeroInit<DacpSyncBlockCleanupData>
enum EHClauseType {EHFault, EHFinally, EHFilter, EHTyped, EHUnknown};
-struct DACEHInfo : ZeroInit<DACEHInfo>
+struct MSLAYOUT DACEHInfo : ZeroInit<DACEHInfo>
{
EHClauseType clauseType;
CLRDATA_ADDRESS tryStartOffset;
@@ -898,7 +921,7 @@ struct DACEHInfo : ZeroInit<DACEHInfo>
mdToken tokCatch; // the type token of the TYPED clause type
};
-struct DacpGetModuleAddress : ZeroInit<DacpGetModuleAddress>
+struct MSLAYOUT DacpGetModuleAddress : ZeroInit<DacpGetModuleAddress>
{
CLRDATA_ADDRESS ModulePtr;
HRESULT Request(IXCLRDataModule* pDataModule)
@@ -907,7 +930,7 @@ struct DacpGetModuleAddress : ZeroInit<DacpGetModuleAddress>
}
};
-struct DacpGetModuleData : ZeroInit<DacpGetModuleData>
+struct MSLAYOUT DacpGetModuleData : ZeroInit<DacpGetModuleData>
{
BOOL IsDynamic;
BOOL IsInMemory;
@@ -924,7 +947,7 @@ struct DacpGetModuleData : ZeroInit<DacpGetModuleData>
}
};
-struct DacpFrameData : ZeroInit<DacpFrameData>
+struct MSLAYOUT DacpFrameData : ZeroInit<DacpFrameData>
{
CLRDATA_ADDRESS frameAddr;
@@ -937,7 +960,7 @@ struct DacpFrameData : ZeroInit<DacpFrameData>
}
};
-struct DacpJitManagerInfo : ZeroInit<DacpJitManagerInfo>
+struct MSLAYOUT DacpJitManagerInfo : ZeroInit<DacpJitManagerInfo>
{
CLRDATA_ADDRESS managerAddr;
DWORD codeType; // for union below
@@ -946,14 +969,14 @@ struct DacpJitManagerInfo : ZeroInit<DacpJitManagerInfo>
enum CodeHeapType {CODEHEAP_LOADER=0,CODEHEAP_HOST,CODEHEAP_UNKNOWN};
-struct DacpJitCodeHeapInfo : ZeroInit<DacpJitCodeHeapInfo>
+struct MSLAYOUT DacpJitCodeHeapInfo : ZeroInit<DacpJitCodeHeapInfo>
{
DWORD codeHeapType; // for union below
union
{
CLRDATA_ADDRESS LoaderHeap; // if CODEHEAP_LOADER
- struct
+ struct MSLAYOUT
{
CLRDATA_ADDRESS baseAddr; // if CODEHEAP_HOST
CLRDATA_ADDRESS currentAddr;
diff --git a/src/inc/dacvars.h b/src/inc/dacvars.h
index fb052b3f5d..0a60684ad1 100644
--- a/src/inc/dacvars.h
+++ b/src/inc/dacvars.h
@@ -125,9 +125,10 @@ DEFINE_DACVAR(ULONG, PTR_Thread, dac__g_pFinalizerThread, ::g_pFinalizerThread)
DEFINE_DACVAR(ULONG, PTR_Thread, dac__g_pSuspensionThread, ::g_pSuspensionThread)
#ifdef FEATURE_SVR_GC
-DEFINE_DACVAR(ULONG, DWORD, GCHeap__gcHeapType, GCHeap::gcHeapType)
+DEFINE_DACVAR(ULONG, DWORD, IGCHeap__gcHeapType, IGCHeap::gcHeapType)
#endif // FEATURE_SVR_GC
+DEFINE_DACVAR(ULONG, DWORD, IGCHeap__maxGeneration, IGCHeap::maxGeneration)
DEFINE_DACVAR(ULONG, PTR_BYTE, WKS__gc_heap__alloc_allocated, WKS::gc_heap::alloc_allocated)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*PTR_heap_segment*/, WKS__gc_heap__ephemeral_heap_segment, WKS::gc_heap::ephemeral_heap_segment)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE /*PTR_CFinalize*/, WKS__gc_heap__finalize_queue, WKS::gc_heap::finalize_queue)
@@ -198,7 +199,7 @@ DEFINE_DACVAR(ULONG, PTR_DWORD, dac__g_card_table, ::g_card_table)
DEFINE_DACVAR(ULONG, PTR_BYTE, dac__g_lowest_address, ::g_lowest_address)
DEFINE_DACVAR(ULONG, PTR_BYTE, dac__g_highest_address, ::g_highest_address)
-DEFINE_DACVAR(ULONG, GCHeap, dac__g_pGCHeap, ::g_pGCHeap)
+DEFINE_DACVAR(ULONG, IGCHeap, dac__g_pGCHeap, ::g_pGCHeap)
#ifdef GC_CONFIG_DRIVEN
DEFINE_DACVAR_NO_DUMP(ULONG, SIZE_T, dac__interesting_data_per_heap, WKS::interesting_data_per_heap)
@@ -217,6 +218,9 @@ DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pStringClass, ::g_pStringClass
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pArrayClass, ::g_pArrayClass)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pSZArrayHelperClass, ::g_pSZArrayHelperClass)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pNullableClass, ::g_pNullableClass)
+#ifdef FEATURE_SPAN_OF_T
+DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pByReferenceClass, ::g_pByReferenceClass)
+#endif
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pExceptionClass, ::g_pExceptionClass)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pThreadAbortExceptionClass, ::g_pThreadAbortExceptionClass)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pOutOfMemoryExceptionClass, ::g_pOutOfMemoryExceptionClass)
@@ -229,8 +233,12 @@ DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pOverlappedDataClass, ::g_pOve
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pValueTypeClass, ::g_pValueTypeClass)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pEnumClass, ::g_pEnumClass)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pThreadClass, ::g_pThreadClass)
+#ifdef FEATURE_CER
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pCriticalFinalizerObjectClass, ::g_pCriticalFinalizerObjectClass)
+#endif
+#ifndef FEATURE_CORECLR
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pAsyncFileStream_AsyncResultClass, ::g_pAsyncFileStream_AsyncResultClass)
+#endif // !FEATURE_CORECLR
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pPredefinedArrayTypes, ::g_pPredefinedArrayTypes)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_TypedReferenceMT, ::g_TypedReferenceMT)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pByteArrayMT, ::g_pByteArrayMT)
@@ -244,7 +252,9 @@ DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pBaseRuntimeClass, ::g_pBaseRu
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pICastableInterface, ::g_pICastableInterface)
#endif // FEATURE_ICASTABLE
+#ifdef FEATURE_CER
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pPrepareConstrainedRegionsMethod, ::g_pPrepareConstrainedRegionsMethod)
+#endif
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pExecuteBackoutCodeHelperMethod, ::g_pExecuteBackoutCodeHelperMethod)
DEFINE_DACVAR(ULONG, UNKNOWN_POINTER_TYPE, dac__g_pObjectCtorMD, ::g_pObjectCtorMD)
diff --git a/src/inc/debugreturn.h b/src/inc/debugreturn.h
index dbcbd2bb46..e5013ccabe 100644
--- a/src/inc/debugreturn.h
+++ b/src/inc/debugreturn.h
@@ -27,9 +27,11 @@
#else // !_PREFAST_
-// This is disabled in VS2015 Update 3 and earlier because only C++11 constexpr is supported,
-// which doesn't allow the use of 'if' statements within the body of a constexpr function.
-#if defined(_DEBUG) && (!defined(_MSC_FULL_VER) || _MSC_FULL_VER > 190024210)
+// This is disabled in build 190024315 (a pre-release build after VS 2015 Update 3) and
+// earlier because those builds only support C++11 constexpr, which doesn't allow the
+// use of 'if' statements within the body of a constexpr function. Later builds support
+// C++14 constexpr.
+#if defined(_DEBUG) && (!defined(_MSC_FULL_VER) || _MSC_FULL_VER > 190024315)
// Code to generate a compile-time error if return statements appear where they
// shouldn't.
@@ -110,7 +112,7 @@ typedef __SafeToReturn __ReturnOK;
#define DEBUG_OK_TO_RETURN_BEGIN(arg) { typedef __SafeToReturn __ReturnOK; if (0 && __ReturnOK::used()) { } else {
#define DEBUG_OK_TO_RETURN_END(arg) } }
-#else // defined(_DEBUG) && (!defined(_MSC_FULL_VER) || _MSC_FULL_VER > 190024210)
+#else // defined(_DEBUG) && (!defined(_MSC_FULL_VER) || _MSC_FULL_VER > 190024315)
#define DEBUG_ASSURE_SAFE_TO_RETURN TRUE
@@ -120,7 +122,7 @@ typedef __SafeToReturn __ReturnOK;
#define DEBUG_OK_TO_RETURN_BEGIN(arg) {
#define DEBUG_OK_TO_RETURN_END(arg) }
-#endif // defined(_DEBUG) && (!defined(_MSC_FULL_VER) || _MSC_FULL_VER > 190024210)
+#endif // defined(_DEBUG) && (!defined(_MSC_FULL_VER) || _MSC_FULL_VER > 190024315)
#endif // !_PREFAST_
diff --git a/src/inc/eetwain.h b/src/inc/eetwain.h
index 6e183c5546..502d181962 100644
--- a/src/inc/eetwain.h
+++ b/src/inc/eetwain.h
@@ -278,16 +278,16 @@ virtual void * GetGSCookieAddr(PREGDISPLAY pContext,
Returns true if the given IP is in the given method's prolog or an epilog.
*/
virtual bool IsInPrologOrEpilog(DWORD relPCOffset,
- PTR_VOID methodInfoPtr,
+ GCInfoToken gcInfoToken,
size_t* prologSize) = 0;
/*
Returns true if the given IP is in the synchronized region of the method (valid for synchronized methods only)
*/
virtual bool IsInSynchronizedRegion(
- DWORD relOffset,
- PTR_VOID methodInfoPtr,
- unsigned flags) = 0;
+ DWORD relOffset,
+ GCInfoToken gcInfoToken,
+ unsigned flags) = 0;
/*
Returns the size of a given function as reported in the GC info (does
@@ -297,9 +297,15 @@ virtual bool IsInSynchronizedRegion(
virtual size_t GetFunctionSize(GCInfoToken gcInfoToken) = 0;
/*
+Returns the ReturnKind of a given function as reported in the GC info.
+*/
+
+virtual ReturnKind GetReturnKind(GCInfoToken gcInfotoken) = 0;
+
+/*
Returns the size of the frame (barring localloc)
*/
-virtual unsigned int GetFrameSize(PTR_VOID methodInfoPtr) = 0;
+virtual unsigned int GetFrameSize(GCInfoToken gcInfoToken) = 0;
#ifndef DACCESS_COMPILE
@@ -307,16 +313,16 @@ virtual unsigned int GetFrameSize(PTR_VOID methodInfoPtr) = 0;
virtual const BYTE* GetFinallyReturnAddr(PREGDISPLAY pReg)=0;
-virtual BOOL IsInFilter(void *methodInfoPtr,
+virtual BOOL IsInFilter(GCInfoToken gcInfoToken,
unsigned offset,
PCONTEXT pCtx,
DWORD curNestLevel) = 0;
-virtual BOOL LeaveFinally(void *methodInfoPtr,
+virtual BOOL LeaveFinally(GCInfoToken gcInfoToken,
unsigned offset,
PCONTEXT pCtx) = 0;
-virtual void LeaveCatch(void *methodInfoPtr,
+virtual void LeaveCatch(GCInfoToken gcInfoToken,
unsigned offset,
PCONTEXT pCtx)=0;
@@ -535,18 +541,18 @@ void * GetGSCookieAddr(PREGDISPLAY pContext,
*/
virtual
bool IsInPrologOrEpilog(
- DWORD relOffset,
- PTR_VOID methodInfoPtr,
- size_t* prologSize);
+ DWORD relOffset,
+ GCInfoToken gcInfoToken,
+ size_t* prologSize);
/*
Returns true if the given IP is in the synchronized region of the method (valid for synchronized functions only)
*/
virtual
bool IsInSynchronizedRegion(
- DWORD relOffset,
- PTR_VOID methodInfoPtr,
- unsigned flags);
+ DWORD relOffset,
+ GCInfoToken gcInfoToken,
+ unsigned flags);
/*
Returns the size of a given function.
@@ -555,23 +561,27 @@ virtual
size_t GetFunctionSize(GCInfoToken gcInfoToken);
/*
+Returns the ReturnKind of a given function.
+*/
+virtual ReturnKind GetReturnKind(GCInfoToken gcInfotoken);
+
+/*
Returns the size of the frame (barring localloc)
*/
virtual
-unsigned int GetFrameSize(
- PTR_VOID methodInfoPtr);
+unsigned int GetFrameSize(GCInfoToken gcInfoToken);
#ifndef DACCESS_COMPILE
virtual const BYTE* GetFinallyReturnAddr(PREGDISPLAY pReg);
-virtual BOOL LeaveFinally(void *methodInfoPtr,
+virtual BOOL LeaveFinally(GCInfoToken gcInfoToken,
unsigned offset,
PCONTEXT pCtx);
-virtual BOOL IsInFilter(void *methodInfoPtr,
+virtual BOOL IsInFilter(GCInfoToken gcInfoToken,
unsigned offset,
PCONTEXT pCtx,
DWORD curNestLevel);
-virtual void LeaveCatch(void *methodInfoPtr,
+virtual void LeaveCatch(GCInfoToken gcInfoToken,
unsigned offset,
PCONTEXT pCtx);
@@ -646,8 +656,9 @@ struct hdrInfo
{
unsigned int methodSize; // native code bytes
unsigned int argSize; // in bytes
- unsigned int stackSize; /* including callee saved registers */
- unsigned int rawStkSize; /* excluding callee saved registers */
+ unsigned int stackSize; // including callee saved registers
+ unsigned int rawStkSize; // excluding callee saved registers
+ ReturnKind returnKind; // The ReturnKind for this method.
unsigned int prologSize;
@@ -689,6 +700,7 @@ struct hdrInfo
unsigned int syncStartOffset; // start/end code offset of the protected region in synchronized methods.
unsigned int syncEndOffset; // INVALID_SYNC_OFFSET if there not synchronized method
unsigned int syncEpilogStart; // The start of the epilog. Synchronized methods are guaranteed to have no more than one epilog.
+ unsigned int revPInvokeOffset; // INVALID_REV_PINVOKE_OFFSET if there is no Reverse PInvoke frame
enum { NOT_IN_PROLOG = -1, NOT_IN_EPILOG = -1 };
diff --git a/src/inc/eventtrace.h b/src/inc/eventtrace.h
index 67d9b7942e..765249e87f 100644
--- a/src/inc/eventtrace.h
+++ b/src/inc/eventtrace.h
@@ -34,7 +34,29 @@
#define _VMEVENTTRACE_H_
#include "eventtracebase.h"
+#include "gcinterface.h"
+#if defined(GC_PROFILING) || defined(FEATURE_EVENT_TRACE)
+struct ProfilingScanContext : ScanContext
+{
+ BOOL fProfilerPinned;
+ void * pvEtwContext;
+ void *pHeapId;
+
+ ProfilingScanContext(BOOL fProfilerPinnedParam) : ScanContext()
+ {
+ LIMITED_METHOD_CONTRACT;
+
+ pHeapId = NULL;
+ fProfilerPinned = fProfilerPinnedParam;
+ pvEtwContext = NULL;
+#ifdef FEATURE_CONSERVATIVE_GC
+ // To not confuse GCScan::GcScanRoots
+ promotion = g_pConfig->GetGCConservative();
+#endif
+ }
+};
+#endif // defined(GC_PROFILING) || defined(FEATURE_EVENT_TRACE)
#ifndef FEATURE_REDHAWK
diff --git a/src/inc/fstring.h b/src/inc/fstring.h
index 68c9098c8f..9245885896 100644
--- a/src/inc/fstring.h
+++ b/src/inc/fstring.h
@@ -21,6 +21,9 @@
namespace FString
{
+ // Note: All "length" parameters do not count the space for the null terminator.
+ // Caller of Unicode_Utf8 and Utf8_Unicode must pass in a buffer of size at least length + 1.
+
// Scan for ASCII only string, calculate result UTF8 string length
HRESULT Unicode_Utf8_Length(__in_z LPCWSTR pString, __out bool * pAllAscii, __out DWORD * pLength);
diff --git a/src/inc/gcdecoder.cpp b/src/inc/gcdecoder.cpp
index d337faeebc..a2a2e8ccd5 100644
--- a/src/inc/gcdecoder.cpp
+++ b/src/inc/gcdecoder.cpp
@@ -86,19 +86,19 @@ size_t FASTCALL decodeSigned(PTR_CBYTE src, int* val)
#pragma optimize("tgy", on)
#endif
-PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
+PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, UINT32 version, InfoHdr* header)
{
LIMITED_METHOD_DAC_CONTRACT;
- BYTE byte = *table++;
- BYTE encoding = byte & 0x7f;
-
+ BYTE nextByte = *table++;
+ BYTE encoding = nextByte & 0x7f;
GetInfoHdr(encoding, header);
-
- while (byte & 0x80)
+ while (nextByte & MORE_BYTES_TO_FOLLOW)
{
- byte = *table++;
- encoding = byte & 0x7f;
+ nextByte = *table++;
+ encoding = nextByte & ADJ_ENCODING_MAX;
+ // encoding here always corresponds to codes in InfoHdrAdjust set
+
if (encoding < NEXT_FOUR_START)
{
if (encoding < SET_ARGCOUNT)
@@ -126,6 +126,7 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
else if (encoding < FIRST_FLIP)
{
header->untrackedCnt = encoding - SET_UNTRACKED;
+ _ASSERTE(header->untrackedCnt != HAS_UNTRACKED);
}
else switch (encoding)
{
@@ -145,22 +146,22 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
header->ebpSaved ^= 1;
break;
case FLIP_EBP_FRAME:
- header->ebpFrame ^= 1;
+ header->ebpFrame ^= 1;
break;
case FLIP_INTERRUPTIBLE:
- header->interruptible ^= 1;
+ header->interruptible ^= 1;
break;
case FLIP_DOUBLE_ALIGN:
- header->doubleAlign ^= 1;
+ header->doubleAlign ^= 1;
break;
case FLIP_SECURITY:
- header->security ^= 1;
+ header->security ^= 1;
break;
case FLIP_HANDLERS:
- header->handlers ^= 1;
+ header->handlers ^= 1;
break;
case FLIP_LOCALLOC:
- header->localloc ^= 1;
+ header->localloc ^= 1;
break;
case FLIP_EDITnCONTINUE:
header->editNcontinue ^= 1;
@@ -172,10 +173,10 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
header->untrackedCnt = HAS_UNTRACKED;
break;
case FLIP_VARARGS:
- header->varargs ^= 1;
+ header->varargs ^= 1;
break;
case FLIP_PROF_CALLBACKS:
- header->profCallbacks ^= 1;
+ header->profCallbacks ^= 1;
break;
case FLIP_HAS_GENERICS_CONTEXT:
header->genericsContext ^= 1;
@@ -189,6 +190,27 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
case FLIP_SYNC:
header->syncStartOffset ^= HAS_SYNC_OFFSET;
break;
+ case FLIP_REV_PINVOKE_FRAME:
+ _ASSERTE(GCInfoEncodesRevPInvokeFrame(version));
+ header->revPInvokeOffset ^= HAS_REV_PINVOKE_FRAME_OFFSET;
+ break;
+
+ case NEXT_OPCODE:
+ _ASSERTE((nextByte & MORE_BYTES_TO_FOLLOW) && "Must have another code");
+ nextByte = *table++;
+ encoding = nextByte & ADJ_ENCODING_MAX;
+ // encoding here always corresponds to codes in InfoHdrAdjust2 set
+
+ if (encoding < SET_RET_KIND_MAX)
+ {
+ _ASSERTE(GCInfoEncodesReturnKind(version));
+ header->returnKind = (ReturnKind)encoding;
+ }
+ else
+ {
+ assert(!"Unexpected encoding");
+ }
+ break;
}
}
else
@@ -202,14 +224,14 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
case 5:
assert(NEXT_FOUR_FRAMESIZE == 0x50);
lowBits = encoding & 0xf;
- header->frameSize <<= 4;
- header->frameSize += lowBits;
+ header->frameSize <<= 4;
+ header->frameSize += lowBits;
break;
case 6:
assert(NEXT_FOUR_ARGCOUNT == 0x60);
lowBits = encoding & 0xf;
- header->argCount <<= 4;
- header->argCount += lowBits;
+ header->argCount <<= 4;
+ header->argCount += lowBits;
break;
case 7:
if ((encoding & 0x8) == 0)
@@ -217,14 +239,14 @@ PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header)
assert(NEXT_THREE_PROLOGSIZE == 0x70);
lowBits = encoding & 0x7;
header->prologSize <<= 3;
- header->prologSize += lowBits;
+ header->prologSize += lowBits;
}
else
{
assert(NEXT_THREE_EPILOGSIZE == 0x78);
lowBits = encoding & 0x7;
header->epilogSize <<= 3;
- header->epilogSize += lowBits;
+ header->epilogSize += lowBits;
}
break;
}
@@ -293,154 +315,155 @@ const InfoHdrSmall infoHdrShortcut[128] = {
// | | | | | | | | | | | | | | | | |
// | | | | | | | | | | | | | | | | | genericsContext
// | | | | | | | | | | | | | | | | | |
-// | | | | | | | | | | | | | | | | | | genericsContextIsMethodDesc
-// | | | | | | | | | | | | | | | | | | |
-// | | | | | | | | | | | | | | | | | | | Arg count
-// | | | | | | | | | | | | | | | | | | | | Counted occurances
-// | | | | | | | | | | | | | | | | | | | | Frame size |
-// | | | | | | | | | | | | | | | | | | | | | |
-// | | | | | | | | | | | | | | | | | | | | | untrackedCnt | Header encoding
-// | | | | | | | | | | | | | | | | | | | | | | | |
-// | | | | | | | | | | | | | | | | | | | | | | varPtrTable | |
-// | | | | | | | | | | | | | | | | | | | | | | | | |
-// | | | | | | | | | | | | | | | | | | | | | | | gsCookieOffs | |
-// | | | | | | | | | | | | | | | | | | | | | | | | | |
-// | | | | | | | | | | | | | | | | | | | | | | | | syncOffs | |
-// | | | | | | | | | | | | | | | | | | | | | | | | | | | |
-// | | | | | | | | | | | | | | | | | | | | | | | | | | | |
-// | | | | | | | | | | | | | | | | | | | | | | | | | | | |
-// v v v v v v v v v v v v v v v v v v v v v v v v v v v v
- { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 1139 00
- { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 128738 01
- { 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3696 02
- { 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 402 03
- { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 4259 04
- { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 3379 05
- { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 2058 06
- { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0 }, // 728 07
- { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0 }, // 984 08
- { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0 }, // 606 09
- { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0 }, // 1110 0a
- { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0 }, // 414 0b
- { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 1553 0c
- { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, YES }, // 584 0d
- { 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 2182 0e
- { 1, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3445 0f
- { 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1369 10
- { 1, 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 515 11
- { 1, 2, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 21127 12
- { 1, 2, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3517 13
- { 1, 2, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 750 14
- { 1, 4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1876 15
- { 1, 4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 1665 16
- { 1, 4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 729 17
- { 1, 4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0 }, // 484 18
- { 1, 4, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 331 19
- { 2, 3, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 361 1a
- { 2, 3, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 964 1b
- { 2, 3, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3713 1c
- { 2, 3, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 466 1d
- { 2, 3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1325 1e
- { 2, 3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 712 1f
- { 2, 3, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 588 20
- { 2, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 20542 21
- { 2, 3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3802 22
- { 2, 3, 3, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 798 23
- { 2, 5, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1900 24
- { 2, 5, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 385 25
- { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1617 26
- { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 1743 27
- { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 909 28
- { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0 }, // 602 29
- { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0 }, // 352 2a
- { 2, 6, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 657 2b
- { 2, 7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, YES }, // 1283 2c
- { 2, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 1286 2d
- { 3, 4, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1495 2e
- { 3, 4, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 1989 2f
- { 3, 4, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1154 30
- { 3, 4, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 9300 31
- { 3, 4, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 392 32
- { 3, 4, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 1720 33
- { 3, 6, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1246 34
- { 3, 6, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 800 35
- { 3, 6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1179 36
- { 3, 6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 1368 37
- { 3, 6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 349 38
- { 3, 6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0 }, // 505 39
- { 3, 6, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 629 3a
- { 3, 8, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 2, YES }, // 365 3b
- { 4, 5, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 487 3c
- { 4, 5, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 1752 3d
- { 4, 5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1959 3e
- { 4, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 2436 3f
- { 4, 5, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 861 40
- { 4, 7, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1459 41
- { 4, 7, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 950 42
- { 4, 7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1491 43
- { 4, 7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 879 44
- { 4, 7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 408 45
- { 5, 4, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 4870 46
- { 5, 6, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 359 47
- { 5, 6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 915 48
- { 5, 6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0 }, // 412 49
- { 5, 6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1288 4a
- { 5, 6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 1591 4b
- { 5, 6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, YES }, // 361 4c
- { 5, 6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0 }, // 623 4d
- { 5, 8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // 1239 4e
- { 6, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 457 4f
- { 6, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 606 50
- { 6, 4, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, YES }, // 1073 51
- { 6, 4, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, YES }, // 508 52
- { 6, 6, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 330 53
- { 6, 6, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1709 54
- { 6, 7, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 1164 55
- { 7, 4, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 556 56
- { 7, 5, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, YES }, // 529 57
- { 7, 5, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, YES }, // 1423 58
- { 7, 8, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, YES }, // 2455 59
- { 7, 8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 956 5a
- { 7, 8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, YES }, // 1399 5b
- { 7, 8, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, YES }, // 587 5c
- { 7, 10, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 1, YES }, // 743 5d
- { 7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // 1004 5e
- { 7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, YES }, // 487 5f
- { 7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0 }, // 337 60
- { 7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, YES }, // 361 61
- { 8, 3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, // 560 62
- { 8, 6, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 1377 63
- { 9, 4, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, // 877 64
- { 9, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 3041 65
- { 9, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, YES }, // 349 66
- { 10, 5, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, // 2061 67
- { 10, 5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, // 577 68
- { 11, 6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, // 1195 69
- { 12, 5, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 491 6a
- { 13, 8, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, YES }, // 627 6b
- { 13, 8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0 }, // 1099 6c
- { 13, 10, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 1, YES }, // 488 6d
- { 14, 7, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 574 6e
- { 16, 7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, YES }, // 1281 6f
- { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, YES }, // 1881 70
- { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 339 71
- { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, // 2594 72
- { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0 }, // 339 73
- { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, YES }, // 2107 74
- { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, YES }, // 2372 75
- { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 6, 0, YES }, // 1078 76
- { 16, 7, 2, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 4, 0, YES }, // 384 77
- { 16, 9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 4, 1, YES }, // 1541 78
- { 16, 9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 2, 4, 1, YES }, // 975 79
- { 19, 7, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, YES }, // 546 7a
- { 24, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 5, 0, YES }, // 675 7b
- { 45, 9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 902 7c
- { 51, 7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, YES }, // 432 7d
- { 51, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 361 7e
- { 51, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0 }, // 703 7f
+// | | | | | | | | | | | | | | | | | | genericsContextIsMethodDesc
+// | | | | | | | | | | | | | | | | | | |
+// | | | | | | | | | | | | | | | | | | | returnKind
+// | | | | | | | | | | | | | | | | | | | |
+// | | | | | | | | | | | | | | | | | | | | Arg count
+// | | | | | | | | | | | | | | | | | | | | | Counted occurences
+// | | | | | | | | | | | | | | | | | | | | | Frame size |
+// | | | | | | | | | | | | | | | | | | | | | | |
+// | | | | | | | | | | | | | | | | | | | | | | untrackedCnt | Header encoding
+// | | | | | | | | | | | | | | | | | | | | | | | | |
+// | | | | | | | | | | | | | | | | | | | | | | | varPtrTable | |
+// | | | | | | | | | | | | | | | | | | | | | | | | | |
+// | | | | | | | | | | | | | | | | | | | | | | | | gsCookieOffs | |
+// | | | | | | | | | | | | | | | | | | | | | | | | | | |
+// | | | | | | | | | | | | | | | | | | | | | | | | | syncOffs | |
+// | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+// | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+// | | | | | | | | | | | | | | | | | | | | | | | | | | | | |
+// v v v v v v v v v v v v v v v v v v v v v v v v v v v v v
+ { 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 1139 00
+ { 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 128738 01
+ { 0, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3696 02
+ { 0, 1, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 402 03
+ { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 4259 04
+ { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 3379 05
+ { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 2058 06
+ { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0 }, // 728 07
+ { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0 }, // 984 08
+ { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0 }, // 606 09
+ { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0 }, // 1110 0a
+ { 0, 3, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 1, 0 }, // 414 0b
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 1553 0c
+ { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, YES }, // 584 0d
+ { 1, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 2182 0e
+ { 1, 2, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3445 0f
+ { 1, 2, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1369 10
+ { 1, 2, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 515 11
+ { 1, 2, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 21127 12
+ { 1, 2, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3517 13
+ { 1, 2, 3, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 750 14
+ { 1, 4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1876 15
+ { 1, 4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 1665 16
+ { 1, 4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 729 17
+ { 1, 4, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0 }, // 484 18
+ { 1, 4, 2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 331 19
+ { 2, 3, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 361 1a
+ { 2, 3, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 964 1b
+ { 2, 3, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3713 1c
+ { 2, 3, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 466 1d
+ { 2, 3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1325 1e
+ { 2, 3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 712 1f
+ { 2, 3, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 588 20
+ { 2, 3, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 20542 21
+ { 2, 3, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 3802 22
+ { 2, 3, 3, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 798 23
+ { 2, 5, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1900 24
+ { 2, 5, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 385 25
+ { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1617 26
+ { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 1743 27
+ { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 909 28
+ { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 1, 0 }, // 602 29
+ { 2, 5, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0 }, // 352 2a
+ { 2, 6, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 657 2b
+ { 2, 7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, YES }, // 1283 2c
+ { 2, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 1286 2d
+ { 3, 4, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1495 2e
+ { 3, 4, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 1989 2f
+ { 3, 4, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1154 30
+ { 3, 4, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 9300 31
+ { 3, 4, 2, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 392 32
+ { 3, 4, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 1720 33
+ { 3, 6, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1246 34
+ { 3, 6, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 800 35
+ { 3, 6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1179 36
+ { 3, 6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 1368 37
+ { 3, 6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 349 38
+ { 3, 6, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0 }, // 505 39
+ { 3, 6, 2, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 629 3a
+ { 3, 8, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 2, YES }, // 365 3b
+ { 4, 5, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 487 3c
+ { 4, 5, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 1752 3d
+ { 4, 5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1959 3e
+ { 4, 5, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 2436 3f
+ { 4, 5, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 861 40
+ { 4, 7, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1459 41
+ { 4, 7, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 950 42
+ { 4, 7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 1491 43
+ { 4, 7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0 }, // 879 44
+ { 4, 7, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0 }, // 408 45
+ { 5, 4, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 4870 46
+ { 5, 6, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 359 47
+ { 5, 6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 915 48
+ { 5, 6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0 }, // 412 49
+ { 5, 6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1288 4a
+ { 5, 6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 1591 4b
+ { 5, 6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, YES }, // 361 4c
+ { 5, 6, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0, 0 }, // 623 4d
+ { 5, 8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0 }, // 1239 4e
+ { 6, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 457 4f
+ { 6, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 606 50
+ { 6, 4, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, YES }, // 1073 51
+ { 6, 4, 1, 1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, YES }, // 508 52
+ { 6, 6, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 330 53
+ { 6, 6, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 1709 54
+ { 6, 7, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 1164 55
+ { 7, 4, 1, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, // 556 56
+ { 7, 5, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, YES }, // 529 57
+ { 7, 5, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, YES }, // 1423 58
+ { 7, 8, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, YES }, // 2455 59
+ { 7, 8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 956 5a
+ { 7, 8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, YES }, // 1399 5b
+ { 7, 8, 2, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, YES }, // 587 5c
+ { 7, 10, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 1, YES }, // 743 5d
+ { 7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0 }, // 1004 5e
+ { 7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, YES }, // 487 5f
+ { 7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0 }, // 337 60
+ { 7, 10, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 3, 0, YES }, // 361 61
+ { 8, 3, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, // 560 62
+ { 8, 6, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 1377 63
+ { 9, 4, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, // 877 64
+ { 9, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0 }, // 3041 65
+ { 9, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, YES }, // 349 66
+ { 10, 5, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, // 2061 67
+ { 10, 5, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0 }, // 577 68
+ { 11, 6, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 1, 0 }, // 1195 69
+ { 12, 5, 1, 1, 0, 1, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0 }, // 491 6a
+ { 13, 8, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 0, YES }, // 627 6b
+ { 13, 8, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 1, 0 }, // 1099 6c
+ { 13, 10, 1, 0, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 6, 1, YES }, // 488 6d
+ { 14, 7, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 574 6e
+ { 16, 7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, YES }, // 1281 6f
+ { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, YES }, // 1881 70
+ { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 339 71
+ { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0 }, // 2594 72
+ { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0 }, // 339 73
+ { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, YES }, // 2107 74
+ { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, YES }, // 2372 75
+ { 16, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 6, 0, YES }, // 1078 76
+ { 16, 7, 2, 0, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, YES }, // 384 77
+ { 16, 9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 4, 1, YES }, // 1541 78
+ { 16, 9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 2, 4, 1, YES }, // 975 79
+ { 19, 7, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, YES }, // 546 7a
+ { 24, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, YES }, // 675 7b
+ { 45, 9, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0 }, // 902 7c
+ { 51, 7, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 0, YES }, // 432 7d
+ { 51, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, YES }, // 361 7e
+ { 51, 7, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11, 0, 0 }, // 703 7f
};
-
bool InfoHdrSmall::isHeaderMatch(const InfoHdr& target) const
{
#ifdef _ASSERTE
@@ -448,7 +471,8 @@ bool InfoHdrSmall::isHeaderMatch(const InfoHdr& target) const
_ASSERTE(target.untrackedCnt != HAS_UNTRACKED &&
target.varPtrTableSize != HAS_VARPTR &&
target.gsCookieOffset != HAS_GS_COOKIE_OFFSET &&
- target.syncStartOffset != HAS_SYNC_OFFSET);
+ target.syncStartOffset != HAS_SYNC_OFFSET &&
+ target.revPInvokeOffset != HAS_REV_PINVOKE_FRAME_OFFSET);
#endif
// compare two InfoHdr's up to but not including the untrackCnt field
@@ -470,7 +494,13 @@ bool InfoHdrSmall::isHeaderMatch(const InfoHdr& target) const
if (target.gsCookieOffset != INVALID_GS_COOKIE_OFFSET)
return false;
- return target.syncStartOffset == INVALID_SYNC_OFFSET;
+ if (target.syncStartOffset != INVALID_SYNC_OFFSET)
+ return false;
+
+ if (target.revPInvokeOffset!= INVALID_REV_PINVOKE_OFFSET)
+ return false;
+
+ return true;
}
@@ -503,7 +533,7 @@ const unsigned callCommonDelta[4] = { 6,8,10,12 };
* EDI = 0x1, ESI = 0x2, EBX = 0x4, EBP = 0x8
*
*/
-const unsigned callPatternTable[80] = { // # of occurances
+const unsigned callPatternTable[80] = { // # of occurences
0x0a000200, // 30109
0x0c000200, // 22970
0x0c000201, // 19005
diff --git a/src/inc/gcdump.h b/src/inc/gcdump.h
index cd73940ded..3271ca1d6b 100644
--- a/src/inc/gcdump.h
+++ b/src/inc/gcdump.h
@@ -45,7 +45,7 @@ public:
* Return value : Size in bytes of the header encoding
*/
- unsigned FASTCALL DumpInfoHdr (PTR_CBYTE gcInfoBlock,
+ unsigned FASTCALL DumpInfoHdr (PTR_CBYTE gcInfoBlock,
InfoHdr * header, /* OUT */
unsigned * methodSize, /* OUT */
bool verifyGCTables = false);
@@ -53,7 +53,7 @@ public:
/*-------------------------------------------------------------------------
* Dumps the GC tables to 'stdout'
- * table : The GCInfoToken
+ * gcInfoBlock : Start of the GC info block
* verifyGCTables : If the JIT has been compiled with VERIFY_GC_TABLES
* Return value : Size in bytes of the GC table encodings
*/
@@ -70,10 +70,10 @@ public:
* verifyGCTables : If the JIT has been compiled with VERIFY_GC_TABLES
*/
- void FASTCALL DumpPtrsInFrame(PTR_CBYTE infoBlock,
- PTR_CBYTE codeBlock,
- unsigned offs,
- bool verifyGCTables = false);
+ void FASTCALL DumpPtrsInFrame(PTR_CBYTE gcInfoBlock,
+ PTR_CBYTE codeBlock,
+ unsigned offs,
+ bool verifyGCTables = false);
public:
diff --git a/src/inc/gcinfo.h b/src/inc/gcinfo.h
index 8d249a38a6..e5537e0526 100644
--- a/src/inc/gcinfo.h
+++ b/src/inc/gcinfo.h
@@ -32,15 +32,21 @@ const unsigned this_OFFSET_FLAG = 0x2; // the offset is "this"
// The current GCInfo Version
//-----------------------------------------------------------------------------
-#ifdef _TARGET_X86_
-// X86 GcInfo encoding is yet to be changed.
-#define GCINFO_VERSION 1
-#else
#define GCINFO_VERSION 2
-#endif // _TARGET_X86_
#define MIN_GCINFO_VERSION_WITH_RETURN_KIND 2
#define MIN_GCINFO_VERSION_WITH_REV_PINVOKE_FRAME 2
+
+inline BOOL GCInfoEncodesReturnKind(UINT32 version=GCINFO_VERSION)
+{
+ return version >= MIN_GCINFO_VERSION_WITH_RETURN_KIND;
+}
+
+inline BOOL GCInfoEncodesRevPInvokeFrame(UINT32 version=GCINFO_VERSION)
+{
+ return version >= MIN_GCINFO_VERSION_WITH_REV_PINVOKE_FRAME;
+}
+
//-----------------------------------------------------------------------------
// GCInfoToken: A wrapper that contains the GcInfo data and version number.
//
@@ -62,11 +68,11 @@ struct GCInfoToken
BOOL IsReturnKindAvailable()
{
- return (Version >= MIN_GCINFO_VERSION_WITH_RETURN_KIND);
+ return GCInfoEncodesReturnKind(Version);
}
BOOL IsReversePInvokeFrameAvailable()
{
- return (Version >= MIN_GCINFO_VERSION_WITH_REV_PINVOKE_FRAME);
+ return GCInfoEncodesRevPInvokeFrame(Version);
}
static UINT32 ReadyToRunVersionToGcInfoVersion(UINT32 readyToRunMajorVersion)
diff --git a/src/inc/gcinfodecoder.h b/src/inc/gcinfodecoder.h
index c77c3598b0..6d4850ad67 100644
--- a/src/inc/gcinfodecoder.h
+++ b/src/inc/gcinfodecoder.h
@@ -11,16 +11,47 @@
#ifndef _GC_INFO_DECODER_
#define _GC_INFO_DECODER_
-#include "gcinfotypes.h"
-
#define _max(a, b) (((a) > (b)) ? (a) : (b))
#define _min(a, b) (((a) < (b)) ? (a) : (b))
-#ifndef GCINFODECODER_NO_EE
+#if !defined(_TARGET_X86_)
+#define USE_GC_INFO_DECODER
+#endif
+
+#if !defined(GCINFODECODER_NO_EE)
#include "eetwain.h"
-#else // GCINFODECODER_NO_EE
+#else
+
+#ifdef FEATURE_REDHAWK
+
+typedef ArrayDPTR(const uint8_t) PTR_CBYTE;
+
+#define LIMITED_METHOD_CONTRACT
+#define SUPPORTS_DAC
+
+#define LOG(x)
+#define LOG_PIPTR(pObjRef, gcFlags, hCallBack)
+#define DAC_ARG(x)
+
+#define VALIDATE_ROOT(isInterior, hCallBack, pObjRef)
+
+#define _ASSERTE(x) assert(x)
+
+#define UINT32 UInt32
+#define INT32 Int32
+#define UINT16 UInt16
+#define UINT UInt32
+#define SIZE_T UIntNative
+#define SSIZE_T IntNative
+#define LPVOID void*
+
+typedef void * OBJECTREF;
+
+#define GET_CALLER_SP(pREGDISPLAY) ((TADDR)0)
+
+#else // FEATURE_REDHAWK
// Stuff from cgencpu.h:
@@ -112,11 +143,17 @@ inline BOOL IS_ALIGNED( void* val, size_t alignment )
#ifndef _EETWAIN_H
typedef void (*GCEnumCallback)(
- LPVOID hCallback, // callback data
+ void * hCallback, // callback data
OBJECTREF* pObject, // address of obect-reference we are reporting
uint32_t flags // is this a pinned and/or interior pointer
);
+#endif // !_EETWAIN_H
+
+#include "regdisp.h"
+
+#endif // FEATURE_REDHAWK
+
#ifndef _strike_h
enum ICodeManagerFlags
@@ -135,16 +172,9 @@ enum ICodeManagerFlags
#endif // !_strike_h
-#if !defined(_TARGET_X86_)
-#define USE_GC_INFO_DECODER
-#endif
-
-#include "regdisp.h"
-
-#endif // !_EETWAIN_H
-
#endif // GCINFODECODER_NO_EE
+
#include "gcinfotypes.h"
#ifdef _DEBUG
@@ -153,10 +183,6 @@ enum ICodeManagerFlags
#define MAX_PREDECODED_SLOTS 64
#endif
-#if defined(FEATURE_PAL) && !defined(STATIC_CONTRACT_SUPPORTS_DAC_HOST_ONLY)
-#define STATIC_CONTRACT_SUPPORTS_DAC_HOST_ONLY
-#endif
-
enum GcInfoDecoderFlags
@@ -286,8 +312,6 @@ public:
__forceinline void SetCurrentPos( size_t pos )
{
- STATIC_CONTRACT_SUPPORTS_DAC_HOST_ONLY; // note: this will set only the host instance, not the target instance
-
size_t adjPos = pos + m_InitialRelPos;
m_pCurrent = m_pBuffer + adjPos / BITS_PER_SIZE_T;
m_RelPos = (int)(adjPos % BITS_PER_SIZE_T);
@@ -431,7 +455,7 @@ class GcInfoDecoder
{
public:
- // If you are not insterested in interruptibility or gc lifetime information, pass 0 as instructionOffset
+ // If you are not interested in interruptibility or gc lifetime information, pass 0 as instructionOffset
GcInfoDecoder(
GCInfoToken gcInfoToken,
GcInfoDecoderFlags flags = DECODE_EVERYTHING,
@@ -448,16 +472,16 @@ public:
// This is used for gccoverage
bool IsSafePoint(UINT32 codeOffset);
- typedef void EnumerateSafePointsCallback (UINT32 offset, LPVOID hCallback);
- void EnumerateSafePoints(EnumerateSafePointsCallback *pCallback, LPVOID hCallback);
+ typedef void EnumerateSafePointsCallback (UINT32 offset, void * hCallback);
+ void EnumerateSafePoints(EnumerateSafePointsCallback * pCallback, void * hCallback);
#endif
// Returns true to stop enumerating.
- typedef bool EnumerateInterruptibleRangesCallback (UINT32 startOffset, UINT32 stopOffset, LPVOID hCallback);
+ typedef bool EnumerateInterruptibleRangesCallback (UINT32 startOffset, UINT32 stopOffset, void * hCallback);
void EnumerateInterruptibleRanges (
EnumerateInterruptibleRangesCallback *pCallback,
- LPVOID hCallback);
+ void * hCallback);
//------------------------------------------------------------------------
// GC lifetime information
@@ -468,7 +492,7 @@ public:
bool reportScratchSlots,
unsigned flags,
GCEnumCallback pCallBack,
- LPVOID hCallBack
+ void * hCallBack
);
// Public for the gc info dumper
@@ -476,7 +500,7 @@ public:
PREGDISPLAY pRD,
unsigned flags,
GCEnumCallback pCallBack,
- LPVOID hCallBack
+ void * hCallBack
);
//------------------------------------------------------------------------
@@ -490,7 +514,7 @@ public:
UINT32 GetPrologSize();
INT32 GetPSPSymStackSlot();
INT32 GetGenericsInstContextStackSlot();
- INT32 GetReversePInvokeStackSlot();
+ INT32 GetReversePInvokeFrameStackSlot();
bool HasMethodDescGenericsInstContext();
bool HasMethodTableGenericsInstContext();
bool GetIsVarArg();
@@ -518,7 +542,7 @@ private:
bool m_WantsReportOnlyLeaf;
INT32 m_SecurityObjectStackSlot;
INT32 m_GSCookieStackSlot;
- INT32 m_ReversePInvokeStackSlot;
+ INT32 m_ReversePInvokeFrameStackSlot;
UINT32 m_ValidRangeStart;
UINT32 m_ValidRangeEnd;
INT32 m_PSPSymStackSlot;
@@ -526,7 +550,6 @@ private:
UINT32 m_CodeLength;
UINT32 m_StackBaseRegister;
UINT32 m_SizeOfEditAndContinuePreservedArea;
- INT32 m_ReversePInvokeFrameSlot;
ReturnKind m_ReturnKind;
#ifdef PARTIALLY_INTERRUPTIBLE_GC_SUPPORTED
UINT32 m_NumSafePoints;
@@ -545,7 +568,7 @@ private:
#endif
UINT32 m_Version;
- static bool SetIsInterruptibleCB (UINT32 startOffset, UINT32 stopOffset, LPVOID hCallback);
+ static bool SetIsInterruptibleCB (UINT32 startOffset, UINT32 stopOffset, void * hCallback);
OBJECTREF* GetRegisterSlot(
int regNum,
@@ -577,7 +600,7 @@ private:
PREGDISPLAY pRD,
unsigned flags,
GCEnumCallback pCallBack,
- LPVOID hCallBack
+ void * hCallBack
);
void ReportRegisterToGC(
@@ -586,7 +609,7 @@ private:
PREGDISPLAY pRD,
unsigned flags,
GCEnumCallback pCallBack,
- LPVOID hCallBack
+ void * hCallBack
);
void ReportStackSlotToGC(
@@ -596,7 +619,7 @@ private:
PREGDISPLAY pRD,
unsigned flags,
GCEnumCallback pCallBack,
- LPVOID hCallBack
+ void * hCallBack
);
@@ -607,7 +630,7 @@ private:
bool reportScratchSlots,
unsigned inputFlags,
GCEnumCallback pCallBack,
- LPVOID hCallBack
+ void * hCallBack
)
{
_ASSERTE(slotIndex < slotDecoder.GetNumSlots());
diff --git a/src/inc/gcinfoencoder.h b/src/inc/gcinfoencoder.h
index 838f1babf7..d09f43058f 100644
--- a/src/inc/gcinfoencoder.h
+++ b/src/inc/gcinfoencoder.h
@@ -100,6 +100,11 @@
#include "gcinfotypes.h"
+// As stated in issue #6008, GcInfoSize should be incorporated into debug builds.
+#ifdef _DEBUG
+#define MEASURE_GCINFO
+#endif
+
#ifdef MEASURE_GCINFO
struct GcInfoSize
{
@@ -110,10 +115,13 @@ struct GcInfoSize
size_t NumRanges;
size_t NumRegs;
size_t NumStack;
- size_t NumEh;
+ size_t NumUntracked;
size_t NumTransitions;
size_t SizeOfCode;
+ size_t EncPreservedSlots;
+ size_t UntrackedSlotSize;
+ size_t NumUntrackedSize;
size_t FlagsSize;
size_t RetKindSize;
size_t CodeLengthSize;
@@ -134,7 +142,6 @@ struct GcInfoSize
size_t RegSlotSize;
size_t StackSlotSize;
size_t CallSiteStateSize;
- size_t NumEhSize;
size_t EhPosSize;
size_t EhStateSize;
size_t ChunkPtrSize;
diff --git a/src/inc/gcinfotypes.h b/src/inc/gcinfotypes.h
index cd19759634..c802d97ec6 100644
--- a/src/inc/gcinfotypes.h
+++ b/src/inc/gcinfotypes.h
@@ -6,49 +6,15 @@
#ifndef __GCINFOTYPES_H__
#define __GCINFOTYPES_H__
+#ifndef FEATURE_REDHAWK
#include "gcinfo.h"
+#endif
-// 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)
@@ -376,12 +342,17 @@ enum infoHdrAdjustConstants {
SET_PROLOGSIZE_MAX = 16,
SET_EPILOGSIZE_MAX = 10, // Change to 6
SET_EPILOGCNT_MAX = 4,
- SET_UNTRACKED_MAX = 3
+ SET_UNTRACKED_MAX = 3,
+ SET_RET_KIND_MAX = 4, // 2 bits for ReturnKind
+ ADJ_ENCODING_MAX = 0x7f, // Maximum valid encoding in a byte
+ // Also used to mask off next bit from each encoding byte.
+ MORE_BYTES_TO_FOLLOW = 0x80 // If the High-bit of a header or adjustment byte
+ // is set, then there are more adjustments to follow.
};
//
-// Enum to define the 128 codes that are used to incrementally adjust the InfoHdr structure
-//
+// Enum to define codes that are used to incrementally adjust the InfoHdr structure.
+// First set of opcodes
enum infoHdrAdjust {
SET_FRAMESIZE = 0, // 0x00
@@ -412,18 +383,25 @@ enum infoHdrAdjust {
FLIP_SYNC, // 0x4B
FLIP_HAS_GENERICS_CONTEXT,// 0x4C
FLIP_GENERICS_CONTEXT_IS_METHODDESC,// 0x4D
+ FLIP_REV_PINVOKE_FRAME, // 0x4E
+ NEXT_OPCODE, // 0x4F -- see next Adjustment enumeration
+ NEXT_FOUR_START = 0x50,
+ NEXT_FOUR_FRAMESIZE = 0x50,
+ NEXT_FOUR_ARGCOUNT = 0x60,
+ NEXT_THREE_PROLOGSIZE = 0x70,
+ NEXT_THREE_EPILOGSIZE = 0x78
+};
- // 0x4E .. 0x4f unused
-
- NEXT_FOUR_START = 0x50,
- NEXT_FOUR_FRAMESIZE = 0x50,
- NEXT_FOUR_ARGCOUNT = 0x60,
- NEXT_THREE_PROLOGSIZE = 0x70,
- NEXT_THREE_EPILOGSIZE = 0x78
+// Second set of opcodes, when first code is 0x4F
+enum infoHdrAdjust2 {
+ SET_RETURNKIND = 0, // 0x00-SET_RET_KIND_MAX Set ReturnKind to value
};
#define HAS_UNTRACKED ((unsigned int) -1)
#define HAS_VARPTR ((unsigned int) -1)
+
+#define INVALID_REV_PINVOKE_OFFSET 0
+#define HAS_REV_PINVOKE_FRAME_OFFSET ((unsigned int) -1)
// 0 is not a valid offset for EBP-frames as all locals are at a negative offset
// For ESP frames, the cookie is above (at a higher address than) the buffers,
// and so cannot be at offset 0.
@@ -463,6 +441,7 @@ struct InfoHdrSmall {
unsigned char profCallbacks : 1; // 4 [0]
unsigned char genericsContext : 1;//4 [1] function reports a generics context parameter is present
unsigned char genericsContextIsMethodDesc : 1;//4[2]
+ unsigned char returnKind : 2; // 4 [4] Available GcInfo v2 onwards, previously undefined
unsigned short argCount; // 5,6 in bytes
unsigned int frameSize; // 7,8,9,10 in bytes
unsigned int untrackedCnt; // 11,12,13,14
@@ -483,8 +462,8 @@ struct InfoHdr : public InfoHdrSmall {
unsigned int gsCookieOffset; // 19,20,21,22
unsigned int syncStartOffset; // 23,24,25,26
unsigned int syncEndOffset; // 27,28,29,30
-
- // 31 bytes total
+ unsigned int revPInvokeOffset; // 31,32,33,34 Available GcInfo v2 onwards, previously undefined
+ // 35 bytes total
// Checks whether "this" is compatible with "target".
// It is not an exact bit match as "this" could have some
@@ -498,7 +477,8 @@ struct InfoHdr : public InfoHdrSmall {
_ASSERTE(target.untrackedCnt != HAS_UNTRACKED &&
target.varPtrTableSize != HAS_VARPTR &&
target.gsCookieOffset != HAS_GS_COOKIE_OFFSET &&
- target.syncStartOffset != HAS_SYNC_OFFSET);
+ target.syncStartOffset != HAS_SYNC_OFFSET &&
+ target.revPInvokeOffset != HAS_REV_PINVOKE_FRAME_OFFSET);
#endif
// compare two InfoHdr's up to but not including the untrackCnt field
@@ -525,6 +505,10 @@ struct InfoHdr : public InfoHdrSmall {
(target.syncStartOffset == INVALID_SYNC_OFFSET))
return false;
+ if ((revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET) !=
+ (target.revPInvokeOffset == INVALID_REV_PINVOKE_OFFSET))
+ return false;
+
return true;
}
};
@@ -551,15 +535,16 @@ inline void GetInfoHdr(int index, InfoHdr * header)
{
*((InfoHdrSmall *)header) = infoHdrShortcut[index];
- header->gsCookieOffset = 0;
- header->syncStartOffset = 0;
- header->syncEndOffset = 0;
+ header->gsCookieOffset = INVALID_GS_COOKIE_OFFSET;
+ header->syncStartOffset = INVALID_SYNC_OFFSET;
+ header->syncEndOffset = INVALID_SYNC_OFFSET;
+ header->revPInvokeOffset = INVALID_REV_PINVOKE_OFFSET;
}
-PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, InfoHdr* header);
+PTR_CBYTE FASTCALL decodeHeader(PTR_CBYTE table, UINT32 version, InfoHdr* header);
BYTE FASTCALL encodeHeaderFirst(const InfoHdr& header, InfoHdr* state, int* more, int *pCached);
-BYTE FASTCALL encodeHeaderNext(const InfoHdr& header, InfoHdr* state);
+BYTE FASTCALL encodeHeaderNext(const InfoHdr& header, InfoHdr* state, BYTE &codeSet);
size_t FASTCALL decodeUnsigned(PTR_CBYTE src, unsigned* value);
size_t FASTCALL decodeUDelta(PTR_CBYTE src, unsigned* value, unsigned lastValue);
diff --git a/src/inc/jithelpers.h b/src/inc/jithelpers.h
index 8a719927e5..f84db9142d 100644
--- a/src/inc/jithelpers.h
+++ b/src/inc/jithelpers.h
@@ -302,15 +302,16 @@
JITHELPER(CORINFO_HELP_VIRTUAL_FUNC_PTR, JIT_VirtualFunctionPointer, CORINFO_HELP_SIG_4_STACK)
//JITHELPER(CORINFO_HELP_VIRTUAL_FUNC_PTR_LOG,JIT_VirtualFunctionPointerLogging)
- JITHELPER(CORINFO_HELP_READYTORUN_NEW, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
- JITHELPER(CORINFO_HELP_READYTORUN_NEWARR_1, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
- JITHELPER(CORINFO_HELP_READYTORUN_ISINSTANCEOF, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
- JITHELPER(CORINFO_HELP_READYTORUN_CHKCAST, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
- JITHELPER(CORINFO_HELP_READYTORUN_STATIC_BASE, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
- JITHELPER(CORINFO_HELP_READYTORUN_VIRTUAL_FUNC_PTR, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
+ JITHELPER(CORINFO_HELP_READYTORUN_NEW, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
+ JITHELPER(CORINFO_HELP_READYTORUN_NEWARR_1, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
+ JITHELPER(CORINFO_HELP_READYTORUN_ISINSTANCEOF, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
+ JITHELPER(CORINFO_HELP_READYTORUN_CHKCAST, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
+ JITHELPER(CORINFO_HELP_READYTORUN_STATIC_BASE, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
+ JITHELPER(CORINFO_HELP_READYTORUN_VIRTUAL_FUNC_PTR, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
#if COR_JIT_EE_VERSION > 460
- JITHELPER(CORINFO_HELP_READYTORUN_GENERIC_HANDLE, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
- JITHELPER(CORINFO_HELP_READYTORUN_DELEGATE_CTOR, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
+ JITHELPER(CORINFO_HELP_READYTORUN_GENERIC_HANDLE, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
+ JITHELPER(CORINFO_HELP_READYTORUN_DELEGATE_CTOR, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
+ JITHELPER(CORINFO_HELP_READYTORUN_GENERIC_STATIC_BASE, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB)
#endif // COR_JIT_EE_VERSION
JITHELPER(CORINFO_HELP_EE_PRESTUB, ThePreStub, CORINFO_HELP_SIG_NO_ALIGN_STUB)
diff --git a/src/inc/livedatatarget.h b/src/inc/livedatatarget.h
index 7282dd4be1..1ffbca7d78 100644
--- a/src/inc/livedatatarget.h
+++ b/src/inc/livedatatarget.h
@@ -14,6 +14,7 @@
// Does not include IXClrData definitions.
#include <clrdata.h>
+#ifndef FEATURE_PAL
//---------------------------------------------------------------------------------------
//
@@ -100,6 +101,7 @@ private:
CLRDATA_ADDRESS m_baseAddressOfEngine;
};
+#endif // FEATURE_PAL
#endif // _LIVEPROC_DATATARGET_H_
diff --git a/src/inc/longfilepathwrappers.h b/src/inc/longfilepathwrappers.h
index a847988935..a0ffe38da5 100644
--- a/src/inc/longfilepathwrappers.h
+++ b/src/inc/longfilepathwrappers.h
@@ -124,18 +124,18 @@ GetLongPathNameWrapper(
SString& lpszLongPath
);
-UINT GetTempFileNameWrapper(
+UINT WINAPI GetTempFileNameWrapper(
_In_ LPCTSTR lpPathName,
_In_ LPCTSTR lpPrefixString,
_In_ UINT uUnique,
SString& lpTempFileName
);
-DWORD GetTempPathWrapper(
+DWORD WINAPI GetTempPathWrapper(
SString& lpBuffer
);
-DWORD GetCurrentDirectoryWrapper(
+DWORD WINAPI GetCurrentDirectoryWrapper(
SString& lpBuffer
);
@@ -145,7 +145,7 @@ GetModuleFileNameWrapper(
SString& buffer
);
-DWORD GetEnvironmentVariableWrapper(
+DWORD WINAPI GetEnvironmentVariableWrapper(
_In_opt_ LPCTSTR lpName,
_Out_opt_ SString& lpBuffer
);
diff --git a/src/inc/shash.inl b/src/inc/shash.inl
index 72affb45ba..f48899a588 100644
--- a/src/inc/shash.inl
+++ b/src/inc/shash.inl
@@ -22,8 +22,8 @@ SHash<TRAITS>::SHash()
LIMITED_METHOD_CONTRACT;
#ifndef __GNUC__ // these crash GCC
- static_assert_no_msg(s_growth_factor_numerator > s_growth_factor_denominator);
- static_assert_no_msg(s_density_factor_numerator < s_density_factor_denominator);
+ static_assert_no_msg(SHash<TRAITS>::s_growth_factor_numerator > SHash<TRAITS>::s_growth_factor_denominator);
+ static_assert_no_msg(SHash<TRAITS>::s_density_factor_numerator < SHash<TRAITS>::s_density_factor_denominator);
#endif
}
diff --git a/src/inc/sortversioning.h b/src/inc/sortversioning.h
index 7bc01c67f2..fe3e878802 100644
--- a/src/inc/sortversioning.h
+++ b/src/inc/sortversioning.h
@@ -107,7 +107,7 @@ namespace SortVersioning
PSORTHANDLE GetSortHandle(__in LPCWSTR lpLocaleName, __in_opt CONST NLSVERSIONINFO * pVersion);
- int SortCompareString(__in LPCWSTR lpLocaleName,
+ int WINAPI SortCompareString(__in LPCWSTR lpLocaleName,
__in DWORD dwCmpFlags,
__in_ecount(cchCount1) LPCWSTR lpString1,
__in int cchCount1,
@@ -137,7 +137,7 @@ namespace SortVersioning
__reserved LPVOID lpReserved,
__reserved LPARAM lParam );
- __success(return != 0) int SortDllChangeCase(
+ __success(return != 0) int WINAPI SortDllChangeCase(
__in PSORTHANDLE pSort,
__in DWORD dwFlags,
__in_ecount(cchSrc) LPCWSTR pSrc,
@@ -147,7 +147,7 @@ namespace SortVersioning
__in_opt LPVOID lpReserved,
__in_opt LPARAM lParam );
- __success(return != 0) int SortDllGetSortKey(
+ __success(return != 0) int WINAPI SortDllGetSortKey(
__in PSORTHANDLE pSort,
__in DWORD dwFlags,
__in_ecount(cchSrc) LPCWSTR pSrc,
@@ -157,7 +157,7 @@ namespace SortVersioning
__in_opt LPVOID lpReserved,
__in_opt LPARAM lParam );
- int SortFindString(__in LPCWSTR lpLocaleName,
+ int WINAPI SortFindString(__in LPCWSTR lpLocaleName,
__in DWORD dwFindNLSStringFlags,
__in_ecount(cchSource) LPCWSTR lpStringSource,
__in int cchSource,
@@ -168,7 +168,7 @@ namespace SortVersioning
__reserved LPVOID lpReserved,
__reserved LPARAM lParam);
- __success(return != 0) int SortDllFindString(
+ __success(return != 0) int WINAPI SortDllFindString(
__in PSORTHANDLE pSort,
__in DWORD dwFindNLSStringFlags,
__in_ecount(cchSource) LPCWSTR lpStringSource,
@@ -179,7 +179,7 @@ namespace SortVersioning
__in_opt LPVOID lpReserved,
__in_opt LPARAM lParam);
- BOOL SortIsDefinedString(__in NLS_FUNCTION Function,
+ BOOL WINAPI SortIsDefinedString(__in NLS_FUNCTION Function,
__in DWORD dwFlags,
__in_opt CONST NLSVERSIONINFOEX * lpVersionInfo,
__in LPCWSTR lpString,
diff --git a/src/inc/stacktrace.h b/src/inc/stacktrace.h
index 83646c85ef..49e951780c 100644
--- a/src/inc/stacktrace.h
+++ b/src/inc/stacktrace.h
@@ -74,7 +74,7 @@ void GetStringFromStackLevels(UINT ifrStart, UINT cfrTotal, __out_ecount(cchMaxA
******************************************************************** robch */
void GetStringFromAddr(DWORD_PTR dwAddr, __out_ecount(cchMaxAssertStackLevelStringLen) LPSTR szString);
-#if defined(_TARGET_X86_) && defined(FEATURE_CORECLR)
+#if defined(_TARGET_X86_) && defined(FEATURE_CORECLR) && !defined(FEATURE_PAL)
/****************************************************************************
* ClrCaptureContext *
*-------------------*
@@ -83,9 +83,9 @@ void GetStringFromAddr(DWORD_PTR dwAddr, __out_ecount(cchMaxAssertStackLevelStri
* support this, so we need it for CoreCLR 4, if we require Win2K support
****************************************************************************/
extern "C" void __stdcall ClrCaptureContext(__out PCONTEXT ctx);
-#else // _TARGET_X86_ && FEATURE_CORECLR
+#else // _TARGET_X86_ && FEATURE_CORECLR && !FEATURE_PAL
#define ClrCaptureContext RtlCaptureContext
-#endif // _X86 && FEATURE_CORECLR else
+#endif // _TARGET_X86_ && FEATURE_CORECLR && !FEATURE_PAL
#endif
diff --git a/src/inc/stresslog.h b/src/inc/stresslog.h
index 86dee130c4..55fb27a56d 100644
--- a/src/inc/stresslog.h
+++ b/src/inc/stresslog.h
@@ -683,7 +683,7 @@ public:
static const char* gcRootPromoteMsg()
{
STATIC_CONTRACT_LEAF;
- return " GCHeap::Promote: Promote GC Root *%p = %p MT = %pT\n";
+ return " IGCHeap::Promote: Promote GC Root *%p = %p MT = %pT\n";
}
static const char* gcPlugMoveMsg()
diff --git a/src/inc/utilcode.h b/src/inc/utilcode.h
index c519e8b872..a1a083638b 100644
--- a/src/inc/utilcode.h
+++ b/src/inc/utilcode.h
@@ -134,6 +134,17 @@ inline TADDR PCODEToPINSTR(PCODE pc)
#endif
}
+// Convert from a PINSTR to the corresponding PCODE. On many architectures this will be the identity function;
+// on ARM, this will raise the THUMB bit.
+inline PCODE PINSTRToPCODE(TADDR addr)
+{
+#ifdef _TARGET_ARM_
+ return DataPointerToThumbCode<PCODE,TADDR>(addr);
+#else
+ return dac_cast<PCODE>(addr);
+#endif
+}
+
typedef LPCSTR LPCUTF8;
typedef LPSTR LPUTF8;
@@ -3389,7 +3400,7 @@ public:
m_iSize = iBuckets + 7;
}
- ~CClosedHashBase()
+ virtual ~CClosedHashBase()
{
WRAPPER_NO_CONTRACT;
Clear();
@@ -5170,6 +5181,11 @@ template<class T> void DeleteExecutable(T *p)
INDEBUG(BOOL DbgIsExecutable(LPVOID lpMem, SIZE_T length);)
+BOOL NoGuiOnAssert();
+#ifdef _DEBUG
+VOID TerminateOnAssert();
+#endif // _DEBUG
+
class HighCharHelper {
public:
static inline BOOL IsHighChar(int c) {
@@ -5750,4 +5766,6 @@ extern SpinConstants g_SpinConstants;
// ======================================================================================
+void* __stdcall GetCLRFunction(LPCSTR FunctionName);
+
#endif // __UtilCode_h__
diff --git a/src/inc/winwrap.h b/src/inc/winwrap.h
index 91a71b700b..4a012d3726 100644
--- a/src/inc/winwrap.h
+++ b/src/inc/winwrap.h
@@ -86,8 +86,6 @@
#undef lstrcmp
#undef lstrcmpi
#undef lstrcpyn
-#undef lstrcpy
-#undef lstrcat
#undef lstrlen
#undef CreateMutex
#undef OpenMutex
@@ -222,7 +220,6 @@
// winuser.h
#undef MAKEINTRESOURCE
#undef wvsprintf
-#undef wsprintf
#undef LoadKeyboardLayout
#undef GetKeyboardLayoutName
#undef CreateDesktop
@@ -395,8 +392,6 @@
#define WszQueryRecoveryAgents QueryRecoveryAgentsW
#define Wszlstrcmp lstrcmpW
#define Wszlstrcmpi lstrcmpiW
-#define Wszlstrcpy lstrcpyW
-#define Wszlstrcat lstrcatW
#define WszCreateMutex CreateMutexW
#define WszOpenMutex OpenMutexW
#define WszCreateEvent CreateEventW
@@ -684,8 +679,6 @@
// on win98 and higher
#define Wszlstrlen lstrlenW
-#define Wszlstrcpy lstrcpyW
-#define Wszlstrcat lstrcatW
//File and Directory Functions which need special handling for LongFile Names
//Note only the functions which are currently used are defined
diff --git a/src/inc/xmlparser_i.c b/src/inc/xmlparser_i.cpp
index 33927f651f..33927f651f 100644
--- a/src/inc/xmlparser_i.c
+++ b/src/inc/xmlparser_i.cpp
diff --git a/src/inc/zapper.h b/src/inc/zapper.h
index 2fa94373fa..1018505faa 100644
--- a/src/inc/zapper.h
+++ b/src/inc/zapper.h
@@ -540,7 +540,7 @@ class ZapperOptions
bool m_fNGenLastRetry; // This is retry of the compilation
- unsigned m_compilerFlags;
+ CORJIT_FLAGS m_compilerFlags;
bool m_legacyMode; // true if the zapper was invoked using legacy mode