diff options
Diffstat (limited to 'src/inc')
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 |