diff options
Diffstat (limited to 'src/inc/corinfo.h')
-rw-r--r-- | src/inc/corinfo.h | 149 |
1 files changed, 39 insertions, 110 deletions
diff --git a/src/inc/corinfo.h b/src/inc/corinfo.h index f515fcbd6d..cbc4464e1d 100644 --- a/src/inc/corinfo.h +++ b/src/inc/corinfo.h @@ -149,7 +149,7 @@ The first 4 options are mutially exclusive This last field can modify any of the cases above except CORINFO_FLG_HELPER CORINFO_FLG_STATIC_IN_HEAP This is currently only used for static fields of value classes. If the field has -this set then after computing what would normally be the field, what you actually get is a object poitner +this set then after computing what would normally be the field, what you actually get is a object pointer (that must be reported to the GC) to a boxed version of the value. Thus the actual field address is computed by addr = (*addr+sizeof(OBJECTREF)) @@ -213,52 +213,20 @@ TODO: Talk about initializing strutures before use #define SELECTANY extern __declspec(selectany) #endif -// COR_JIT_EE_VERSION is a #define that specifies a JIT-EE version, but on a less granular basis than the GUID. -// The #define is intended to be used on a per-product basis. That is, for each release that we support a JIT -// CTP build, we'll update the COR_JIT_EE_VERSION. The GUID must change any time any part of the interface changes. -// -// COR_JIT_EE_VERSION is set, by convention, to a number related to the the product number. So, 460 is .NET 4.60. -// 461 would indicate .NET 4.6.1. Etc. -// -// Note that the EE should always build with the most current (highest numbered) version. Only the JIT will -// potentially build with a lower version number. In that case, the COR_JIT_EE_VERSION will be specified in the -// CTP JIT build project, such as ctpjit.nativeproj. - -#if !defined(COR_JIT_EE_VERSION) -#define COR_JIT_EE_VERSION 999999999 // This means we'll take everything in the interface -#endif - -#if COR_JIT_EE_VERSION > 460 - // Update this one -SELECTANY const GUID JITEEVersionIdentifier = { /* 4bd06266-8ef7-4172-bec6-d3149fde7859 */ - 0x4bd06266, - 0x8ef7, - 0x4172, - {0xbe, 0xc6, 0xd3, 0x14, 0x9f, 0xde, 0x78, 0x59} -}; - -#else - -// ************ Leave this one alone *************** -// We need it to build a .NET 4.6 compatible JIT for the RyuJIT CTP releases -SELECTANY const GUID JITEEVersionIdentifier = { /* 9110edd8-8fc3-4e3d-8ac9-12555ff9be9c */ - 0x9110edd8, - 0x8fc3, - 0x4e3d, - { 0x8a, 0xc9, 0x12, 0x55, 0x5f, 0xf9, 0xbe, 0x9c } +SELECTANY const GUID JITEEVersionIdentifier = { /* f00b3f49-ddd2-49be-ba43-6e49ffa66959 */ + 0xf00b3f49, + 0xddd2, + 0x49be, + { 0xba, 0x43, 0x6e, 0x49, 0xff, 0xa6, 0x69, 0x59 } }; -#endif - ////////////////////////////////////////////////////////////////////////////////////////////////////////// // // END JITEEVersionIdentifier // ////////////////////////////////////////////////////////////////////////////////////////////////////////// -#if COR_JIT_EE_VERSION > 460 - // For System V on the CLR type system number of registers to pass in and return a struct is the same. // The CLR type system allows only up to 2 eightbytes to be passed in registers. There is no SSEUP classification types. #define CLR_SYSTEMV_MAX_EIGHTBYTES_COUNT_TO_PASS_IN_REGISTERS 2 @@ -381,8 +349,6 @@ private: } }; -#endif // COR_JIT_EE_VERSION - // CorInfoHelpFunc defines the set of helpers (accessed via the ICorDynamicInfo::getHelperFtn()) // These helpers can be called by native code which executes in the runtime. // Compilers can emit calls to these helpers. @@ -433,9 +399,7 @@ enum CorInfoHelpFunc CORINFO_HELP_NEWSFAST, // allocator for small, non-finalizer, non-array object CORINFO_HELP_NEWSFAST_ALIGN8, // allocator for small, non-finalizer, non-array object, 8 byte aligned CORINFO_HELP_NEW_MDARR, // multi-dim array helper (with or without lower bounds - dimensions passed in as vararg) -#if COR_JIT_EE_VERSION > 460 CORINFO_HELP_NEW_MDARR_NONVARARG,// multi-dim array helper (with or without lower bounds - dimensions passed in as unmanaged array) -#endif CORINFO_HELP_NEWARR_1_DIRECT, // helper for any one dimensional array creation CORINFO_HELP_NEWARR_1_OBJ, // optimized 1-D object arrays CORINFO_HELP_NEWARR_1_VC, // optimized 1-D value class arrays @@ -481,9 +445,7 @@ enum CorInfoHelpFunc CORINFO_HELP_RNGCHKFAIL, // array bounds check failed CORINFO_HELP_OVERFLOW, // throw an overflow exception CORINFO_HELP_THROWDIVZERO, // throw a divide by zero exception -#if COR_JIT_EE_VERSION > 460 CORINFO_HELP_THROWNULLREF, // throw a null reference exception -#endif // COR_JIT_EE_VERSION CORINFO_HELP_INTERNALTHROW, // Support for really fast jit CORINFO_HELP_VERIFICATION, // Throw a VerificationException @@ -639,13 +601,9 @@ enum CorInfoHelpFunc CORINFO_HELP_READYTORUN_CHKCAST, CORINFO_HELP_READYTORUN_STATIC_BASE, CORINFO_HELP_READYTORUN_VIRTUAL_FUNC_PTR, -#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 CORINFO_HELP_EE_PRESTUB, // Not real JIT helper. Used in native images. @@ -682,7 +640,6 @@ enum CorInfoHelpFunc CORINFO_HELP_LOOP_CLONE_CHOICE_ADDR, // Return the reference to a counter to decide to take cloned path in debug stress. CORINFO_HELP_DEBUG_LOG_LOOP_CLONING, // Print a message that a loop cloning optimization has occurred in debug mode. -#if COR_JIT_EE_VERSION > 460 CORINFO_HELP_THROW_ARGUMENTEXCEPTION, // throw ArgumentException CORINFO_HELP_THROW_ARGUMENTOUTOFRANGEEXCEPTION, // throw ArgumentOutOfRangeException @@ -691,7 +648,8 @@ enum CorInfoHelpFunc CORINFO_HELP_JIT_REVERSE_PINVOKE_ENTER, // Transition to cooperative mode in reverse P/Invoke prolog, frame is the first argument CORINFO_HELP_JIT_REVERSE_PINVOKE_EXIT, // Transition to preemptive mode in reverse P/Invoke epilog, frame is the first argument -#endif + + CORINFO_HELP_GVMLOOKUP_FOR_SLOT, // Resolve a generic virtual method target from this pointer and runtime method handle CORINFO_HELP_COUNT, }; @@ -789,6 +747,17 @@ enum CorInfoCallConv CORINFO_CALLCONV_PARAMTYPE = 0x80, // Passed last. Same as CORINFO_GENERICS_CTXT_FROM_PARAMTYPEARG }; +#ifdef UNIX_X86_ABI +inline bool IsCallerPop(CorInfoCallConv callConv) +{ + unsigned int umask = CORINFO_CALLCONV_STDCALL + | CORINFO_CALLCONV_THISCALL + | CORINFO_CALLCONV_FASTCALL; + + return !(callConv & umask); +} +#endif // UNIX_X86_ABI + enum CorInfoUnmanagedCallConv { // These correspond to CorUnmanagedCallingConvention @@ -1309,8 +1278,6 @@ enum CORINFO_RUNTIME_LOOKUP_KIND CORINFO_LOOKUP_CLASSPARAM, }; -#if COR_JIT_EE_VERSION > 460 - struct CORINFO_LOOKUP_KIND { bool needsRuntimeLookup; @@ -1322,16 +1289,6 @@ struct CORINFO_LOOKUP_KIND void * runtimeLookupArgs; } ; -#else - -struct CORINFO_LOOKUP_KIND -{ - bool needsRuntimeLookup; - CORINFO_RUNTIME_LOOKUP_KIND runtimeLookupKind; -} ; - -#endif - // CORINFO_RUNTIME_LOOKUP indicates the details of the runtime lookup // operation to be performed. @@ -1609,10 +1566,11 @@ enum CorInfoTokenKind // token comes from CEE_CONSTRAINED CORINFO_TOKENKIND_Constrained = 0x100 | CORINFO_TOKENKIND_Class, -#if COR_JIT_EE_VERSION > 460 // token comes from CEE_NEWOBJ CORINFO_TOKENKIND_NewObj = 0x200 | CORINFO_TOKENKIND_Method, -#endif + + // token comes from CEE_LDVIRTFTN + CORINFO_TOKENKIND_Ldvirtftn = 0x400 | CORINFO_TOKENKIND_Method, }; struct CORINFO_RESOLVED_TOKEN @@ -1711,12 +1669,11 @@ 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) + CORINFO_FIELD_INTRINSIC_ISLITTLEENDIAN, // intrinsic BitConverter.IsLittleEndian }; // Set of flags returned in CORINFO_FIELD_INFO::fieldFlags @@ -1828,7 +1785,6 @@ struct CORINFO_EE_INFO // Array offsets unsigned offsetOfObjArrayData; -#if COR_JIT_EE_VERSION > 460 // Reverse PInvoke offsets unsigned sizeOfReversePInvokeFrame; @@ -1841,7 +1797,6 @@ struct CORINFO_EE_INFO // Target ABI. Combined with target architecture and OS to determine // GC, EH, and unwind styles. CORINFO_RUNTIME_ABI targetAbi; -#endif CORINFO_OS osType; unsigned osMajor; @@ -1858,18 +1813,6 @@ enum { LCL_FINALLY_MARK = 0xFC }; // FC = "Finally Call" * when it generates code **********************************************************************************/ -#if COR_JIT_EE_VERSION <= 460 - -#define CORINFO_PAGE_SIZE 0x1000 // the page size on the machine - -#ifndef FEATURE_PAL -#define MAX_UNCHECKED_OFFSET_FOR_NULL_OBJECT ((32*1024)-1) // when generating JIT code -#else // !FEATURE_PAL -#define MAX_UNCHECKED_OFFSET_FOR_NULL_OBJECT ((OS_PAGE_SIZE / 2) - 1) -#endif // !FEATURE_PAL - -#endif // COR_JIT_EE_VERISION <= 460 - #include <pshpack4.h> typedef void* CORINFO_MethodPtr; // a generic method pointer @@ -2111,19 +2054,25 @@ public: unsigned* offsetAfterIndirection /* OUT */ ) = 0; + // Find the virtual method in implementingClass that overrides virtualMethod, + // or the method in implementingClass that implements the interface method + // represented by virtualMethod. + // + // Return null if devirtualization is not possible. Owner type is optional + // and provides additional context for shared interface devirtualization. + virtual CORINFO_METHOD_HANDLE resolveVirtualMethod( + CORINFO_METHOD_HANDLE virtualMethod, /* IN */ + CORINFO_CLASS_HANDLE implementingClass, /* IN */ + CORINFO_CONTEXT_HANDLE ownerType = NULL /* IN */ + ) = 0; + // If a method's attributes have (getMethodAttribs) CORINFO_FLG_INTRINSIC set, // getIntrinsicID() returns the intrinsic ID. // *pMustExpand tells whether or not JIT must expand the intrinsic. -#if COR_JIT_EE_VERSION > 460 virtual CorInfoIntrinsics getIntrinsicID( CORINFO_METHOD_HANDLE method, bool* pMustExpand = NULL /* OUT */ ) = 0; -#else - virtual CorInfoIntrinsics getIntrinsicID( - CORINFO_METHOD_HANDLE method - ) = 0; -#endif // Is the given module the System.Numerics.Vectors module? // This defaults to false. @@ -2215,13 +2164,11 @@ public: // failures during token resolution. virtual void resolveToken(/* IN, OUT */ CORINFO_RESOLVED_TOKEN * pResolvedToken) = 0; -#if COR_JIT_EE_VERSION > 460 // Attempt to resolve a metadata token into a runtime method handle. Returns true // if resolution succeeded and false otherwise (e.g. if it encounters invalid metadata // during token reoslution). This method should be used instead of `resolveToken` in // situations that need to be resilient to invalid metadata. virtual bool tryResolveToken(/* IN, OUT */ CORINFO_RESOLVED_TOKEN * pResolvedToken) = 0; -#endif // Signature information about the call sig virtual void findSig ( @@ -2368,7 +2315,7 @@ public: // in representing of 'cls' from a GC perspective. The class is // assumed to be an array of machine words // (of length // getClassSize(cls) / sizeof(void*)), - // 'gcPtrs' is a poitner to an array of BYTEs of this length. + // 'gcPtrs' is a pointer to an array of BYTEs of this length. // getClassGClayout fills in this array so that gcPtrs[i] is set // to one of the CorInfoGCType values which is the GC type of // the i-th machine word of an object of type 'cls' @@ -2440,7 +2387,7 @@ public: // value into a particular location and thus has the signature // void unboxHelper(void* dest, CORINFO_CLASS_HANDLE cls, Object* obj) // Otherwise (it is null or points at a FALSE value) it is requesting - // a helper that returns a poitner to the unboxed data + // a helper that returns a pointer to the unboxed data // void* unboxHelper(CORINFO_CLASS_HANDLE cls, Object* obj) // The EE has the option of NOT returning the copy style helper // (But must be able to always honor the non-copy style helper) @@ -2451,7 +2398,6 @@ public: CORINFO_CLASS_HANDLE cls ) = 0; -#if COR_JIT_EE_VERSION > 460 virtual bool getReadyToRunHelper( CORINFO_RESOLVED_TOKEN * pResolvedToken, CORINFO_LOOKUP_KIND * pGenericLookupKind, @@ -2462,16 +2408,8 @@ public: virtual void getReadyToRunDelegateCtorHelper( CORINFO_RESOLVED_TOKEN * pTargetMethod, CORINFO_CLASS_HANDLE delegateType, - CORINFO_CONST_LOOKUP * pLookup - ) = 0; -#else - virtual void getReadyToRunHelper( - CORINFO_RESOLVED_TOKEN * pResolvedToken, - CorInfoHelpFunc id, - CORINFO_CONST_LOOKUP * pLookup + CORINFO_LOOKUP * pLookup ) = 0; -#endif - virtual const char* getHelperName( CorInfoHelpFunc @@ -2788,7 +2726,6 @@ public: virtual void ThrowExceptionForHelper( const CORINFO_HELPER_DESC * throwHelper) = 0; -#if COR_JIT_EE_VERSION > 460 // Runs the given function under an error trap. This allows the JIT to make calls // to interface functions that may throw exceptions without needing to be aware of // the EH ABI, exception types, etc. Returns true if the given function completed @@ -2797,7 +2734,6 @@ public: void (*function)(void*), // The function to run void* parameter // The context parameter that will be passed to the function and the handler ) = 0; -#endif /***************************************************************************** * ICorStaticInfo contains EE interface methods which return values that are @@ -2849,16 +2785,12 @@ public: size_t FQNameCapacity /* IN */ ) = 0; -#if COR_JIT_EE_VERSION > 460 - // returns whether the struct is enregisterable. Only valid on a System V VM. Returns true on success, false on failure. virtual bool getSystemVAmd64PassStructInRegisterDescriptor( /* IN */ CORINFO_CLASS_HANDLE structHnd, /* OUT */ SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr ) = 0; -#endif // COR_JIT_EE_VERSION - }; /***************************************************************************** @@ -2984,8 +2916,7 @@ public: ) = 0; // NOTE: the two methods below--getPInvokeUnmanagedTarget and getAddressOfPInvokeFixup--are - // deprecated. New code (i.e. anything that can depend on COR_JIT_EE_VERSION being - // greater than 460) should instead use getAddressOfPInvokeTarget, which subsumes the + // deprecated. New code should instead use getAddressOfPInvokeTarget, which subsumes the // functionality of these methods. // return the unmanaged target *if method has already been prelinked.* @@ -3000,14 +2931,12 @@ public: void **ppIndirection = NULL ) = 0; -#if COR_JIT_EE_VERSION > 460 // return the address of the PInvoke target. May be a fixup area in the // case of late-bound PInvoke calls. virtual void getAddressOfPInvokeTarget( CORINFO_METHOD_HANDLE method, CORINFO_CONST_LOOKUP *pLookup ) = 0; -#endif // Generate a cookie based on the signature that would needs to be passed // to CORINFO_HELP_PINVOKE_CALLI |