diff options
author | Jan Kotas <jkotas@microsoft.com> | 2019-05-22 23:42:31 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-05-22 23:42:31 -0700 |
commit | 451fd23fa2179fa22c831bcf84edd547bfba5cd9 (patch) | |
tree | 8d590cd895cce7d5308cf94e92a5b0e8f36d303e | |
parent | 3eae9c02a9a5eac95bf2900aae3c9e62176bf3c9 (diff) | |
download | coreclr-451fd23fa2179fa22c831bcf84edd547bfba5cd9.tar.gz coreclr-451fd23fa2179fa22c831bcf84edd547bfba5cd9.tar.bz2 coreclr-451fd23fa2179fa22c831bcf84edd547bfba5cd9.zip |
Stop compiling fragile NGen support into the runtime (#24625)
38 files changed, 168 insertions, 146 deletions
diff --git a/clrdefinitions.cmake b/clrdefinitions.cmake index b4ccfec6f6..56088ddf3f 100644 --- a/clrdefinitions.cmake +++ b/clrdefinitions.cmake @@ -175,7 +175,6 @@ endif(CLR_CMAKE_PLATFORM_UNIX) if(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_FREEBSD) add_definitions(-DFEATURE_PERFMAP) endif(CLR_CMAKE_PLATFORM_LINUX OR CLR_CMAKE_PLATFORM_FREEBSD) -add_definitions(-DFEATURE_PREJIT) if(NOT CLR_CMAKE_PLATFORM_UNIX) add_definitions(-DFEATURE_PROFAPI_ATTACH_DETACH) diff --git a/crossgen.cmake b/crossgen.cmake index 7bc64a2706..1bf84c8a36 100644 --- a/crossgen.cmake +++ b/crossgen.cmake @@ -1,6 +1,7 @@ # Contains the crossgen build specific definitions. Included by the leaf crossgen cmake files. add_definitions( + -DFEATURE_PREJIT -DCROSSGEN_COMPILE -DCROSS_COMPILE -DFEATURE_NATIVE_IMAGE_GENERATION diff --git a/src/inc/dacvars.h b/src/inc/dacvars.h index 520b501dac..78b1c10a4f 100644 --- a/src/inc/dacvars.h +++ b/src/inc/dacvars.h @@ -121,9 +121,11 @@ DEFINE_DACVAR(ULONG, PTR_GcDacVars, dac__g_gcDacGlobals, g_gcDacGlobals) DEFINE_DACVAR(ULONG, PTR_AppDomain, AppDomain__m_pTheAppDomain, AppDomain::m_pTheAppDomain) DEFINE_DACVAR(ULONG, PTR_SystemDomain, SystemDomain__m_pSystemDomain, SystemDomain::m_pSystemDomain) +#ifdef FEATURE_PREJIT DEFINE_DACVAR(ULONG, BOOL, SystemDomain__s_fForceDebug, SystemDomain::s_fForceDebug) DEFINE_DACVAR(ULONG, BOOL, SystemDomain__s_fForceProfiling, SystemDomain::s_fForceProfiling) DEFINE_DACVAR(ULONG, BOOL, SystemDomain__s_fForceInstrument, SystemDomain::s_fForceInstrument) +#endif #ifdef FEATURE_INTEROP_DEBUGGING DEFINE_DACVAR(ULONG, DWORD, dac__g_debuggerWordTLSIndex, g_debuggerWordTLSIndex) diff --git a/src/inc/jithelpers.h b/src/inc/jithelpers.h index d7a82286ca..d7d501f382 100644 --- a/src/inc/jithelpers.h +++ b/src/inc/jithelpers.h @@ -304,7 +304,11 @@ JITHELPER(CORINFO_HELP_EE_VSD_FIXUP, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB) #endif JITHELPER(CORINFO_HELP_EE_EXTERNAL_FIXUP, ExternalMethodFixupStub, CORINFO_HELP_SIG_NO_ALIGN_STUB) +#ifdef FEATURE_PREJIT JITHELPER(CORINFO_HELP_EE_VTABLE_FIXUP, VirtualMethodFixupStub, CORINFO_HELP_SIG_NO_ALIGN_STUB) +#else + JITHELPER(CORINFO_HELP_EE_VTABLE_FIXUP, NULL, CORINFO_HELP_SIG_NO_ALIGN_STUB) +#endif JITHELPER(CORINFO_HELP_EE_REMOTING_THUNK, NULL, CORINFO_HELP_SIG_UNDEF) diff --git a/src/utilcode/pedecoder.cpp b/src/utilcode/pedecoder.cpp index 242768e8b7..a3e3b7367f 100644 --- a/src/utilcode/pedecoder.cpp +++ b/src/utilcode/pedecoder.cpp @@ -34,10 +34,6 @@ CHECK PEDecoder::CheckFormat() const { CHECK(CheckCorHeader()); -#if !defined(FEATURE_PREJIT) - CHECK(IsILOnly()); -#endif - if (IsILOnly() && !HasReadyToRunHeader()) CHECK(CheckILOnly()); diff --git a/src/vm/amd64/ExternalMethodFixupThunk.asm b/src/vm/amd64/ExternalMethodFixupThunk.asm index 6c43762fd9..677f2e45db 100644 --- a/src/vm/amd64/ExternalMethodFixupThunk.asm +++ b/src/vm/amd64/ExternalMethodFixupThunk.asm @@ -7,7 +7,10 @@ include AsmConstants.inc extern ExternalMethodFixupWorker:proc extern ProcessCLRException:proc + +ifdef FEATURE_PREJIT extern VirtualMethodFixupWorker:proc +endif ifdef FEATURE_READYTORUN extern DynamicHelperWorker:proc @@ -87,6 +90,7 @@ DYNAMICHELPER <DynamicHelperFrameFlags_ObjectArg OR DynamicHelperFrameFlags_Obje endif ; FEATURE_READYTORUN +ifdef FEATURE_PREJIT ;============================================================================================ ;; EXTERN_C VOID __stdcall VirtualMethodFixupStub() @@ -103,5 +107,6 @@ PATCH_LABEL VirtualMethodFixupPatchLabel TAILJMP_RAX NESTED_END VirtualMethodFixupStub, _TEXT +endif ; FEATURE_PREJIT end diff --git a/src/vm/amd64/cgenamd64.cpp b/src/vm/amd64/cgenamd64.cpp index e0e6a47cdd..2a93fa4413 100644 --- a/src/vm/amd64/cgenamd64.cpp +++ b/src/vm/amd64/cgenamd64.cpp @@ -820,6 +820,7 @@ DWORD GetOffsetAtEndOfFunction(ULONGLONG uImageBase, return offsetInFunc; } +#ifdef FEATURE_PREJIT //========================================================================================== // In NGen image, virtual slots inherited from cross-module dependencies point to jump thunks. // These jump thunk initially point to VirtualMethodFixupStub which transfers control here. @@ -913,6 +914,7 @@ EXTERN_C PCODE VirtualMethodFixupWorker(TransitionBlock * pTransitionBlock, CORC // Ready to return return pCode; } +#endif // FEATURE_PREJIT #ifdef FEATURE_READYTORUN diff --git a/src/vm/amd64/externalmethodfixupthunk.S b/src/vm/amd64/externalmethodfixupthunk.S index b5c3780671..c092182fa1 100644 --- a/src/vm/amd64/externalmethodfixupthunk.S +++ b/src/vm/amd64/externalmethodfixupthunk.S @@ -80,6 +80,7 @@ DYNAMICHELPER (DynamicHelperFrameFlags_ObjectArg | DynamicHelperFrameFlags_Objec #endif // FEATURE_READYTORUN +#ifdef FEATURE_PREJIT //============================================================================================ // EXTERN_C VOID __stdcall VirtualMethodFixupStub() @@ -96,3 +97,4 @@ PATCH_LABEL VirtualMethodFixupPatchLabel TAILJMP_RAX NESTED_END VirtualMethodFixupStub, _TEXT +#endif // FEATURE_PREJIT diff --git a/src/vm/appdomain.cpp b/src/vm/appdomain.cpp index f567e7818f..4e98706226 100644 --- a/src/vm/appdomain.cpp +++ b/src/vm/appdomain.cpp @@ -98,9 +98,11 @@ static const WCHAR OTHER_DOMAIN_FRIENDLY_NAME_PREFIX[] = W("Domain"); SPTR_IMPL(AppDomain, AppDomain, m_pTheAppDomain); SPTR_IMPL(SystemDomain, SystemDomain, m_pSystemDomain); +#ifdef FEATURE_PREJIT SVAL_IMPL(BOOL, SystemDomain, s_fForceDebug); SVAL_IMPL(BOOL, SystemDomain, s_fForceProfiling); SVAL_IMPL(BOOL, SystemDomain, s_fForceInstrument); +#endif #ifndef DACCESS_COMPILE @@ -1587,7 +1589,7 @@ void SystemDomain::operator delete(void *pMem) // Do nothing - new() was in-place } - +#ifdef FEATURE_PREJIT void SystemDomain::SetCompilationOverrides(BOOL fForceDebug, BOOL fForceProfiling, BOOL fForceInstrument) @@ -1597,9 +1599,11 @@ void SystemDomain::SetCompilationOverrides(BOOL fForceDebug, s_fForceProfiling = fForceProfiling; s_fForceInstrument = fForceInstrument; } +#endif #endif //!DACCESS_COMPILE +#ifdef FEATURE_PREJIT void SystemDomain::GetCompilationOverrides(BOOL * fForceDebug, BOOL * fForceProfiling, BOOL * fForceInstrument) @@ -1609,6 +1613,7 @@ void SystemDomain::GetCompilationOverrides(BOOL * fForceDebug, *fForceProfiling = s_fForceProfiling; *fForceInstrument = s_fForceInstrument; } +#endif #ifndef DACCESS_COMPILE diff --git a/src/vm/appdomain.hpp b/src/vm/appdomain.hpp index 9029454ede..3d4a73271e 100644 --- a/src/vm/appdomain.hpp +++ b/src/vm/appdomain.hpp @@ -3218,6 +3218,7 @@ private: static DWORD m_dwLowestFreeIndex; #endif // DACCESS_COMPILE +#ifdef FEATURE_PREJIT protected: // These flags let the correct native image of mscorlib to be loaded. @@ -3226,6 +3227,7 @@ protected: SVAL_DECL(BOOL, s_fForceDebug); SVAL_DECL(BOOL, s_fForceProfiling); SVAL_DECL(BOOL, s_fForceInstrument); +#endif public: static void SetCompilationOverrides(BOOL fForceDebug, diff --git a/src/vm/arm/asmhelpers.S b/src/vm/arm/asmhelpers.S index feadaa87ba..034e687a50 100644 --- a/src/vm/arm/asmhelpers.S +++ b/src/vm/arm/asmhelpers.S @@ -831,6 +831,7 @@ LOCAL_LABEL(stackProbe_loop): bx lr NESTED_END stackProbe, _TEXT +#ifdef FEATURE_PREJIT //------------------------------------------------ // VirtualMethodFixupStub // @@ -886,6 +887,7 @@ LOCAL_LABEL(stackProbe_loop): bx r12 NESTED_END VirtualMethodFixupStub, _TEXT +#endif // FEATURE_PREJIT //------------------------------------------------ // ExternalMethodFixupStub @@ -924,6 +926,7 @@ LOCAL_LABEL(stackProbe_loop): NESTED_END ExternalMethodFixupStub, _TEXT +#ifdef FEATURE_PREJIT //------------------------------------------------ // StubDispatchFixupStub // @@ -956,6 +959,7 @@ LOCAL_LABEL(stackProbe_loop): bx r12 NESTED_END StubDispatchFixupStub, _TEXT +#endif // FEATURE_PREJIT //------------------------------------------------ // JIT_RareDisableHelper diff --git a/src/vm/arm/asmhelpers.asm b/src/vm/arm/asmhelpers.asm index 67de4f4f35..e49910d042 100644 --- a/src/vm/arm/asmhelpers.asm +++ b/src/vm/arm/asmhelpers.asm @@ -57,11 +57,14 @@ IMPORT GetCurrentSavedRedirectContext - ;; Imports to support virtual import fixup for ngen images - IMPORT VirtualMethodFixupWorker ;; Import to support cross-moodule external method invocation in ngen images IMPORT ExternalMethodFixupWorker + +#ifdef FEATURE_PREJIT + ;; Imports to support virtual import fixup for ngen images + IMPORT VirtualMethodFixupWorker IMPORT StubDispatchFixupWorker +#endif #ifdef FEATURE_READYTORUN IMPORT DynamicHelperWorker @@ -1241,6 +1244,7 @@ stackProbe_loop EPILOG_RETURN NESTED_END +#ifdef FEATURE_PREJIT ;------------------------------------------------ ; VirtualMethodFixupStub ; @@ -1295,6 +1299,7 @@ stackProbe_loop EPILOG_BRANCH_REG r12 NESTED_END +#endif // FEATURE_PREJIT ;------------------------------------------------ ; ExternalMethodFixupStub @@ -1333,6 +1338,7 @@ stackProbe_loop NESTED_END +#ifdef FEATURE_PREJIT ;------------------------------------------------ ; StubDispatchFixupStub ; @@ -1365,6 +1371,7 @@ stackProbe_loop EPILOG_BRANCH_REG r12 NESTED_END +#endif // FEATURE_PREJIT ;------------------------------------------------ ; JIT_RareDisableHelper diff --git a/src/vm/arm/cgencpu.h b/src/vm/arm/cgencpu.h index 360cbe6b18..c93780a634 100644 --- a/src/vm/arm/cgencpu.h +++ b/src/vm/arm/cgencpu.h @@ -1135,7 +1135,7 @@ struct StubPrecode { CONTRACTL { THROWS; - GC_TRIGGERS; + GC_NOTRIGGER; } CONTRACTL_END; @@ -1148,7 +1148,7 @@ struct StubPrecode { CONTRACTL { THROWS; - GC_TRIGGERS; + GC_NOTRIGGER; } CONTRACTL_END; diff --git a/src/vm/arm64/asmhelpers.S b/src/vm/arm64/asmhelpers.S index 56ed718708..28daf9ac0d 100644 --- a/src/vm/arm64/asmhelpers.S +++ b/src/vm/arm64/asmhelpers.S @@ -474,6 +474,7 @@ LOCAL_LABEL(Exit): ret lr WRITE_BARRIER_END JIT_WriteBarrier +#ifdef FEATURE_PREJIT //------------------------------------------------ // VirtualMethodFixupStub // @@ -520,7 +521,8 @@ NESTED_ENTRY VirtualMethodFixupStub, _TEXT, NoHandler // and tailcall to the actual method EPILOG_BRANCH_REG x12 -NESTED_END VirtualMEthodFixupStub, _TEXT +NESTED_END VirtualMethodFixupStub, _TEXT +#endif // FEATURE_PREJIT //------------------------------------------------ // ExternalMethodFixupStub diff --git a/src/vm/arm64/asmhelpers.asm b/src/vm/arm64/asmhelpers.asm index 400423b90a..01b49dbe29 100644 --- a/src/vm/arm64/asmhelpers.asm +++ b/src/vm/arm64/asmhelpers.asm @@ -11,12 +11,14 @@ #include "asmconstants.h" #include "asmmacros.h" +#ifdef FEATURE_PREJIT IMPORT VirtualMethodFixupWorker + IMPORT StubDispatchFixupWorker +#endif IMPORT ExternalMethodFixupWorker IMPORT PreStubWorker IMPORT NDirectImportWorker IMPORT VSD_ResolveWorker - IMPORT StubDispatchFixupWorker IMPORT JIT_InternalThrow IMPORT ComPreStubWorker IMPORT COMToCLRWorker @@ -532,6 +534,7 @@ Exit ret lr WRITE_BARRIER_END JIT_WriteBarrier +#ifdef FEATURE_PREJIT ;------------------------------------------------ ; VirtualMethodFixupStub ; @@ -579,6 +582,8 @@ Exit EPILOG_BRANCH_REG x12 NESTED_END +#endif // FEATURE_PREJIT + ;------------------------------------------------ ; ExternalMethodFixupStub ; diff --git a/src/vm/ceeload.cpp b/src/vm/ceeload.cpp index 40b73a03ef..3d26a0a647 100644 --- a/src/vm/ceeload.cpp +++ b/src/vm/ceeload.cpp @@ -10424,6 +10424,10 @@ ZapHeader.ImportTable | | | non-NULL #endif // 0 +#endif +#endif + +#ifndef DACCESS_COMPILE //----------------------------------------------------------------------------- void Module::RunEagerFixups() @@ -10507,7 +10511,11 @@ void Module::RunEagerFixups() } } } +#endif // !DACCESS_COMPILE +#ifdef FEATURE_PREJIT + +#ifndef DACCESS_COMPILE void Module::LoadTokenTables() { CONTRACTL @@ -10701,7 +10709,6 @@ BOOL Module::FixupNativeEntry(CORCOMPILE_IMPORT_SECTION* pSection, SIZE_T fixupI return TRUE; } -#ifdef FEATURE_PREJIT // // Profile data management // @@ -11649,7 +11656,6 @@ ExternalMethodBlobEntry::ExternalMethodBlobEntry(mdToken _nestedClass, return static_cast<const ExternalMethodBlobEntry *>(pEntry); } - static bool GetBasename(LPCWSTR _src, __out_ecount(dstlen) __out_z LPWSTR _dst, int dstlen) { LIMITED_METHOD_CONTRACT; @@ -12387,7 +12393,6 @@ void Module::DeleteProfilingData() // the metadataProfileData is free'ed in destructor of the corresponding MetaDataTracker } -#endif //FEATURE_PREJIT void Module::SetIsIJWFixedUp() { @@ -12395,7 +12400,6 @@ void Module::SetIsIJWFixedUp() FastInterlockOr(&m_dwTransientFlags, IS_IJW_FIXED_UP); } -#ifdef FEATURE_PREJIT /* static */ Module::TokenProfileData *Module::TokenProfileData::CreateNoThrow(void) { @@ -12421,8 +12425,6 @@ Module::TokenProfileData *Module::TokenProfileData::CreateNoThrow(void) return tpd; } -#endif // FEATURE_PREJIT - #endif // !DACCESS_COMPILE #ifndef DACCESS_COMPILE @@ -12433,7 +12435,6 @@ void Module::SetBeingUnloaded() } #endif -#ifdef FEATURE_PREJIT void Module::LogTokenAccess(mdToken token, SectionFormat format, ULONG flagnum) { CONTRACTL @@ -12545,10 +12546,8 @@ void Module::LogTokenAccess(mdToken token, ULONG flagNum) LogTokenAccess(token, format, flagNum); } } -#endif // FEATURE_PREJIT #ifndef DACCESS_COMPILE -#ifdef FEATURE_PREJIT // // Encoding callbacks @@ -12808,7 +12807,6 @@ idMethodSpec Module::LogInstantiatedMethod(const MethodDesc * md, ULONG flagNum) RETURN result; } #endif // DACCESS_COMPILE -#endif //FEATURE_PREJIT #ifndef DACCESS_COMPILE diff --git a/src/vm/ceeload.h b/src/vm/ceeload.h index 3aab11dfeb..e547418adb 100644 --- a/src/vm/ceeload.h +++ b/src/vm/ceeload.h @@ -79,12 +79,12 @@ class DynamicMethodTable; class CodeVersionManager; class TieredCompilationManager; class ProfileEmitter; +class JITInlineTrackingMap; #ifdef FEATURE_PREJIT class TypeHandleList; class TrackingMap; struct MethodInModule; class PersistentInlineTrackingMapNGen; -class JITInlineTrackingMap; extern VerboseLevel g_CorCompileVerboseLevel; #endif @@ -380,8 +380,10 @@ public: WRAPPER_NO_CONTRACT; _ASSERTE((flag & supportedFlags) == flag); +#ifdef FEATURE_PREJIT _ASSERTE(!MapIsCompressed()); _ASSERTE(dwNumHotItems == 0); +#endif // FEATURE_PREJIT PTR_TADDR pElement = GetElementPtr(rid); _ASSERTE(pElement); @@ -740,9 +742,6 @@ struct ModuleCtorInfo }; - -#ifdef FEATURE_PREJIT - // For IBC Profiling we collect signature blobs for instantiated types. // For such instantiated types and methods we create our own ibc token // @@ -1004,7 +1003,7 @@ public: typedef SHash<ProfilingBlobTraits> ProfilingBlobTable; typedef DPTR(ProfilingBlobTable) PTR_ProfilingBlobTable; - +#ifdef FEATURE_PREJIT #define METHODTABLE_RESTORE_REASON() \ RESTORE_REASON_FUNC(CanNotPreRestoreHardBindToParentMethodTable) \ RESTORE_REASON_FUNC(CanNotPreRestoreHardBindToCanonicalMethodTable) \ diff --git a/src/vm/dataimage.h b/src/vm/dataimage.h index 90f3d4cb97..a9375e7a1d 100644 --- a/src/vm/dataimage.h +++ b/src/vm/dataimage.h @@ -7,15 +7,6 @@ #ifndef _DATAIMAGE_H_ #define _DATAIMAGE_H_ -#if defined(FEATURE_PREJIT) && !defined(DACCESS_COMPILE) - -// All we really need is to pre-declare the PrecodeType enum, but g++ doesn't -// support enum pre-declaration, so we need to include the declaration itself. -/*#include "cgensys.h" // needed to include precode.h*/ -#include "precode.h" - -typedef BYTE ZapRelocationType; // IMAGE_REL_XXX enum - // IMAGE_REL_BASED_PTR is architecture specific reloc of virtual address #ifdef _TARGET_64BIT_ #define IMAGE_REL_BASED_PTR IMAGE_REL_BASED_DIR64 @@ -26,6 +17,15 @@ typedef BYTE ZapRelocationType; // IMAGE_REL_XXX enum // Special NGEN-specific relocation type for relative pointer (used to make NGen relocation section smaller) #define IMAGE_REL_BASED_RELPTR 0x7D +#if defined(FEATURE_PREJIT) && !defined(DACCESS_COMPILE) + +// All we really need is to pre-declare the PrecodeType enum, but g++ doesn't +// support enum pre-declaration, so we need to include the declaration itself. +/*#include "cgensys.h" // needed to include precode.h*/ +#include "precode.h" + +typedef BYTE ZapRelocationType; // IMAGE_REL_XXX enum + class CEEPreloader; class ZapImage; diff --git a/src/vm/domainfile.cpp b/src/vm/domainfile.cpp index a60f8d4ab3..9e3d7068e8 100644 --- a/src/vm/domainfile.cpp +++ b/src/vm/domainfile.cpp @@ -1003,14 +1003,6 @@ void DomainFile::PostLoadLibrary() void DomainFile::AddDependencies() { STANDARD_VM_CONTRACT; - -#ifdef FEATURE_PREJIT - - // - // CoreCLR hard binds to mscorlib.dll only. No need to track hardbound dependencies. - // - -#endif // FEATURE_PREJIT } void DomainFile::EagerFixups() @@ -1022,8 +1014,9 @@ void DomainFile::EagerFixups() { GetCurrentModule()->RunEagerFixups(); } -#ifdef FEATURE_READYTORUN else +#endif // FEATURE_PREJIT +#ifdef FEATURE_READYTORUN if (GetCurrentModule()->IsReadyToRun()) { #ifndef CROSSGEN_COMPILE @@ -1040,8 +1033,6 @@ void DomainFile::EagerFixups() GetCurrentModule() /* (void *)pLayout */); } #endif // FEATURE_READYTORUN - -#endif // FEATURE_PREJIT } void DomainFile::VtableFixups() diff --git a/src/vm/fieldmarshaler.h b/src/vm/fieldmarshaler.h index 9e393b7755..1718bd3b7b 100644 --- a/src/vm/fieldmarshaler.h +++ b/src/vm/fieldmarshaler.h @@ -1117,7 +1117,8 @@ public: #ifdef FEATURE_PREJIT return !m_arrayType.IsTagged() && (m_arrayType.IsNull() || m_arrayType.GetValue().IsRestored()); #else // FEATURE_PREJIT - return m_arrayType.IsNull() || m_arrayType.GetValue().IsFullyLoaded(); + // putting the IsFullyLoaded check here is tempting but incorrect + return TRUE; #endif // FEATURE_PREJIT } #endif diff --git a/src/vm/i386/asmhelpers.S b/src/vm/i386/asmhelpers.S index 09fb50266f..0afc5764db 100644 --- a/src/vm/i386/asmhelpers.S +++ b/src/vm/i386/asmhelpers.S @@ -725,7 +725,6 @@ LOCAL_LABEL(GoCallCalliWorker): LEAF_END GenericPInvokeCalliHelper, _TEXT #ifdef FEATURE_PREJIT - // ========================================================================= NESTED_ENTRY StubDispatchFixupStub, _TEXT, NoHandler STUB_PROLOG @@ -755,6 +754,7 @@ PATCH_LABEL StubDispatchFixupPatchLabel // which disassembles the epilog to unwind the stack. ret NESTED_END StubDispatchFixupStub, _TEXT +#endif // FEATURE_PREJIT // ========================================================================== NESTED_ENTRY ExternalMethodFixupStub, _TEXT_ NoHandler @@ -842,6 +842,7 @@ NESTED_END DelayLoad_MethodCall, _TEXT #endif // FEATURE_READYTORUN +#ifdef FEATURE_PREJIT // ======================================================================================= // The call in softbound vtable slots initially points to this function. // The pupose of this function is to transfer the control to right target and @@ -891,7 +892,6 @@ PATCH_LABEL VirtualMethodFixupPatchLabel // which disassembles the epilog to unwind the stack. ret NESTED_END VirtualMethodFixupStub, _TEXT - #endif // FEATURE_PREJIT NESTED_ENTRY ThePreStub, _TEXT, NoHandler diff --git a/src/vm/i386/asmhelpers.asm b/src/vm/i386/asmhelpers.asm index 19697a42d8..acaf31bab5 100644 --- a/src/vm/i386/asmhelpers.asm +++ b/src/vm/i386/asmhelpers.asm @@ -61,8 +61,9 @@ ifdef FEATURE_COMINTEROP EXTERN _CLRToCOMWorker@8:PROC endif -ifdef FEATURE_PREJIT EXTERN _ExternalMethodFixupWorker@16:PROC + +ifdef FEATURE_PREJIT EXTERN _VirtualMethodFixupWorker@8:PROC EXTERN _StubDispatchFixupWorker@16:PROC endif @@ -1523,7 +1524,6 @@ _DelayLoad_MethodCall@0 endp endif ifdef FEATURE_PREJIT - ;======================================================================================= ; The call in softbound vtable slots initially points to this function. ; The pupose of this function is to transfer the control to right target and @@ -1564,8 +1564,7 @@ public _VirtualMethodFixupPatchLabel@0 ret _VirtualMethodFixupStub@0 endp - -endif ; FEATURE_PREJIT +endif ;========================================================================== ; The prestub diff --git a/src/vm/i386/cgencpu.h b/src/vm/i386/cgencpu.h index b42e422c97..48b24b3ff1 100644 --- a/src/vm/i386/cgencpu.h +++ b/src/vm/i386/cgencpu.h @@ -85,10 +85,8 @@ EXTERN_C void SinglecastDelegateInvokeStub(); // Needed for PInvoke inlining in ngened images #define HAS_NDIRECT_IMPORT_PRECODE 1 -#ifdef FEATURE_PREJIT #define HAS_FIXUP_PRECODE 1 #define HAS_FIXUP_PRECODE_CHUNKS 1 -#endif // ThisPtrRetBufPrecode one is necessary for closed delegates over static methods with return buffer #define HAS_THISPTR_RETBUF_PRECODE 1 diff --git a/src/vm/i386/cgenx86.cpp b/src/vm/i386/cgenx86.cpp index df265f2369..a5a85b0481 100644 --- a/src/vm/i386/cgenx86.cpp +++ b/src/vm/i386/cgenx86.cpp @@ -1363,6 +1363,7 @@ BOOL DoesSlotCallPrestub(PCODE pCode) return pCode == GetPreStubEntryPoint(); } +#ifdef FEATURE_PREJIT //========================================================================================== // In NGen image, virtual slots inherited from cross-module dependencies point to jump thunks. // These jump thunk initially point to VirtualMethodFixupStub which transfers control here. @@ -1430,7 +1431,7 @@ EXTERN_C PVOID STDCALL VirtualMethodFixupWorker(Object * pThisPtr, CORCOMPILE_V return PVOID(pCode); } - +#endif // FEATURE_PREJIT #ifdef FEATURE_READYTORUN diff --git a/src/vm/i386/stublinkerx86.cpp b/src/vm/i386/stublinkerx86.cpp index f46f5067b9..7020e40e51 100644 --- a/src/vm/i386/stublinkerx86.cpp +++ b/src/vm/i386/stublinkerx86.cpp @@ -6485,7 +6485,7 @@ void rel32SetInterlocked(/*PINT32*/ PVOID pRel32, TADDR target, MethodDesc* pMD) CONTRACTL { THROWS; // Creating a JumpStub could throw OutOfMemory - GC_TRIGGERS; + GC_NOTRIGGER; } CONTRACTL_END; @@ -6500,7 +6500,7 @@ BOOL rel32SetInterlocked(/*PINT32*/ PVOID pRel32, TADDR target, TADDR expected, CONTRACTL { THROWS; // Creating a JumpStub could throw OutOfMemory - GC_TRIGGERS; + GC_NOTRIGGER; } CONTRACTL_END; diff --git a/src/vm/i386/stublinkerx86.h b/src/vm/i386/stublinkerx86.h index 31bc10460b..3d79b51868 100644 --- a/src/vm/i386/stublinkerx86.h +++ b/src/vm/i386/stublinkerx86.h @@ -542,7 +542,7 @@ struct StubPrecode { CONTRACTL { THROWS; - GC_TRIGGERS; + GC_NOTRIGGER; } CONTRACTL_END; @@ -555,7 +555,7 @@ struct StubPrecode { CONTRACTL { THROWS; - GC_TRIGGERS; + GC_NOTRIGGER; } CONTRACTL_END; diff --git a/src/vm/ibclogger.cpp b/src/vm/ibclogger.cpp index 991f936b09..01ffa3860b 100644 --- a/src/vm/ibclogger.cpp +++ b/src/vm/ibclogger.cpp @@ -523,7 +523,9 @@ void IBCLogger::LogMethodAccessHelper(const MethodDesc* pMD, ULONG flagNum) if (!pMT->IsRestored_NoLogging()) goto DelayCallback; +#ifdef FEATURE_PREJIT LogMethodTableAccessHelper(pMT); +#endif Module *pModule = pMT->GetModule(); @@ -554,12 +556,14 @@ void IBCLogger::LogMethodAccessHelper(const MethodDesc* pMD, ULONG flagNum) goto DelayCallback; } +#ifdef FEATURE_PREJIT Module *pPZModule = Module::GetPreferredZapModuleForMethodDesc(pMD); token = pPZModule->LogInstantiatedMethod(pMD, flagNum); if (!IsNilToken(token)) { pPZModule->LogTokenAccess(token, MethodProfilingData, flagNum); } +#endif } else { @@ -579,7 +583,33 @@ void IBCLogger::LogMethodAccessWrapper(IBCLogger* pLogger, const void * pValue1, WRAPPER_NO_CONTRACT; pLogger->LogMethodAccessHelper((MethodDesc *)pValue1, (ULONG)(SIZE_T)pValue2); } +// Log access to method code or method header +void IBCLogger::LogMethodCodeAccessHelper(MethodDesc *pMD) +{ + CONTRACTL + { + NOTHROW; + GC_NOTRIGGER; + MODE_ANY; + PRECONDITION(g_IBCLogger.InstrEnabled()); + } + CONTRACTL_END; + + LogMethodAccessHelper(pMD, ReadMethodCode); +} + +// Log access to method gc info +void IBCLogger::LogMethodGCInfoAccessHelper(MethodDesc* pMD) +{ + WRAPPER_NO_CONTRACT; + + _ASSERTE(InstrEnabled()); + + LogMethodAccessHelper(pMD, ReadGCInfo); + LogMethodAccessHelper(pMD, CommonReadGCInfo); +} +#ifdef FEATURE_PREJIT void IBCLogger::LogMethodDescAccessHelper(const MethodDesc *pMD) { WRAPPER_NO_CONTRACT; @@ -610,21 +640,6 @@ void IBCLogger::LogMethodPrecodeWriteAccessHelper(MethodDesc *pMD) LogMethodAccessHelper(pMD, WriteMethodPrecode); } -// Log access to method code or method header -void IBCLogger::LogMethodCodeAccessHelper(MethodDesc *pMD) -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - MODE_ANY; - PRECONDITION(g_IBCLogger.InstrEnabled()); - } - CONTRACTL_END; - - LogMethodAccessHelper(pMD, ReadMethodCode); -} - // Log access to the method code and method header for NDirect calls void IBCLogger::LogNDirectCodeAccessHelper(MethodDesc *pMD) { @@ -641,18 +656,6 @@ void IBCLogger::LogNDirectCodeAccessHelper(MethodDesc *pMD) LogMethodAccessHelper(pMD, ReadMethodCode); } - -// Log access to method gc info -void IBCLogger::LogMethodGCInfoAccessHelper(MethodDesc *pMD) -{ - WRAPPER_NO_CONTRACT; - - _ASSERTE(InstrEnabled()); - - LogMethodAccessHelper(pMD, ReadGCInfo); - LogMethodAccessHelper(pMD, CommonReadGCInfo); -} - // Log access to method table void IBCLogger::LogMethodTableAccessHelper(MethodTable const * pMT) { @@ -1096,6 +1099,7 @@ DelayCallback: DelayedCallbackPtr(LogRVADataAccessWrapper, pFD); } +#endif // FEATURE_PREJIT #define LOADORDER_INSTR 0x00000001 #define RID_ACCESSORDER_INSTR 0x00000002 diff --git a/src/vm/ibclogger.h b/src/vm/ibclogger.h index 740637bab0..6aba2445e9 100644 --- a/src/vm/ibclogger.h +++ b/src/vm/ibclogger.h @@ -40,7 +40,7 @@ typedef PTR_VOID HashDatum; typedef Pair< Module*, mdToken > RidMapLogData; -#if defined(FEATURE_PREJIT) && !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) +#if !defined(DACCESS_COMPILE) && !defined(CROSSGEN_COMPILE) #define IBCLOGGER_ENABLED #endif @@ -445,7 +445,7 @@ private: void DelayedCallbackPtr(pfnIBCAccessCallback callback, const void * pValue1, const void * pValue2 = NULL); -#else // FEATURE_PREJIT && !DACCESS_COMPILE +#else // IBCLOGGER_ENABLED #define LOGACCESS_PTR(name,type) \ public: \ @@ -455,16 +455,36 @@ public: \ public: \ void Log##name##Access(type p) { SUPPORTS_DAC; } \ -#endif // FEATURE_PREJIT && !DACCESS_COMPILE - - // Log access to method desc (which adds the method desc to the required list) - // Implemented by : code:IBCLogger.LogMethodDescAccessHelper - LOGACCESS_PTR(MethodDesc, const MethodDesc) +#endif // IBCLOGGER_ENABLED // Log access to method code or method header // Implemented by : code:IBCLogger.LogMethodCodeAccessHelper LOGACCESS_PTR(MethodCode, MethodDesc) + // Log access to gc info + // Implemented by : code:IBCLogger.LogMethodGCInfoAccessHelper + LOGACCESS_PTR(MethodGCInfo, MethodDesc) + +// The accesses to individual datastructures matter for fragile NGen only +#ifndef FEATURE_PREJIT + +#undef LOGACCESS_PTR +#undef LOGACCESS_VALUE + +#define LOGACCESS_PTR(name,type) \ +public: \ + void Log##name##Access(type* p) { SUPPORTS_DAC; } \ + +#define LOGACCESS_VALUE(name, type) \ +public: \ + void Log##name##Access(type p) { SUPPORTS_DAC; } \ + +#endif // FEATURE_PREJIT + + // Log access to method desc (which adds the method desc to the required list) + // Implemented by : code:IBCLogger.LogMethodDescAccessHelper + LOGACCESS_PTR(MethodDesc, const MethodDesc) + // Log access to the NDirect data stored for a MethodDesc // also implies that the IL_STUB for the NDirect method is executed // Implemented by : code:IBCLogger.LogNDirectCodeAccessHelper @@ -482,10 +502,6 @@ public: \ // Implemented by : code:IBCLogger.LogMethodPrecodeWriteAccessHelper LOGACCESS_PTR(MethodPrecodeWrite,MethodDesc) - // Log access to gc info - // Implemented by : code:IBCLogger.LogMethodGCInfoAccessHelper - LOGACCESS_PTR(MethodGCInfo, MethodDesc) - // Log access to method table // Implemented by : code:IBCLogger.LogMethodTableAccessHelper LOGACCESS_PTR(MethodTable, MethodTable const) diff --git a/src/vm/method.cpp b/src/vm/method.cpp index cdbd4430ab..d8688e14a4 100644 --- a/src/vm/method.cpp +++ b/src/vm/method.cpp @@ -3169,6 +3169,10 @@ void DynamicMethodDesc::Restore() RestoreSignatureContainingInternalTypes(pSig, cSigLen); } } +#else // FEATURE_PREJIT +void DynamicMethodDesc::Restore() +{ +} #endif // FEATURE_PREJIT #ifdef FEATURE_NATIVE_IMAGE_GENERATION @@ -3912,7 +3916,6 @@ void ComPlusCallInfo::Fixup(DataImage *image) #endif // !DACCESS_COMPILE -#ifdef FEATURE_PREJIT //******************************************************************************* void MethodDesc::CheckRestore(ClassLoadLevel level) { @@ -3932,11 +3935,11 @@ void MethodDesc::CheckRestore(ClassLoadLevel level) // First restore method table pointer in singleton chunk; // it might be out-of-module +#ifdef FEATURE_PREJIT GetMethodDescChunk()->RestoreMTPointer(level); #ifdef _DEBUG Module::RestoreMethodTablePointer(&m_pDebugMethodTable, NULL, level); #endif - // Now restore wrapped method desc if present; we need this for the dictionary layout too if (pIMD->IMD_IsWrapperStubWithInstantiations()) Module::RestoreMethodDescPointer(&pIMD->m_pWrappedMethodDesc); @@ -3946,6 +3949,9 @@ void MethodDesc::CheckRestore(ClassLoadLevel level) { GetMethodDictionary()->Restore(GetNumGenericMethodArgs(), level); } +#else + ClassLoader::EnsureLoaded(TypeHandle(GetMethodTable()), level); +#endif g_IBCLogger.LogMethodDescWriteAccess(this); @@ -3992,13 +3998,6 @@ void MethodDesc::CheckRestore(ClassLoadLevel level) } } } -#else // FEATURE_PREJIT -//******************************************************************************* -void MethodDesc::CheckRestore(ClassLoadLevel level) -{ - LIMITED_METHOD_CONTRACT; -} -#endif // !FEATURE_PREJIT // static MethodDesc* MethodDesc::GetMethodDescFromStubAddr(PCODE addr, BOOL fSpeculative /*=FALSE*/) diff --git a/src/vm/methodtable.cpp b/src/vm/methodtable.cpp index 2782c9b71a..d0dd136925 100644 --- a/src/vm/methodtable.cpp +++ b/src/vm/methodtable.cpp @@ -5262,8 +5262,6 @@ void MethodTableWriteableData::Fixup(DataImage *image, MethodTable *pMT, BOOL ne #endif // FEATURE_NATIVE_IMAGE_GENERATION -#ifdef FEATURE_PREJIT - //========================================================================================== void MethodTable::CheckRestore() { @@ -5283,15 +5281,6 @@ void MethodTable::CheckRestore() g_IBCLogger.LogMethodTableAccess(this); } -#else // !FEATURE_PREJIT -//========================================================================================== -void MethodTable::CheckRestore() -{ - LIMITED_METHOD_CONTRACT; -} -#endif // !FEATURE_PREJIT - - #ifndef DACCESS_COMPILE BOOL SatisfiesClassConstraints(TypeHandle instanceTypeHnd, TypeHandle typicalTypeHnd, diff --git a/src/vm/peimagelayout.cpp b/src/vm/peimagelayout.cpp index e839e8ffb0..c965c61ff5 100644 --- a/src/vm/peimagelayout.cpp +++ b/src/vm/peimagelayout.cpp @@ -8,6 +8,7 @@ #include "common.h" #include "peimagelayout.h" #include "peimagelayout.inl" +#include "dataimage.h" #if defined(PLATFORM_WINDOWS) && !defined(CROSSGEN_COMPILE) #include "amsi.h" @@ -88,8 +89,6 @@ PEImageLayout* PEImageLayout::Map(HANDLE hFile, PEImage* pOwner) RETURN pAlloc.Extract(); } -#ifdef FEATURE_PREJIT - #ifdef FEATURE_PAL DWORD SectionCharacteristicsToPageProtection(UINT characteristics) { @@ -293,7 +292,6 @@ void PEImageLayout::ApplyBaseRelocations() ClrFlushInstructionCache(pFlushRegion, cbFlushRegion); } } -#endif // FEATURE_PREJIT RawImageLayout::RawImageLayout(const void *flat, COUNT_T size, PEImage* pOwner) diff --git a/src/vm/peimagelayout.h b/src/vm/peimagelayout.h index 8ddb577a85..17254bcb72 100644 --- a/src/vm/peimagelayout.h +++ b/src/vm/peimagelayout.h @@ -68,9 +68,7 @@ public: ULONG Release(); const SString& GetPath(); -#ifdef FEATURE_PREJIT void ApplyBaseRelocations(); -#endif public: #ifdef DACCESS_COMPILE diff --git a/src/vm/perfmap.cpp b/src/vm/perfmap.cpp index ba99900588..593ab8d1c4 100644 --- a/src/vm/perfmap.cpp +++ b/src/vm/perfmap.cpp @@ -324,28 +324,27 @@ void NativeImagePerfMap::LogDataForModule(Module * pModule) SIZE_T baseAddr = (SIZE_T)pLoadedLayout->GetBase(); -#ifdef FEATURE_READYTORUN_COMPILER - if (pLoadedLayout->HasReadyToRunHeader()) +#ifdef FEATURE_PREJIT + if (!pLoadedLayout->HasReadyToRunHeader()) { - ReadyToRunInfo::MethodIterator mi(pModule->GetReadyToRunInfo()); + MethodIterator mi((PTR_Module)pModule); while (mi.Next()) { MethodDesc *hotDesc = mi.GetMethodDesc(); + hotDesc->CheckRestore(); LogPreCompiledMethod(hotDesc, mi.GetMethodStartAddress(), baseAddr); } + return; } - else -#endif // FEATURE_READYTORUN_COMPILER +#endif + + ReadyToRunInfo::MethodIterator mi(pModule->GetReadyToRunInfo()); + while (mi.Next()) { - MethodIterator mi((PTR_Module)pModule); - while (mi.Next()) - { - MethodDesc *hotDesc = mi.GetMethodDesc(); - hotDesc->CheckRestore(); + MethodDesc* hotDesc = mi.GetMethodDesc(); - LogPreCompiledMethod(hotDesc, mi.GetMethodStartAddress(), baseAddr); - } + LogPreCompiledMethod(hotDesc, mi.GetMethodStartAddress(), baseAddr); } } diff --git a/src/vm/siginfo.cpp b/src/vm/siginfo.cpp index 8dfb1cdc02..e20f49243d 100644 --- a/src/vm/siginfo.cpp +++ b/src/vm/siginfo.cpp @@ -1125,7 +1125,6 @@ TypeHandle SigPointer::GetTypeHandleThrowing( break; } -#ifdef FEATURE_PREJIT case ELEMENT_TYPE_NATIVE_ARRAY_TEMPLATE_ZAPSIG: { #ifndef DACCESS_COMPILE @@ -1258,7 +1257,6 @@ TypeHandle SigPointer::GetTypeHandleThrowing( #endif break; } -#endif // FEATURE_PREJIT case ELEMENT_TYPE_VAR: { diff --git a/src/vm/stubmgr.cpp b/src/vm/stubmgr.cpp index a18792d76e..27ab5cf614 100644 --- a/src/vm/stubmgr.cpp +++ b/src/vm/stubmgr.cpp @@ -1511,10 +1511,14 @@ BOOL RangeSectionStubManager::TraceManager(Thread *thread, } CONTRACTL_END; +#ifdef FEATURE_PREJIT // Both virtual and external import thunks have the same structure. We can use // common code to handle them. _ASSERTE(GetIP(pContext) == GetEEFuncEntryPoint(VirtualMethodFixupPatchLabel) || GetIP(pContext) == GetEEFuncEntryPoint(ExternalMethodFixupPatchLabel)); +#else + _ASSERTE(GetIP(pContext) == GetEEFuncEntryPoint(ExternalMethodFixupPatchLabel)); +#endif *pRetAddr = (BYTE *)StubManagerHelpers::GetReturnAddress(pContext); diff --git a/src/vm/threads.cpp b/src/vm/threads.cpp index 40e846bf40..dcd95f8cdb 100644 --- a/src/vm/threads.cpp +++ b/src/vm/threads.cpp @@ -1464,9 +1464,7 @@ Thread::Thread() m_pPendingTypeLoad = NULL; -#ifdef FEATURE_PREJIT m_pIBCInfo = NULL; -#endif m_dwAVInRuntimeImplOkayCount = 0; @@ -2630,11 +2628,9 @@ Thread::~Thread() g_pThinLockThreadIdDispenser->DisposeId(GetThreadId()); -#ifdef FEATURE_PREJIT if (m_pIBCInfo) { delete m_pIBCInfo; } -#endif #ifdef FEATURE_EVENT_TRACE // Destruct the thread local type cache for allocation sampling diff --git a/src/vm/threads.h b/src/vm/threads.h index 2cbf0e0674..3a521c076d 100644 --- a/src/vm/threads.h +++ b/src/vm/threads.h @@ -2953,8 +2953,6 @@ public: } #endif -#ifdef FEATURE_PREJIT - private: ThreadLocalIBCInfo* m_pIBCInfo; @@ -2986,8 +2984,6 @@ public: #endif // #ifndef DACCESS_COMPILE -#endif // #ifdef FEATURE_PREJIT - // Indicate whether this thread should run in the background. Background threads // don't interfere with the EE shutting down. Whereas a running non-background // thread prevents us from shutting down (except through System.Exit(), of course) diff --git a/src/vm/virtualcallstub.h b/src/vm/virtualcallstub.h index 66cbc5f222..3cf096a47a 100644 --- a/src/vm/virtualcallstub.h +++ b/src/vm/virtualcallstub.h @@ -44,10 +44,12 @@ struct VTableCallHolder; // Forward function declarations extern "C" void InContextTPQuickDispatchAsmStub(); +#ifdef FEATURE_PREJIT extern "C" PCODE STDCALL StubDispatchFixupWorker(TransitionBlock * pTransitionBlock, TADDR siteAddrForRegisterIndirect, DWORD sectionIndex, Module * pModule); +#endif extern "C" PCODE STDCALL VSD_ResolveWorker(TransitionBlock * pTransitionBlock, TADDR siteAddrForRegisterIndirect, |