diff options
author | Filip Navara <filip.navara@gmail.com> | 2019-01-23 22:13:01 +0100 |
---|---|---|
committer | Jan Kotas <jkotas@microsoft.com> | 2019-01-23 13:13:01 -0800 |
commit | a28b25aacdcd2adb0fdfa70bd869f53ba6565976 (patch) | |
tree | d37eeacbb212a5633edabf93300dbcd18980f13f /src/vm | |
parent | 797888982e264e2ecfbc436f782f2f6704644e84 (diff) | |
download | coreclr-a28b25aacdcd2adb0fdfa70bd869f53ba6565976.tar.gz coreclr-a28b25aacdcd2adb0fdfa70bd869f53ba6565976.tar.bz2 coreclr-a28b25aacdcd2adb0fdfa70bd869f53ba6565976.zip |
Remove all traces of FEATURE_STACK_PROBE. (#22149)
Diffstat (limited to 'src/vm')
204 files changed, 139 insertions, 6312 deletions
diff --git a/src/vm/amd64/cgenamd64.cpp b/src/vm/amd64/cgenamd64.cpp index 814f04dd9f..e0e6a47cdd 100644 --- a/src/vm/amd64/cgenamd64.cpp +++ b/src/vm/amd64/cgenamd64.cpp @@ -364,7 +364,6 @@ BOOL isJumpRel32(PCODE pCode) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -383,7 +382,6 @@ PCODE decodeJump32(PCODE pBuffer) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -399,7 +397,6 @@ BOOL isJumpRel64(PCODE pCode) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -417,7 +414,6 @@ PCODE decodeJump64(PCODE pBuffer) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -730,7 +726,6 @@ BOOL DoesSlotCallPrestub(PCODE pCode) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(pCode != GetPreStubEntryPoint()); } CONTRACTL_END; @@ -811,7 +806,6 @@ DWORD GetOffsetAtEndOfFunction(ULONGLONG uImageBase, MODE_ANY; NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION((offsetNum > 0) && (offsetNum < 20)); /* we only allow reasonable offsetNums 1..19 */ } CONTRACTL_END; @@ -852,8 +846,6 @@ EXTERN_C PCODE VirtualMethodFixupWorker(TransitionBlock * pTransitionBlock, CORC Thread::ObjectRefFlush(CURRENT_THREAD); #endif - BEGIN_SO_INTOLERANT_CODE(CURRENT_THREAD); - _ASSERTE(IS_ALIGNED((size_t)pThunk, sizeof(INT64))); FrameWithCookie<ExternalMethodFrame> frame(pTransitionBlock); @@ -919,9 +911,6 @@ EXTERN_C PCODE VirtualMethodFixupWorker(TransitionBlock * pTransitionBlock, CORC } // Ready to return - - END_SO_INTOLERANT_CODE; - return pCode; } diff --git a/src/vm/amd64/cgencpu.h b/src/vm/amd64/cgencpu.h index 22ed3642b6..619fd4ba64 100644 --- a/src/vm/amd64/cgencpu.h +++ b/src/vm/amd64/cgencpu.h @@ -301,7 +301,6 @@ inline PCODE GetIP(const CONTEXT * context) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; SUPPORTS_DAC; @@ -317,7 +316,6 @@ inline void SetIP(CONTEXT* context, PCODE rip) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; SUPPORTS_DAC; @@ -333,7 +331,6 @@ inline TADDR GetSP(const CONTEXT * context) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; SUPPORTS_DAC; @@ -348,7 +345,6 @@ inline void SetSP(CONTEXT *context, TADDR rsp) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; SUPPORTS_DAC; diff --git a/src/vm/amd64/excepamd64.cpp b/src/vm/amd64/excepamd64.cpp index d4248e7b07..003edce687 100644 --- a/src/vm/amd64/excepamd64.cpp +++ b/src/vm/amd64/excepamd64.cpp @@ -158,7 +158,6 @@ RtlVirtualUnwind ( { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -194,7 +193,6 @@ RtlVirtualUnwind_Worker ( { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/amd64/gmsamd64.cpp b/src/vm/amd64/gmsamd64.cpp index d595db0c91..24eabf69c4 100644 --- a/src/vm/amd64/gmsamd64.cpp +++ b/src/vm/amd64/gmsamd64.cpp @@ -19,7 +19,6 @@ void LazyMachState::unwindLazyState(LazyMachState* baseState, { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; diff --git a/src/vm/appdomain.cpp b/src/vm/appdomain.cpp index 0c2ebd6813..c225c58a83 100644 --- a/src/vm/appdomain.cpp +++ b/src/vm/appdomain.cpp @@ -143,7 +143,6 @@ BOOL CompareCLSID(UPTR u1, UPTR u2) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; INJECT_FAULT(COMPlusThrowOM();); } CONTRACTL_END; @@ -2770,7 +2769,6 @@ AppDomain *SystemDomain::GetAppDomainAtId(ADID index) if (!SystemDomain::IsUnderDomainLock() && !IsGCThread()) { MODE_COOPERATIVE;} else { DISABLED(MODE_ANY);} #endif GC_NOTRIGGER; - SO_TOLERANT; NOTHROW; } CONTRACTL_END; @@ -3152,7 +3150,6 @@ StackWalkAction SystemDomain::CallersMethodCallbackWithStackMark(CrawlFrame* pCf THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; INJECT_FAULT(COMPlusThrowOM();); } CONTRACTL_END; @@ -3294,7 +3291,6 @@ StackWalkAction SystemDomain::CallersMethodCallbackWithStackMark(CrawlFrame* pCf StackWalkAction SystemDomain::CallersMethodCallback(CrawlFrame* pCf, VOID* data) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; MethodDesc *pFunc = pCf->GetFunction(); /* We asked to be called back only for functions */ @@ -4739,7 +4735,6 @@ public: void Invoke() { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_INTOLERANT; SetupThread(); pThis->LoadDomainAssembly(pSpec, pFile, targetLevel); } @@ -6202,10 +6197,6 @@ EndTry2:; } { - // This is not executed for SO exceptions so we need to disable the backout - // stack validation to prevent false violations from being reported. - DISABLE_BACKOUT_STACK_VALIDATION; - BOOL fFailure = PostBindResolveAssembly(pSpec, &NewSpec, ex->GetHR(), &pFailedSpec); if (fFailure) { @@ -6753,7 +6744,6 @@ BOOL AppDomain::StopEEAndUnwindThreads(unsigned int retryCount, BOOL *pFMarkUnlo THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -7096,11 +7086,9 @@ DWORD DomainLocalModule::GetClassFlags(MethodTable* pMT, DWORD iClassIndex /*=(D CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; - { // SO tolerance exception for debug-only assertion. - CONTRACT_VIOLATION(SOToleranceViolation); + { CONSISTENCY_CHECK(GetDomainFile()->GetModule() == pMT->GetModuleForStatics()); } @@ -7796,7 +7784,6 @@ UINT32 BaseDomain::LookupTypeID(PTR_MethodTable pMT) { CONTRACTL { NOTHROW; - SO_TOLERANT; WRAPPER(GC_TRIGGERS); PRECONDITION(pMT->GetDomain() == this); } CONTRACTL_END; @@ -7808,7 +7795,6 @@ UINT32 BaseDomain::LookupTypeID(PTR_MethodTable pMT) PTR_MethodTable BaseDomain::LookupType(UINT32 id) { CONTRACTL { NOTHROW; - SO_TOLERANT; WRAPPER(GC_TRIGGERS); CONSISTENCY_CHECK(id != TYPE_ID_THIS_CLASS); } CONTRACTL_END; @@ -7827,7 +7813,6 @@ void BaseDomain::RemoveTypesFromTypeIDMap(LoaderAllocator* pLoaderAllocator) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; m_typeIDMap.RemoveTypes(pLoaderAllocator); diff --git a/src/vm/appdomain.hpp b/src/vm/appdomain.hpp index 8e13b51a46..e949af29a6 100644 --- a/src/vm/appdomain.hpp +++ b/src/vm/appdomain.hpp @@ -306,7 +306,6 @@ struct DomainLocalModule { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; SUPPORTS_DAC; } @@ -337,7 +336,6 @@ struct DomainLocalModule { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; SUPPORTS_DAC; } @@ -1073,7 +1071,6 @@ public: ADID GetId (void) { LIMITED_METHOD_DAC_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return m_dwId; } @@ -1086,7 +1083,6 @@ public: virtual PTR_AppDomain AsAppDomain() { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE(!"Not an AppDomain"); return NULL; } @@ -2902,7 +2898,6 @@ private: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/array.cpp b/src/vm/array.cpp index b93657c432..d5366a28d1 100644 --- a/src/vm/array.cpp +++ b/src/vm/array.cpp @@ -1295,7 +1295,6 @@ void ArrayStubCache::CompileStub(const BYTE *pRawStub, UINT ArrayStubCache::Length(const BYTE *pRawStub) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return ((ArrayOpScript*)pRawStub)->Length(); } diff --git a/src/vm/assembly.cpp b/src/vm/assembly.cpp index 4bd4a18b03..cdbcbf42d0 100644 --- a/src/vm/assembly.cpp +++ b/src/vm/assembly.cpp @@ -381,9 +381,6 @@ Assembly * Assembly::Create( NewHolder<Assembly> pAssembly (new Assembly(pDomain, pFile, debuggerFlags, fIsCollectible)); - // If there are problems that arise from this call stack, we'll chew up a lot of stack - // with the various EX_TRY/EX_HOOKs that we will encounter. - INTERIOR_STACK_PROBE_FOR(GetThread(), DEFAULT_ENTRY_PROBE_SIZE); #ifdef PROFILING_SUPPORTED { BEGIN_PIN_PROFILER(CORProfilerTrackAssemblyLoads()); @@ -412,7 +409,6 @@ Assembly * Assembly::Create( EX_END_HOOK; #endif pAssembly.SuppressRelease(); - END_INTERIOR_STACK_PROBE; return pAssembly; } // Assembly::Create @@ -758,7 +754,6 @@ DomainAssembly *Assembly::FindDomainAssembly(AppDomain *pDomain) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACT_END; diff --git a/src/vm/assemblynative.cpp b/src/vm/assemblynative.cpp index 30698cc13a..4167263c1e 100644 --- a/src/vm/assemblynative.cpp +++ b/src/vm/assemblynative.cpp @@ -27,7 +27,6 @@ #include "interoputil.h" #include "frames.h" #include "typeparse.h" -#include "stackprobe.h" #include "appdomainnative.hpp" #include "../binder/inc/clrprivbindercoreclr.h" diff --git a/src/vm/assemblyspec.cpp b/src/vm/assemblyspec.cpp index b2d33b301c..85d26c6e4b 100644 --- a/src/vm/assemblyspec.cpp +++ b/src/vm/assemblyspec.cpp @@ -454,7 +454,6 @@ void AssemblySpec::AssemblyNameInit(ASSEMBLYNAMEREF* pAsmName, PEImage* pImageIn THROWS; MODE_COOPERATIVE; GC_TRIGGERS; - SO_INTOLERANT; PRECONDITION(IsProtectedByGCFrame (pAsmName)); } CONTRACTL_END; diff --git a/src/vm/assemblyspec.hpp b/src/vm/assemblyspec.hpp index 97bbd5faa7..2960aea95a 100644 --- a/src/vm/assemblyspec.hpp +++ b/src/vm/assemblyspec.hpp @@ -19,7 +19,6 @@ #include "memorypool.h" #include "assemblyspecbase.h" #include "domainfile.h" -#include "genericstackprobe.h" #include "holder.h" class AppDomain; diff --git a/src/vm/binder.cpp b/src/vm/binder.cpp index 3507ad1927..5aaf976ae2 100644 --- a/src/vm/binder.cpp +++ b/src/vm/binder.cpp @@ -475,7 +475,6 @@ void MscorlibBinder::TriggerGCUnderStress() { THROWS; GC_TRIGGERS; - SO_TOLERANT; INJECT_FAULT(ThrowOutOfMemory()); } CONTRACTL_END; diff --git a/src/vm/callhelpers.cpp b/src/vm/callhelpers.cpp index 7b5396a5f0..e194161182 100644 --- a/src/vm/callhelpers.cpp +++ b/src/vm/callhelpers.cpp @@ -25,12 +25,6 @@ void AssertMulticoreJitAllowedModule(PCODE pTarget) { - CONTRACTL - { - SO_NOT_MAINLINE; - } - CONTRACTL_END; - MethodDesc* pMethod = Entry2MethodDesc(pTarget, NULL); Module * pModule = pMethod->GetModule_NoLogging(); @@ -60,8 +54,6 @@ void CallDescrWorkerWithHandler( CallDescrData * pCallDescrData, BOOL fCriticalCall) { - STATIC_CONTRACT_SO_INTOLERANT; - #if defined(FEATURE_MULTICOREJIT) && defined(_DEBUG) // For multicore JITting, background thread should not call managed code, except when calling system code (e.g. throwing managed exception) @@ -103,7 +95,6 @@ void CallDescrWorker(CallDescrData * pCallDescrData) #endif // 0 STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE(!NingenEnabled() && "You cannot invoke managed code inside the ngen compilation process."); diff --git a/src/vm/callhelpers.h b/src/vm/callhelpers.h index 032cec43ce..f9e738b7b8 100644 --- a/src/vm/callhelpers.h +++ b/src/vm/callhelpers.h @@ -542,13 +542,11 @@ enum EEToManagedCallFlags CURRENT_THREAD->HandleThreadAbort(); \ } \ } \ - BEGIN_SO_TOLERANT_CODE(CURRENT_THREAD); \ INSTALL_CALL_TO_MANAGED_EXCEPTION_HOLDER(); \ INSTALL_COMPLUS_EXCEPTION_HANDLER_NO_DECLARE(); #define END_CALL_TO_MANAGED() \ UNINSTALL_COMPLUS_EXCEPTION_HANDLER(); \ - END_SO_TOLERANT_CODE; \ } /***********************************************************************/ diff --git a/src/vm/ceeload.cpp b/src/vm/ceeload.cpp index 3502b2d561..d824a1497e 100644 --- a/src/vm/ceeload.cpp +++ b/src/vm/ceeload.cpp @@ -1475,18 +1475,15 @@ PTR_Module Module::ComputePreferredZapModule(Module * pDefinitionModule, NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; PTR_Module ret = NULL; - INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(DontCallDirectlyForceStackOverflow()); ret = Module::ComputePreferredZapModuleHelper( pDefinitionModule, classInst, methodInst ); - END_INTERIOR_STACK_PROBE; return ret; } @@ -1661,7 +1658,6 @@ PTR_Module Module::ComputePreferredZapModule(TypeKey *pKey) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } @@ -1687,7 +1683,6 @@ PTR_Module Module::GetPreferredZapModuleForMethodTable(MethodTable *pMT) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } @@ -1695,8 +1690,6 @@ PTR_Module Module::GetPreferredZapModuleForMethodTable(MethodTable *pMT) PTR_Module pRet=NULL; - INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(10, NO_FORBIDGC_LOADER_USE_ThrowSO();); - if (pMT->IsArray()) { TypeHandle elemTH = pMT->GetApproxArrayElementTypeHandle(); @@ -1713,7 +1706,6 @@ PTR_Module Module::GetPreferredZapModuleForMethodTable(MethodTable *pMT) // then its loader module is simply the module containing its TypeDef pRet= pMT->GetModule(); } - END_INTERIOR_STACK_PROBE; return pRet; } @@ -1725,7 +1717,6 @@ PTR_Module Module::GetPreferredZapModuleForTypeDesc(PTR_TypeDesc pTD) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1749,7 +1740,6 @@ PTR_Module Module::GetPreferredZapModuleForTypeHandle(TypeHandle t) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1767,7 +1757,6 @@ PTR_Module Module::GetPreferredZapModuleForMethodDesc(const MethodDesc *pMD) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1796,7 +1785,6 @@ PTR_Module Module::GetPreferredZapModuleForFieldDesc(FieldDesc * pFD) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1814,7 +1802,6 @@ BOOL Module::IsEditAndContinueCapable(Assembly *pAssembly, PEFile *file) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } @@ -1893,7 +1880,6 @@ DomainAssembly* Module::FindDomainAssembly(AppDomain *pDomain) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACT_END; @@ -1932,7 +1918,6 @@ DomainFile *Module::FindDomainFile(AppDomain *pDomain) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACT_END; @@ -2767,7 +2752,6 @@ BOOL Module::IsPreV4Assembly() { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END @@ -4357,7 +4341,6 @@ BOOL Module::IsSigInIL(PCCOR_SIGNATURE signature) FORBID_FAULT; MODE_ANY; NOTHROW; - SO_TOLERANT; GC_NOTRIGGER; } CONTRACTL_END; @@ -5727,7 +5710,6 @@ PTR_TADDR LookupMapBase::GetElementPtr(DWORD rid) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -5788,7 +5770,6 @@ INT32 LookupMapBase::GetNextCompressedEntry(BitStreamReader *pTableStream, INT32 NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; PRECONDITION(MapIsCompressed()); } @@ -5818,7 +5799,6 @@ TADDR LookupMapBase::GetValueFromCompressedMap(DWORD rid) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; PRECONDITION(MapIsCompressed()); } @@ -6173,7 +6153,6 @@ HRESULT Module::GetPropertyInfoForMethodDef(mdMethodDef md, mdProperty *ppd, LPC NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -6304,7 +6283,6 @@ BOOL Module::MightContainMatchingProperty(mdProperty tkProperty, ULONG nameHash) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -10034,7 +10012,6 @@ BYTE *Module::GetNativeFixupBlobData(RVA rva) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; POSTCONDITION(CheckPointer(RETVAL)); } CONTRACT_END; @@ -10182,7 +10159,6 @@ BOOL Module::IsZappedCode(PCODE code) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -10217,7 +10193,6 @@ BOOL Module::IsZappedPrecode(PCODE code) NOTHROW; GC_NOTRIGGER; SUPPORTS_DAC; - SO_TOLERANT; } CONTRACTL_END; @@ -10241,7 +10216,6 @@ PCCOR_SIGNATURE Module::GetEncodedSig(RVA fixupRva, Module **ppDefiningModule) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; POSTCONDITION(CheckPointer(RETVAL)); SUPPORTS_DAC; } @@ -10268,7 +10242,6 @@ PCCOR_SIGNATURE Module::GetEncodedSigIfLoaded(RVA fixupRva, Module **ppDefiningM NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; POSTCONDITION(CheckPointer(RETVAL)); SUPPORTS_DAC; } @@ -14161,10 +14134,6 @@ void Module::ExpandAll() } CONTRACTL_END; - //This is called from inside EEStartupHelper, so it breaks the SO rules. However, this is debug only - //(and only supported for limited jit testing), so it's ok here. - CONTRACT_VIOLATION(SOToleranceViolation); - //If the EE isn't started yet, it's not safe to jit. We fail in COM jitting a p/invoke. if (!g_fEEStarted) return; diff --git a/src/vm/ceeload.h b/src/vm/ceeload.h index 497c79e1dc..aa0b7894c1 100644 --- a/src/vm/ceeload.h +++ b/src/vm/ceeload.h @@ -2608,7 +2608,6 @@ public: GC_NOTRIGGER; SUPPORTS_DAC; CANNOT_TAKE_LOCK; - SO_TOLERANT; } CONTRACT_END; diff --git a/src/vm/ceeload.inl b/src/vm/ceeload.inl index 20c8d8cbdf..4997f574d3 100644 --- a/src/vm/ceeload.inl +++ b/src/vm/ceeload.inl @@ -400,7 +400,6 @@ inline MethodDesc *Module::LookupMethodDef(mdMethodDef token) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } diff --git a/src/vm/ceemain.cpp b/src/vm/ceemain.cpp index 6186a0ca2f..3b50c02f46 100644 --- a/src/vm/ceemain.cpp +++ b/src/vm/ceemain.cpp @@ -156,7 +156,6 @@ #include "util.hpp" #include "shimload.h" #include "comthreadpool.h" -#include "stackprobe.h" #include "posterror.h" #include "virtualcallstub.h" #include "strongnameinternal.h" @@ -416,7 +415,6 @@ HRESULT EnsureEEStarted(COINITIEE flags) static BOOL WINAPI DbgCtrlCHandler(DWORD dwCtrlType) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; #if defined(DEBUGGING_SUPPORTED) // Note that if a managed-debugger is attached, it's actually attached with the native @@ -519,7 +517,6 @@ void InitGSCookie() { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -943,14 +940,6 @@ void EEStartupHelper(COINITIEE fFlags) StackwalkCache::Init(); - // In coreclr, clrjit is compiled into it, but SO work in clrjit has not been done. -#ifdef FEATURE_STACK_PROBE - if (CLRHosted() && GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) == eRudeUnloadAppDomain) - { - InitStackProbes(); - } -#endif - // This isn't done as part of InitializeGarbageCollector() above because it // requires write barriers to have been set up on x86, which happens as part // of InitJITHelpers1. @@ -1276,7 +1265,7 @@ static void ExternalShutdownHelper(int exitCode, ShutdownCompleteAction sca) ENTRY_POINT; } CONTRACTL_END; - CONTRACT_VIOLATION(GCViolation | ModeViolation | SOToleranceViolation); + CONTRACT_VIOLATION(GCViolation | ModeViolation); if (g_fEEShutDown || !g_fEEStarted) return; @@ -1809,8 +1798,6 @@ part2: SystemDomain::DetachEnd(); } - TerminateStackProbes(); - // Unregister our vectored exception and continue handlers from the OS. // This will ensure that if any other DLL unload (after ours) has an exception, // we wont attempt to process that exception (which could lead to various @@ -1954,9 +1941,6 @@ static LONG s_ActiveShutdownThreadCount = 0; // DWORD WINAPI EEShutDownProcForSTAThread(LPVOID lpParameter) { - STATIC_CONTRACT_SO_INTOLERANT;; - - ClrFlsSetThreadType(ThreadType_ShutdownHelper); EEShutDownHelper(FALSE); @@ -2024,7 +2008,6 @@ void STDMETHODCALLTYPE EEShutDown(BOOL fIsDllUnloading) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; // we don't need to cleanup 'cus we're shutting down PRECONDITION(g_fEEStarted); } CONTRACTL_END; @@ -2034,14 +2017,6 @@ void STDMETHODCALLTYPE EEShutDown(BOOL fIsDllUnloading) return; } - // Stop stack probing and asserts right away. Once we're shutting down, we can do no more. - // And we don't want to SO-protect anything at this point anyway. This really only has impact - // on a debug build. - TerminateStackProbes(); - - // The process is shutting down. No need to check SO contract. - SO_NOT_MAINLINE_FUNCTION; - // We only do the first part of the shutdown once. static LONG OnlyOne = -1; @@ -2173,7 +2148,6 @@ NOINLINE BOOL CanRunManagedCodeRare(LoaderLockCheck::kind checkKind, HINSTANCE h NOTHROW; if (checkKind == LoaderLockCheck::ForMDA) { GC_TRIGGERS; } else { GC_NOTRIGGER; }; // because of the CustomerDebugProbe MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; // If we are shutting down the runtime, then we cannot run code. @@ -2233,7 +2207,6 @@ BOOL CanRunManagedCode(LoaderLockCheck::kind checkKind, HINSTANCE hInst /*= 0*/) NOTHROW; if (checkKind == LoaderLockCheck::ForMDA) { GC_TRIGGERS; } else { GC_NOTRIGGER; }; // because of the CustomerDebugProbe MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; // Special-case the common success cases @@ -2278,7 +2251,6 @@ HRESULT STDAPICALLTYPE CoInitializeEE(DWORD fFlags) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -2322,7 +2294,6 @@ BOOL ExecuteDLL_ReturnOrThrow(HRESULT hr, BOOL fFromThunk) if (fFromThunk) THROWS; else NOTHROW; WRAPPER(GC_TRIGGERS); MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; // If we have a failure result, and we're called from a thunk, @@ -2396,10 +2367,6 @@ BOOL STDMETHODCALLTYPE EEDllMain( // TRUE on success, FALSE on error. STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_TRIGGERS; - // this runs at the top of a thread, SO is not a concern here... - STATIC_CONTRACT_SO_NOT_MAINLINE; - - // HRESULT hr; // BEGIN_EXTERNAL_ENTRYPOINT(&hr); // EE isn't spun up enough to use this macro @@ -2453,12 +2420,6 @@ BOOL STDMETHODCALLTYPE EEDllMain( // TRUE on success, FALSE on error. _ASSERTE(pParam->lpReserved || !g_fEEStarted); g_fProcessDetach = TRUE; -#if defined(ENABLE_CONTRACTS_IMPL) && defined(FEATURE_STACK_PROBE) - // We are shutting down process. No need to check SO contract. - // And it is impossible to enforce SO contract in global dtor, like ModIntPairList. - g_EnableDefaultRWValidation = FALSE; -#endif - if (g_fEEStarted) { // GetThread() may be set to NULL for Win9x during shutdown. @@ -2671,7 +2632,6 @@ static HRESULT GetThreadUICultureNames(__inout StringArrayList* pCultureNames) GC_NOTRIGGER; MODE_ANY; PRECONDITION(CheckPointer(pCultureNames)); - SO_INTOLERANT; } CONTRACTL_END; @@ -2791,7 +2751,6 @@ void SetLatchedExitCode (INT32 code) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -2819,7 +2778,6 @@ static int GetThreadUICultureId(__out LocaleIDValue* pLocale) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT;; } CONTRACTL_END; @@ -2892,7 +2850,6 @@ static int GetThreadUICultureId(__out LocaleIDValue* pLocale) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT;; } CONTRACTL_END; _ASSERTE(sizeof(LocaleIDValue)/sizeof(WCHAR) >= LOCALE_NAME_MAX_LENGTH); @@ -2974,7 +2931,6 @@ BOOL AreAnyViolationBitsOn() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/class.cpp b/src/vm/class.cpp index 8c51e6384f..5ec3721ac7 100644 --- a/src/vm/class.cpp +++ b/src/vm/class.cpp @@ -1797,7 +1797,6 @@ LPCUTF8 MethodTable::GetFullyQualifiedNameInfo(LPCUTF8 *ppszNamespace) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END @@ -2386,7 +2385,6 @@ WORD SparseVTableMap::LookupVTSlot(WORD MTSlot) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END @@ -3173,7 +3171,6 @@ DWORD EEClass::GetPackableField(EEClassFieldId eField) GC_NOTRIGGER; MODE_ANY; SUPPORTS_DAC; - SO_TOLERANT; } CONTRACTL_END; @@ -3192,7 +3189,6 @@ void EEClass::SetPackableField(EEClassFieldId eField, DWORD dwValue) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/classcompat.cpp b/src/vm/classcompat.cpp index e96ed2a024..d442f11870 100644 --- a/src/vm/classcompat.cpp +++ b/src/vm/classcompat.cpp @@ -39,7 +39,6 @@ #include "listlock.h" #include "methodimpl.h" #include "guidfromname.h" -#include "stackprobe.h" #include "encee.h" #include "encee.h" #include "comsynchronizable.h" diff --git a/src/vm/classcompat.h b/src/vm/classcompat.h index a958a30167..609f1e546b 100644 --- a/src/vm/classcompat.h +++ b/src/vm/classcompat.h @@ -361,7 +361,6 @@ private: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/classfactory.cpp b/src/vm/classfactory.cpp index 3c5a97ae05..6f88a5c137 100644 --- a/src/vm/classfactory.cpp +++ b/src/vm/classfactory.cpp @@ -75,7 +75,6 @@ public: NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppv, NULL_OK)); } CONTRACTL_END; @@ -103,7 +102,6 @@ public: NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -120,7 +118,6 @@ public: NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(m_cbRefCount > 0); } CONTRACTL_END; @@ -143,15 +140,6 @@ public: { HRESULT hr = S_OK; #ifdef FEATURE_CORRUPTING_EXCEPTIONS - // SetupForComCallHR uses "SO_INTOLERANT_CODE_NOTHROW" to setup the SO-Intolerant transition - // for COM Interop. However, "SO_INTOLERANT_CODE_NOTHROW" expects that no exception can escape - // through this boundary but all it does is (in addition to checking that no exception has escaped it) - // do stack probing. - // - // However, Corrupting Exceptions [CE] can escape the COM Interop boundary. Thus, to address that scenario, - // we use the macro below that uses BEGIN_SO_INTOLERANT_CODE_NOTHROW to do the equivalent of - // SO_INTOLERANT_CODE_NOTHROW and yet allow for CEs to escape through. Since there will be a corresponding - // END_SO_INTOLERANT_CODE, the call is splitted into two parts: the Begin and End (see below). BeginSetupForComCallHRWithEscapingCorruptingExceptions(); #else // !FEATURE_CORRUPTING_EXCEPTIONS SetupForComCallHR(); @@ -166,7 +154,6 @@ public: #endif // FEATURE_CORRUPTING_EXCEPTIONS GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -196,7 +183,6 @@ public: NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -212,15 +198,6 @@ public: HRESULT hr = S_OK; #ifdef FEATURE_CORRUPTING_EXCEPTIONS - // SetupForComCallHR uses "SO_INTOLERANT_CODE_NOTHROW" to setup the SO-Intolerant transition - // for COM Interop. However, "SO_INTOLERANT_CODE_NOTHROW" expects that no exception can escape - // through this boundary but all it does is (in addition to checking that no exception has escaped it) - // do stack probing. - // - // However, Corrupting Exceptions [CE] can escape the COM Interop boundary. Thus, to address that scenario, - // we use the macro below that uses BEGIN_SO_INTOLERANT_CODE_NOTHROW to do the equivalent of - // SO_INTOLERANT_CODE_NOTHROW and yet allow for CEs to escape through. Since there will be a corresponding - // END_SO_INTOLERANT_CODE, the call is splitted into two parts: the Begin and End (see below). BeginSetupForComCallHRWithEscapingCorruptingExceptions(); #else // !FEATURE_CORRUPTING_EXCEPTIONS SetupForComCallHR(); @@ -236,7 +213,6 @@ public: GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -283,15 +259,6 @@ done: ; HRESULT hr = S_OK; #ifdef FEATURE_CORRUPTING_EXCEPTIONS - // SetupForComCallHR uses "SO_INTOLERANT_CODE_NOTHROW" to setup the SO-Intolerant transition - // for COM Interop. However, "SO_INTOLERANT_CODE_NOTHROW" expects that no exception can escape - // through this boundary but all it does is (in addition to checking that no exception has escaped it) - // do stack probing. - // - // However, Corrupting Exceptions [CE] can escape the COM Interop boundary. Thus, to address that scenario, - // we use the macro below that uses BEGIN_SO_INTOLERANT_CODE_NOTHROW to do the equivalent of - // SO_INTOLERANT_CODE_NOTHROW and yet allow for CEs to escape through. Since there will be a corresponding - // END_SO_INTOLERANT_CODE, the call is splitted into two parts: the Begin and End (see below). BeginSetupForComCallHRWithEscapingCorruptingExceptions(); #else // !FEATURE_CORRUPTING_EXCEPTIONS SetupForComCallHR(); @@ -306,7 +273,6 @@ done: ; #endif // FEATURE_CORRUPTING_EXCEPTIONS GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -343,7 +309,6 @@ private: GC_TRIGGERS; MODE_ANY; INJECT_FAULT(COMPlusThrowOM();); - SO_TOLERANT; } CONTRACTL_END; @@ -355,10 +320,8 @@ private: MethodTable* tempMT = NULL; EX_TRY { - BEGIN_SO_INTOLERANT_CODE(pThread); GCX_COOP(); tempMT = GetTypeForCLSID(m_ClsId); - END_SO_INTOLERANT_CODE; } EX_CATCH { @@ -387,7 +350,6 @@ STDMETHODIMP EEClassFactory::GetLicInfo(LPLICINFO pLicInfo) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -451,7 +413,6 @@ STDMETHODIMP EEClassFactory::RequestLicKey(DWORD dwReserved, BSTR * pbstrKey) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -596,7 +557,6 @@ HRESULT STDMETHODCALLTYPE EEAllocateInstance(LPUNKNOWN pOuter, MethodTable* pMT, #endif // FEATURE_CORRUPTING_EXCEPTIONS GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pMT)); PRECONDITION(CheckPointer(ppv, NULL_OK)); } @@ -739,7 +699,6 @@ HRESULT STDMETHODCALLTYPE EEDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVO NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppv, NULL_OK)); } CONTRACTL_END; @@ -758,10 +717,8 @@ HRESULT STDMETHODCALLTYPE EEDllGetClassObject(REFCLSID rclsid, REFIID riid, LPVO { Thread *pThread = GetThread(); - BEGIN_SO_INTOLERANT_CODE(pThread); GCX_COOP(); pMT = GetTypeForCLSID(rclsid); - END_SO_INTOLERANT_CODE; } // If we can't find the class based on the CLSID or if the registered managed @@ -836,7 +793,6 @@ STDAPI ClrCreateManagedInstance(LPCWSTR typeName, REFIID riid, LPVOID FAR *ppv) DISABLED(NOTHROW); GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(typeName, NULL_OK)); PRECONDITION(CheckPointer(ppv, NULL_OK)); } diff --git a/src/vm/classhash.cpp b/src/vm/classhash.cpp index 31c7e84906..3b01441b37 100644 --- a/src/vm/classhash.cpp +++ b/src/vm/classhash.cpp @@ -722,7 +722,6 @@ public: virtual void UseKeys(__in_ecount(2) LPUTF8 *pKey1) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; SUPPORTS_DAC; bReturn = ( diff --git a/src/vm/clrex.cpp b/src/vm/clrex.cpp index 6b2878667b..5f4354bee4 100644 --- a/src/vm/clrex.cpp +++ b/src/vm/clrex.cpp @@ -45,7 +45,6 @@ CLRException::~CLRException() { CAN_TAKE_LOCK; // because of DestroyHandle } - SO_TOLERANT; } CONTRACTL_END; @@ -159,12 +158,6 @@ OBJECTREF CLRException::GetThrowable() if (throwable == NULL) { - // We need to disable the backout stack validation at this point since GetThrowable can - // take arbitrarily large amounts of stack for different exception types; however we know - // for a fact that we will never go through this code path if the exception is a stack - // overflow exception since we already handled that case above with the pre-allocated SO exception. - DISABLE_BACKOUT_STACK_VALIDATION; - class RestoreLastException { Thread *m_pThread; @@ -230,7 +223,6 @@ OBJECTREF CLRException::GetThrowable() } { - DISABLE_BACKOUT_STACK_VALIDATION; if (throwable == NULL) { STRESS_LOG0(LF_EH, LL_INFO100, "CLRException::GetThrowable: We have failed to track exceptions accurately through the system.\n"); @@ -282,21 +274,11 @@ HRESULT CLRException::GetHR() DISABLED(NOTHROW); GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; - HRESULT hr = E_FAIL; - - BEGIN_SO_INTOLERANT_CODE(GetThread()); - -// Is it legal to switch to GCX_COOP in a SO_TOLERANT region? GCX_COOP(); - hr = GetExceptionHResult(GetThrowable()); - - END_SO_INTOLERANT_CODE; - - return hr; + return GetExceptionHResult(GetThrowable()); } #ifdef FEATURE_COMINTEROP @@ -307,7 +289,6 @@ HRESULT CLRException::SetErrorInfo() GC_TRIGGERS; NOTHROW; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -368,7 +349,6 @@ IErrorInfo *CLRException::GetErrorInfo() GC_TRIGGERS; THROWS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -379,9 +359,6 @@ IErrorInfo *CLRException::GetErrorInfo() // Not all codepaths expect to have it initialized (e.g. hosting APIs). if (g_fComStarted) { - // We probe here for SO since GetThrowable and GetComIPFromObjectRef are SO intolerant - BEGIN_SO_INTOLERANT_CODE(GetThread()); - // Get errorinfo only when our SO probe succeeds { // Switch to coop mode since GetComIPFromObjectRef requires that @@ -400,8 +377,6 @@ IErrorInfo *CLRException::GetErrorInfo() GCPROTECT_END(); } - - END_SO_INTOLERANT_CODE; } else { @@ -550,7 +525,6 @@ BOOL CLRException::IsPreallocatedExceptionObject(OBJECTREF o) GC_NOTRIGGER; MODE_COOPERATIVE; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -590,7 +564,6 @@ BOOL CLRException::IsPreallocatedExceptionHandle(OBJECTHANDLE h) GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -625,7 +598,6 @@ OBJECTHANDLE CLRException::GetPreallocatedHandleForObject(OBJECTREF o) GC_NOTRIGGER; MODE_COOPERATIVE; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -667,7 +639,6 @@ OBJECTREF CLRException::GetBestOutOfMemoryException() { NOTHROW; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -677,15 +648,11 @@ OBJECTREF CLRException::GetBestOutOfMemoryException() { FAULT_NOT_FATAL(); - BEGIN_SO_INTOLERANT_CODE(GetThread()); - EXCEPTIONREF pOutOfMemory = (EXCEPTIONREF)AllocateObject(g_pOutOfMemoryExceptionClass); pOutOfMemory->SetHResult(COR_E_OUTOFMEMORY); pOutOfMemory->SetXCode(EXCEPTION_COMPLUS); retVal = pOutOfMemory; - - END_SO_INTOLERANT_CODE; } EX_CATCH { @@ -708,7 +675,6 @@ OBJECTREF CLRException::GetThrowableFromException(Exception *pException) GC_TRIGGERS; NOTHROW; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; @@ -885,7 +851,6 @@ OBJECTREF CLRException::GetThrowableFromExceptionRecord(EXCEPTION_RECORD *pExcep GC_NOTRIGGER; NOTHROW; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -902,7 +867,6 @@ void CLRException::HandlerState::CleanupTry() STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; if (m_pThread != NULL) { @@ -932,7 +896,6 @@ void CLRException::HandlerState::SetupCatch(INDEBUG_COMMA(__in_z const char * sz STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_ANY; STATIC_CONTRACT_CANNOT_TAKE_LOCK; - STATIC_CONTRACT_SO_TOLERANT; bool fVMInitialized = g_fEEStarted?true:false; Exception::HandlerState::SetupCatch(INDEBUG_COMMA(szFile) lineNum, fVMInitialized); @@ -948,7 +911,7 @@ void CLRException::HandlerState::SetupCatch(INDEBUG_COMMA(__in_z const char * sz if (!DidCatchCxx()) { - if (IsSOExceptionCode(exceptionCode)) + if (exceptionCode == STATUS_STACK_OVERFLOW) { // Handle SO exception // @@ -988,7 +951,6 @@ void CLRException::HandlerState::SucceedCatch() STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_ANY; STATIC_CONTRACT_CANNOT_TAKE_LOCK; - STATIC_CONTRACT_SO_TOLERANT; LOG((LF_EH, LL_INFO100, "EX_CATCH catch succeeded (CLRException::HandlerState)\n")); @@ -2545,7 +2507,6 @@ void GetLastThrownObjectExceptionFromThread_Internal(Exception **ppException) GC_TRIGGERS; THROWS; MODE_ANY; - SO_TOLERANT; // no risk of an SO after we've allocated the object here } CONTRACTL_END; diff --git a/src/vm/clrex.h b/src/vm/clrex.h index a550a71874..87ad5d056e 100644 --- a/src/vm/clrex.h +++ b/src/vm/clrex.h @@ -12,6 +12,11 @@ #ifndef _CLREX_H_ #define _CLREX_H_ +// BCL classnativelib includes <ex.h> first +#ifndef VM_NO_SO_INFRASTRUCTURE_CODE +#define VM_NO_SO_INFRASTRUCTURE_CODE(x) x +#endif + #include <ex.h> #include "runtimeexceptionkind.h" @@ -811,11 +816,6 @@ class EEFileLoadException : public EEException #define GET_EXCEPTION() (__pException == NULL ? __defaultException.Validate() : __pException.GetValue()) #endif // _DEBUG -// When we throw an exception, we need stay in SO-intolerant state and -// probe for sufficient stack so that we don't SO during the processing. -#undef HANDLE_SO_TOLERANCE_FOR_THROW -#define HANDLE_SO_TOLERANCE_FOR_THROW STACK_PROBE_FOR_THROW(GetThread()); - LONG CLRNoCatchHandler(EXCEPTION_POINTERS* pExceptionInfo, PVOID pv); // Re-define the macro to add automatic restoration of the guard page to PAL_EXCEPT and PAL_EXCEPT_FILTER and @@ -899,9 +899,7 @@ LONG CLRNoCatchHandler(EXCEPTION_POINTERS* pExceptionInfo, PVOID pv); #undef EX_ENDTRY #define EX_ENDTRY \ PAL_CPP_ENDTRY \ - SO_INFRASTRUCTURE_CODE(if (__state.DidCatch()) { RESTORE_SO_TOLERANCE_STATE; }) \ - SO_INFRASTRUCTURE_CODE(if (__state.DidCatchSO()) { HANDLE_STACKOVERFLOW_AFTER_CATCH; }) \ - NO_SO_INFRASTRUCTURE_CODE_ASSERTE(!__state.DidCatchSO()) \ + _ASSERTE(!__state.DidCatchSO()); // CLRException::GetErrorInfo below invokes GetComIPFromObjectRef @@ -1011,14 +1009,12 @@ NOINLINE BOOL HasIllegalReentrancyRare(); } \ if (CURRENT_THREAD != NULL) \ { \ - BEGIN_SO_INTOLERANT_CODE_NOTHROW(CURRENT_THREAD, *__phr = COR_E_STACKOVERFLOW); \ EX_TRY_THREAD(CURRENT_THREAD); \ { \ #define END_EXTERNAL_ENTRYPOINT \ } \ EX_CATCH_HRESULT(*__phr); \ - END_SO_INTOLERANT_CODE; \ } \ } \ } \ @@ -1032,7 +1028,6 @@ NOINLINE BOOL HasIllegalReentrancyRare(); *__phr = GET_EXCEPTION()->GetHR(); \ } \ EX_END_CATCH(RethrowCorruptingExceptionsEx(fCond)); \ - END_SO_INTOLERANT_CODE; \ } \ } \ } \ diff --git a/src/vm/clrex.inl b/src/vm/clrex.inl index 06c82f8a40..100cf51b36 100644 --- a/src/vm/clrex.inl +++ b/src/vm/clrex.inl @@ -18,7 +18,6 @@ inline CLRException::HandlerState::HandlerState(Thread * pThread) STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_ANY; STATIC_CONTRACT_CANNOT_TAKE_LOCK; - STATIC_CONTRACT_SO_TOLERANT; m_pThread = pThread; if (m_pThread == NULL) @@ -39,7 +38,6 @@ inline CLRException::HandlerState::HandlerState(Thread * pThread, CLRException:: STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_ANY; STATIC_CONTRACT_CANNOT_TAKE_LOCK; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE(pThread != NULL); m_pThread = pThread; diff --git a/src/vm/clsload.cpp b/src/vm/clsload.cpp index 90fb070518..7b35d1883b 100644 --- a/src/vm/clsload.cpp +++ b/src/vm/clsload.cpp @@ -36,7 +36,6 @@ #include "typehash.h" #include "comdelegate.h" #include "array.h" -#include "stackprobe.h" #include "posterror.h" #include "wrappers.h" #include "generics.h" @@ -86,7 +85,6 @@ PTR_Module ClassLoader::ComputeLoaderModuleWorker( MODE_ANY; PRECONDITION(CheckPointer(pDefinitionModule, NULL_OK)); POSTCONDITION(CheckPointer(RETVAL)); - SO_INTOLERANT; SUPPORTS_DAC; } CONTRACT_END @@ -209,7 +207,6 @@ PTR_Module ClassLoader::ComputeLoaderModuleForCompilation( MODE_ANY; PRECONDITION(CheckPointer(pDefinitionModule, NULL_OK)); POSTCONDITION(CheckPointer(RETVAL)); - SO_INTOLERANT; } CONTRACT_END @@ -1147,7 +1144,6 @@ TypeHandle ClassLoader::LoadConstructedTypeThrowing(TypeKey *pKey, if (FORBIDGC_LOADER_USE_ENABLED()) GC_NOTRIGGER; else GC_TRIGGERS; if (FORBIDGC_LOADER_USE_ENABLED()) FORBID_FAULT; else { INJECT_FAULT(COMPlusThrowOM()); } if (FORBIDGC_LOADER_USE_ENABLED() || fLoadTypes != LoadTypes) { LOADS_TYPE(CLASS_LOAD_BEGIN); } else { LOADS_TYPE(level); } - if (fLoadTypes == DontLoadTypes) SO_TOLERANT; else SO_INTOLERANT; PRECONDITION(CheckPointer(pKey)); PRECONDITION(level > CLASS_LOAD_BEGIN && level <= CLASS_LOADED); PRECONDITION(CheckPointer(pInstContext, NULL_OK)); @@ -1235,8 +1231,6 @@ void ClassLoader::EnsureLoaded(TypeHandle typeHnd, ClassLoadLevel level) if (typeHnd.GetLoadLevel() < level) { - INTERIOR_STACK_PROBE_CHECK_THREAD; - #ifdef FEATURE_PREJIT if (typeHnd.GetLoadLevel() == CLASS_LOAD_UNRESTOREDTYPEKEY) { @@ -1250,8 +1244,6 @@ void ClassLoader::EnsureLoaded(TypeHandle typeHnd, ClassLoadLevel level) Module *pLoaderModule = ComputeLoaderModule(&typeKey); pLoaderModule->GetClassLoader()->LoadTypeHandleForTypeKey(&typeKey, typeHnd, level); } - - END_INTERIOR_STACK_PROBE; } #endif // DACCESS_COMPILE @@ -1780,8 +1772,6 @@ ClassLoader::LoadTypeHandleThrowing( } CONTRACT_END TypeHandle typeHnd; - INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(RETURN_FROM_INTERIOR_PROBE(TypeHandle())); - Module * pFoundModule = NULL; mdToken FoundCl; HashedTypeEntry foundEntry; @@ -1944,7 +1934,6 @@ ClassLoader::LoadTypeHandleThrowing( #endif // !DACCESS_COMPILE } - END_INTERIOR_STACK_PROBE; RETURN typeHnd; } // ClassLoader::LoadTypeHandleThrowing @@ -2539,10 +2528,6 @@ TypeHandle ClassLoader::LoadTypeDefThrowing(Module *pModule, RETURN(typeHnd); } - // We don't want to probe on any threads except for those with a managed thread. This function - // can be called from the GC thread etc. so need to control how we probe. - INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(goto Exit;); - IMDInternalImport *pInternalImport = pModule->GetMDImport(); #ifndef DACCESS_COMPILE @@ -2667,11 +2652,6 @@ TypeHandle ClassLoader::LoadTypeDefThrowing(Module *pModule, #endif // !DACCESS_COMPILE } -// If stack guards are disabled, then this label is unreferenced and produces a compile error. -#if defined(FEATURE_STACK_PROBE) && !defined(DACCESS_COMPILE) -Exit: -#endif - #ifndef DACCESS_COMPILE if ((fUninstantiated == FailIfUninstDefOrRef) && !typeHnd.IsNull() && typeHnd.IsGenericTypeDefinition()) { @@ -2686,7 +2666,6 @@ Exit: } #endif ; - END_INTERIOR_STACK_PROBE; RETURN(typeHnd); } @@ -3757,15 +3736,6 @@ TypeHandle ClassLoader::LoadTypeHandleForTypeKey(TypeKey *pTypeKey, GCX_PREEMP(); - // Type loading can be recursive. Probe for sufficient stack. - // - // Execution of the FINALLY in LoadTypeHandleForTypeKey_Body can eat - // a lot of stack because LoadTypeHandleForTypeKey_Inner can rethrow - // any non-SO exceptions that it takes, ensure that we have plenty - // of stack before getting into it (>24 pages on AMD64, remember - // that num pages probed is 2*N on AMD64). - INTERIOR_STACK_PROBE_FOR(GetThread(),20); - #ifdef _DEBUG if (LoggingOn(LF_CLASSLOADER, LL_INFO1000)) { @@ -3799,8 +3769,6 @@ TypeHandle ClassLoader::LoadTypeHandleForTypeKey(TypeKey *pTypeKey, PushFinalLevels(typeHnd, targetLevel, pInstContext); - END_INTERIOR_STACK_PROBE; - return typeHnd; } @@ -3826,9 +3794,6 @@ TypeHandle ClassLoader::LoadTypeHandleForTypeKeyNoLock(TypeKey *pTypeKey, TypeHandle typeHnd = TypeHandle(); - // Type loading can be recursive. Probe for sufficient stack. - INTERIOR_STACK_PROBE_FOR(GetThread(),8); - ClassLoadLevel currentLevel = CLASS_LOAD_BEGIN; ClassLoadLevel targetLevelUnderLock = targetLevel < CLASS_DEPENDENCIES_LOADED ? targetLevel : (ClassLoadLevel) (CLASS_DEPENDENCIES_LOADED-1); while (currentLevel < targetLevelUnderLock) @@ -3840,8 +3805,6 @@ TypeHandle ClassLoader::LoadTypeHandleForTypeKeyNoLock(TypeKey *pTypeKey, PushFinalLevels(typeHnd, targetLevel, pInstContext); - END_INTERIOR_STACK_PROBE; - return typeHnd; } @@ -4145,7 +4108,6 @@ ClassLoader::LoadArrayTypeThrowing( if (FORBIDGC_LOADER_USE_ENABLED()) GC_NOTRIGGER; else GC_TRIGGERS; if (FORBIDGC_LOADER_USE_ENABLED()) FORBID_FAULT; else { INJECT_FAULT(COMPlusThrowOM()); } if (FORBIDGC_LOADER_USE_ENABLED() || fLoadTypes != LoadTypes) { LOADS_TYPE(CLASS_LOAD_BEGIN); } else { LOADS_TYPE(level); } - if (fLoadTypes == DontLoadTypes) SO_TOLERANT; else SO_INTOLERANT; MODE_ANY; SUPPORTS_DAC; POSTCONDITION(CheckPointer(RETVAL, ((fLoadTypes == LoadTypes) ? NULL_NOT_OK : NULL_OK))); @@ -5258,9 +5220,6 @@ BOOL ClassLoader::CanAccess( // TRUE if access is all MODE_ANY; } CONTRACT_END; - - // Recursive: CanAccess->CheckAccessMember->CanAccessClass->CanAccess - INTERIOR_STACK_PROBE(GetThread()); AccessCheckOptions accessCheckOptionsNoThrow(accessCheckOptions, FALSE); @@ -5312,13 +5271,11 @@ BOOL ClassLoader::CanAccess( // TRUE if access is all if (!canAccess) { BOOL fail = accessCheckOptions.FailOrThrow(pContext); - RETURN_FROM_INTERIOR_PROBE(fail); + RETURN(fail); } } - RETURN_FROM_INTERIOR_PROBE(TRUE); - - END_INTERIOR_STACK_PROBE; + RETURN(TRUE); } // BOOL ClassLoader::CanAccess() //****************************************************************************** diff --git a/src/vm/clsload.inl b/src/vm/clsload.inl index 7dcd1a5d00..925703ce16 100644 --- a/src/vm/clsload.inl +++ b/src/vm/clsload.inl @@ -68,7 +68,6 @@ inline void AccessCheckOptions::Initialize( { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_ANY; diff --git a/src/vm/codeman.cpp b/src/vm/codeman.cpp index 0e5c18937c..422cc28805 100644 --- a/src/vm/codeman.cpp +++ b/src/vm/codeman.cpp @@ -661,7 +661,6 @@ ExecutionManager::ReaderLockHolder::ReaderLockHolder(HostCallPreference hostCall NOTHROW; if (hostCallPreference == AllowHostCalls) { HOST_CALLS; } else { HOST_NOCALLS; } GC_NOTRIGGER; - SO_TOLERANT; CAN_TAKE_LOCK; } CONTRACTL_END; @@ -696,7 +695,6 @@ ExecutionManager::ReaderLockHolder::~ReaderLockHolder() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -921,7 +919,6 @@ ExecutionManager::ScanFlag ExecutionManager::GetScanFlags() CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; HOST_NOCALLS; SUPPORTS_DAC; } CONTRACTL_END; @@ -3682,7 +3679,6 @@ BOOL EEJitManager::JitCodeToMethodInfo( CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -3725,7 +3721,6 @@ StubCodeBlockKind EEJitManager::GetStubCodeBlockKind(RangeSection * pRangeSectio CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -3741,7 +3736,6 @@ TADDR EEJitManager::FindMethodCode(PCODE currentPC) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -3883,7 +3877,6 @@ PTR_RUNTIME_FUNCTION EEJitManager::LazyGetFunctionEntry(EECodeInfo * pCodeInfo) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -4172,7 +4165,6 @@ ExecutionManager::FindCodeRange(PCODE currentPC, ScanFlag scanFlag) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -4193,7 +4185,6 @@ ExecutionManager::FindCodeRangeWithLock(PCODE currentPC) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -4222,7 +4213,6 @@ MethodDesc * ExecutionManager::GetCodeMethodDesc(PCODE currentPC) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END @@ -4238,7 +4228,6 @@ BOOL ExecutionManager::IsManagedCode(PCODE currentPC) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; if (currentPC == NULL) @@ -4257,7 +4246,6 @@ BOOL ExecutionManager::IsManagedCodeWithLock(PCODE currentPC) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; ReaderLockHolder rlh; @@ -4270,7 +4258,6 @@ BOOL ExecutionManager::IsManagedCode(PCODE currentPC, HostCallPreference hostCal CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; #ifdef DACCESS_COMPILE @@ -4301,7 +4288,6 @@ BOOL ExecutionManager::IsManagedCodeWorker(PCODE currentPC) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; // This may get called for arbitrary code addresses. Note that the lock is @@ -4426,7 +4412,6 @@ RangeSection* ExecutionManager::GetRangeSection(TADDR addr) NOTHROW; HOST_NOCALLS; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -4551,7 +4536,6 @@ PTR_Module ExecutionManager::FindZapModule(TADDR currentData) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; STATIC_CONTRACT_HOST_CALLS; SUPPORTS_DAC; @@ -4582,7 +4566,6 @@ PTR_Module ExecutionManager::FindReadyToRunModule(TADDR currentData) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; STATIC_CONTRACT_HOST_CALLS; SUPPORTS_DAC; @@ -4616,7 +4599,6 @@ PTR_Module ExecutionManager::FindModuleForGCRefMap(TADDR currentData) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -5476,7 +5458,6 @@ BOOL NativeImageJitManager::JitCodeToMethodInfo(RangeSection * pRangeSection, EECodeInfo * pCodeInfo) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; SUPPORTS_DAC; @@ -5832,7 +5813,6 @@ StubCodeBlockKind NativeImageJitManager::GetStubCodeBlockKind(RangeSection * pRa { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -6166,7 +6146,6 @@ int NativeUnwindInfoLookupTable::LookupUnwindInfoForMethod(DWORD RelativePc, int High) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; SUPPORTS_DAC; @@ -6761,7 +6740,6 @@ StubCodeBlockKind ReadyToRunJitManager::GetStubCodeBlockKind(RangeSection * pRan { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -6925,7 +6903,6 @@ BOOL ReadyToRunJitManager::JitCodeToMethodInfo(RangeSection * pRangeSection, CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; diff --git a/src/vm/codeman.h b/src/vm/codeman.h index 13c754379b..e08721c16f 100644 --- a/src/vm/codeman.h +++ b/src/vm/codeman.h @@ -1256,7 +1256,6 @@ public: CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; diff --git a/src/vm/codepitchingmanager.cpp b/src/vm/codepitchingmanager.cpp index 6a937fb217..2bae33eeb1 100644 --- a/src/vm/codepitchingmanager.cpp +++ b/src/vm/codepitchingmanager.cpp @@ -307,7 +307,6 @@ StackWalkAction CrawlFrameVisitor(CrawlFrame* pCf, Thread* pMdThread) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/comcache.cpp b/src/vm/comcache.cpp index a7834078f1..c63ec56b26 100644 --- a/src/vm/comcache.cpp +++ b/src/vm/comcache.cpp @@ -1548,7 +1548,6 @@ HRESULT __stdcall CtxEntry::EnterContextCallback(ComCallData* pComCallData) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pComCallData)); } CONTRACTL_END; diff --git a/src/vm/comcallablewrapper.cpp b/src/vm/comcallablewrapper.cpp index 749af9a06d..ea18275d32 100644 --- a/src/vm/comcallablewrapper.cpp +++ b/src/vm/comcallablewrapper.cpp @@ -1004,12 +1004,10 @@ LONGLONG SimpleComCallWrapper::ReleaseImplWithLogging(LONGLONG * pRefCount) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; LONGLONG newRefCount; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), goto NoLog ); StackSString ssMessage; ComCallWrapper *pWrap = GetMainWrapper(); @@ -1020,14 +1018,7 @@ LONGLONG SimpleComCallWrapper::ReleaseImplWithLogging(LONGLONG * pRefCount) LogRefCount(pWrap, ssMessage, GET_EXT_COM_REF(newRefCount)); - END_SO_INTOLERANT_CODE; return newRefCount; - -#ifdef FEATURE_STACK_PROBE // this code is unreachable if FEATURE_STACK_PROBE is not defined -NoLog: - // Decrement the ref count - return ::InterlockedDecrement64(pRefCount); -#endif // FEATURE_STACK_PROBE } @@ -1743,7 +1734,6 @@ IUnknown* SimpleComCallWrapper::QIStandardInterface(Enum_StdInterfaces index) MODE_ANY; \ NOTHROW; \ GC_NOTRIGGER; \ - SO_TOLERANT; \ POSTCONDITION(RETVAL == !!IsEqualGUID(iid, riid)); \ } \ CONTRACT_END; \ @@ -1899,7 +1889,6 @@ void SimpleComCallWrapper::ResetOuter() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -1921,7 +1910,6 @@ IUnknown* SimpleComCallWrapper::GetOuter() GC_NOTRIGGER; MODE_ANY; POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); - SO_TOLERANT; } CONTRACT_END; diff --git a/src/vm/comcallablewrapper.h b/src/vm/comcallablewrapper.h index 27206ac98f..a8cce3dccb 100644 --- a/src/vm/comcallablewrapper.h +++ b/src/vm/comcallablewrapper.h @@ -1206,7 +1206,6 @@ public: WRAPPER(GC_TRIGGERS); MODE_COOPERATIVE; PRECONDITION(CheckPointer(m_ppThis)); - SO_TOLERANT; } CONTRACT_END; @@ -1295,7 +1294,6 @@ public: INSTANCE_CHECK; POSTCONDITION(CheckPointer(RETVAL)); SUPPORTS_DAC; - SO_TOLERANT; } CONTRACT_END; @@ -1552,7 +1550,6 @@ public: WRAPPER(THROWS); WRAPPER(GC_TRIGGERS); MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACT_END; @@ -1694,7 +1691,6 @@ public: MODE_ANY; PRECONDITION(CheckPointer(pUnk)); POSTCONDITION(CheckPointer(RETVAL)); - SO_TOLERANT; SUPPORTS_DAC; } CONTRACT_END; @@ -1719,7 +1715,6 @@ public: SUPPORTS_DAC; INSTANCE_CHECK; POSTCONDITION(CheckPointer(RETVAL)); - SO_TOLERANT; } CONTRACT_END; @@ -1773,7 +1768,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -1794,7 +1788,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -1819,7 +1812,6 @@ public: NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -1841,13 +1833,11 @@ private: NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; if (!CanRunManagedCode()) return; - SO_INTOLERANT_CODE_NOTHROW(GetThread(), return; ); m_pWrap->Cleanup(); } @@ -1860,7 +1850,6 @@ public: NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -2183,7 +2172,6 @@ inline ULONG ComCallWrapper::AddRef() WRAPPER(THROWS); WRAPPER(GC_TRIGGERS); MODE_ANY; - SO_TOLERANT; INSTANCE_CHECK; } CONTRACTL_END; @@ -2204,7 +2192,6 @@ inline ULONG ComCallWrapper::Release() WRAPPER(THROWS); WRAPPER(GC_TRIGGERS); MODE_ANY; - SO_TOLERANT; INSTANCE_CHECK; PRECONDITION(CheckPointer(m_pSimpleWrapper)); } @@ -2331,7 +2318,6 @@ inline PTR_ComCallWrapper ComCallWrapper::GetWrapperFromIP(PTR_IUnknown pUnk) PRECONDITION(CheckPointer(pUnk)); POSTCONDITION(CheckPointer(RETVAL)); SUPPORTS_DAC; - SO_TOLERANT; } CONTRACT_END; diff --git a/src/vm/comconnectionpoints.cpp b/src/vm/comconnectionpoints.cpp index 4e4ceefc8a..290d9b6427 100644 --- a/src/vm/comconnectionpoints.cpp +++ b/src/vm/comconnectionpoints.cpp @@ -61,7 +61,6 @@ HRESULT __stdcall ConnectionPoint::QueryInterface(REFIID riid, void** ppv) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppv, NULL_OK)); } CONTRACTL_END; @@ -101,7 +100,6 @@ ULONG __stdcall ConnectionPoint::AddRef() NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -118,7 +116,6 @@ ULONG __stdcall ConnectionPoint::Release() NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -144,7 +141,6 @@ HRESULT __stdcall ConnectionPoint::GetConnectionInterface(IID *pIID) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pIID, NULL_OK)); } CONTRACTL_END; @@ -169,7 +165,6 @@ HRESULT __stdcall ConnectionPoint::GetConnectionPointContainer(IConnectionPointC NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppCPC, NULL_OK)); } CONTRACTL_END; @@ -203,7 +198,6 @@ HRESULT __stdcall ConnectionPoint::Advise(IUnknown *pUnk, DWORD *pdwCookie) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk, NULL_OK)); PRECONDITION(CheckPointer(pdwCookie, NULL_OK)); } @@ -238,7 +232,6 @@ HRESULT __stdcall ConnectionPoint::Unadvise(DWORD dwCookie) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -268,7 +261,6 @@ HRESULT __stdcall ConnectionPoint::EnumConnections(IEnumConnections **ppEnum) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppEnum, NULL_OK)); } CONTRACTL_END; @@ -787,7 +779,6 @@ HRESULT __stdcall ConnectionPointEnum::QueryInterface(REFIID riid, void** ppv) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppv, NULL_OK)); } CONTRACTL_END; @@ -827,7 +818,6 @@ ULONG __stdcall ConnectionPointEnum::AddRef() NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -844,7 +834,6 @@ ULONG __stdcall ConnectionPointEnum::Release() NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -872,7 +861,6 @@ HRESULT __stdcall ConnectionPointEnum::Next(ULONG cConnections, IConnectionPoint NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppCP, NULL_OK)); PRECONDITION(CheckPointer(pcFetched, NULL_OK)); } @@ -914,7 +902,6 @@ HRESULT __stdcall ConnectionPointEnum::Skip(ULONG cConnections) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -949,7 +936,6 @@ HRESULT __stdcall ConnectionPointEnum::Reset() NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -971,7 +957,6 @@ HRESULT __stdcall ConnectionPointEnum::Clone(IEnumConnectionPoints **ppEnum) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppEnum, NULL_OK)); } CONTRACTL_END; @@ -1008,7 +993,6 @@ ConnectionEnum::ConnectionEnum(ConnectionPoint *pConnectionPoint) { NOTHROW; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -1022,7 +1006,6 @@ ConnectionEnum::~ConnectionEnum() { NOTHROW; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -1037,7 +1020,6 @@ HRESULT __stdcall ConnectionEnum::QueryInterface(REFIID riid, void** ppv) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppv, NULL_OK)); } CONTRACTL_END; @@ -1076,7 +1058,6 @@ ULONG __stdcall ConnectionEnum::AddRef() { NOTHROW; GC_TRIGGERS; - SO_TOLERANT; MODE_PREEMPTIVE; } CONTRACTL_END; @@ -1094,7 +1075,6 @@ ULONG __stdcall ConnectionEnum::Release() NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -1115,7 +1095,6 @@ HRESULT __stdcall ConnectionEnum::Next(ULONG cConnections, CONNECTDATA* rgcd, UL NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(rgcd, NULL_OK)); PRECONDITION(CheckPointer(pcFetched, NULL_OK)); } @@ -1171,7 +1150,6 @@ HRESULT __stdcall ConnectionEnum::Skip(ULONG cConnections) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -1203,7 +1181,6 @@ HRESULT __stdcall ConnectionEnum::Reset() NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -1225,7 +1202,6 @@ HRESULT __stdcall ConnectionEnum::Clone(IEnumConnections **ppEnum) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ppEnum, NULL_OK)); } CONTRACTL_END; @@ -1237,7 +1213,6 @@ HRESULT __stdcall ConnectionEnum::Clone(IEnumConnections **ppEnum) // Initialize the out parameters. *ppEnum = NULL; - // This should setup a SO_INTOLERANT region, why isn't it? SetupForComCallHR(); ConnectionEnum *pConEnum = new(nothrow) ConnectionEnum(m_pConnectionPoint); diff --git a/src/vm/comdelegate.cpp b/src/vm/comdelegate.cpp index 12edc538dd..63cd544580 100644 --- a/src/vm/comdelegate.cpp +++ b/src/vm/comdelegate.cpp @@ -3432,7 +3432,6 @@ BOOL COMDelegate::IsSecureDelegate(DELEGATEREF dRef) MODE_ANY; NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; DELEGATEREF innerDel = NULL; diff --git a/src/vm/commodule.cpp b/src/vm/commodule.cpp index c55da6b51f..4d650c7e16 100644 --- a/src/vm/commodule.cpp +++ b/src/vm/commodule.cpp @@ -1139,7 +1139,6 @@ static VOID __stdcall DReleaseTarget(IUnknown *punk) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/common.h b/src/vm/common.h index 3b16100c26..f6971e17f7 100644 --- a/src/vm/common.h +++ b/src/vm/common.h @@ -333,7 +333,6 @@ namespace Loader #include "regdisp.h" #include "stackframe.h" #include "gms.h" -#include "stackprobe.h" #include "fcall.h" #include "syncblk.h" #include "gcdesc.h" @@ -464,7 +463,6 @@ extern DummyGlobalContract ___contract; #include "clsload.inl" #include "domainfile.inl" #include "method.inl" -#include "stackprobe.inl" #include "syncblk.inl" #include "threads.inl" #include "eehash.inl" diff --git a/src/vm/compile.cpp b/src/vm/compile.cpp index 323c66abca..cd78e1cdeb 100644 --- a/src/vm/compile.cpp +++ b/src/vm/compile.cpp @@ -205,13 +205,8 @@ HRESULT MakeCrossDomainCallbackWorker( LPVOID pArgs) { STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_INTOLERANT; - HRESULT hrRetVal = E_UNEXPECTED; - BEGIN_SO_TOLERANT_CODE(GetThread()); - hrRetVal = pfnCallback(pArgs); - END_SO_TOLERANT_CODE; - return hrRetVal; + return pfnCallback(pArgs); } HRESULT CEECompileInfo::MakeCrossDomainCallback( diff --git a/src/vm/compile.h b/src/vm/compile.h index e86cd07523..52a96a11e7 100644 --- a/src/vm/compile.h +++ b/src/vm/compile.h @@ -408,7 +408,6 @@ class CEECompileInfo : public ICorCompileInfo { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/comsynchronizable.cpp b/src/vm/comsynchronizable.cpp index b495b946db..ee324d4707 100644 --- a/src/vm/comsynchronizable.cpp +++ b/src/vm/comsynchronizable.cpp @@ -189,7 +189,6 @@ void ThreadNative::KickOffThread_Worker(LPVOID ptr) GC_TRIGGERS; THROWS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -211,7 +210,6 @@ void ThreadNative::KickOffThread_Worker(LPVOID ptr) pThread = GetThread(); _ASSERTE(pThread); GCPROTECT_BEGIN(gc); - BEGIN_SO_INTOLERANT_CODE(pThread); gc.orDelegate = ObjectFromHandle(args->share->m_Threadable); gc.orThreadStartArg = ObjectFromHandle(args->share->m_ThreadStartArg); @@ -249,7 +247,6 @@ void ThreadNative::KickOffThread_Worker(LPVOID ptr) } STRESS_LOG2(LF_SYNC, LL_INFO10, "Managed thread exiting normally for delegate %p Type %pT\n", OBJECTREFToObject(gc.orDelegate), (size_t) gc.orDelegate->GetMethodTable()); - END_SO_INTOLERANT_CODE; GCPROTECT_END(); } @@ -288,16 +285,12 @@ ULONG WINAPI ThreadNative::KickOffThread(void* pass) GC_TRIGGERS; THROWS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; ULONG retVal = 0; // Before we do anything else, get Setup so that we have a real thread. - // Our thread isn't setup yet, so we can't use the standard probe - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return E_FAIL); - KickOffThread_Args args; // don't have a separate var becuase this can be updated in the worker args.share = (SharedState *) pass; @@ -381,8 +374,6 @@ ULONG WINAPI ThreadNative::KickOffThread(void* pass) DestroyThread(pThread); } - END_SO_INTOLERANT_CODE; - return retVal; } diff --git a/src/vm/comthreadpool.cpp b/src/vm/comthreadpool.cpp index 11319e1c2d..b76fa7b417 100644 --- a/src/vm/comthreadpool.cpp +++ b/src/vm/comthreadpool.cpp @@ -131,7 +131,7 @@ FCIMPL2(FC_BOOL_RET, ThreadPoolNative::CorSetMaxThreads,DWORD workerThreads, DWO FCALL_CONTRACT; BOOL bRet = FALSE; - HELPER_METHOD_FRAME_BEGIN_RET_0(); // Eventually calls BEGIN_SO_INTOLERANT_CODE_NOTHROW + HELPER_METHOD_FRAME_BEGIN_RET_0(); bRet = ThreadpoolMgr::SetMaxThreads(workerThreads,completionPortThreads); HELPER_METHOD_FRAME_END(); @@ -155,7 +155,7 @@ FCIMPL2(FC_BOOL_RET, ThreadPoolNative::CorSetMinThreads,DWORD workerThreads, DWO FCALL_CONTRACT; BOOL bRet = FALSE; - HELPER_METHOD_FRAME_BEGIN_RET_0(); // Eventually calls BEGIN_SO_INTOLERANT_CODE_NOTHROW + HELPER_METHOD_FRAME_BEGIN_RET_0(); bRet = ThreadpoolMgr::SetMinThreads(workerThreads,completionPortThreads); HELPER_METHOD_FRAME_END(); @@ -388,7 +388,7 @@ FCIMPL5(LPVOID, ThreadPoolNative::CorRegisterWaitForSingleObject, gc.waitObject = (WAITHANDLEREF) ObjectToOBJECTREF(waitObjectUNSAFE); gc.state = (OBJECTREF) stateUNSAFE; gc.registeredWaitObject = (OBJECTREF) registeredWaitObjectUNSAFE; - HELPER_METHOD_FRAME_BEGIN_RET_PROTECT(gc); // Eventually calls BEGIN_SO_INTOLERANT_CODE_NOTHROW + HELPER_METHOD_FRAME_BEGIN_RET_PROTECT(gc); if(gc.waitObject == NULL) COMPlusThrow(kArgumentNullException); @@ -487,7 +487,7 @@ FCIMPL2(FC_BOOL_RET, ThreadPoolNative::CorUnregisterWait, LPVOID WaitHandle, Obj BOOL retVal = false; SAFEHANDLEREF refSH = (SAFEHANDLEREF) ObjectToOBJECTREF(objectToNotify); - HELPER_METHOD_FRAME_BEGIN_RET_1(refSH); // Eventually calls BEGIN_SO_INTOLERANT_CODE_NOTHROW + HELPER_METHOD_FRAME_BEGIN_RET_1(refSH); HANDLE hWait = (HANDLE) WaitHandle; HANDLE hObjectToNotify = NULL; @@ -541,7 +541,7 @@ FCIMPL1(void, ThreadPoolNative::CorWaitHandleCleanupNative, LPVOID WaitHandle) { FCALL_CONTRACT; - HELPER_METHOD_FRAME_BEGIN_0(); // Eventually calls BEGIN_SO_INTOLERANT_CODE_NOTHROW + HELPER_METHOD_FRAME_BEGIN_0(); HANDLE hWait = (HANDLE)WaitHandle; ThreadpoolMgr::WaitHandleCleanup(hWait); @@ -570,8 +570,6 @@ void SetAsyncResultProperties( STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; - } VOID BindIoCompletionCallBack_Worker(LPVOID args) @@ -579,7 +577,6 @@ VOID BindIoCompletionCallBack_Worker(LPVOID args) STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_INTOLERANT; DWORD ErrorCode = ((BindIoCompletion_Args *)args)->ErrorCode; DWORD numBytesTransferred = ((BindIoCompletion_Args *)args)->numBytesTransferred; @@ -639,7 +636,6 @@ void __stdcall BindIoCompletionCallbackStubEx(DWORD ErrorCode, THROWS; MODE_ANY; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; @@ -688,7 +684,7 @@ FCIMPL1(FC_BOOL_RET, ThreadPoolNative::CorBindIoCompletionCallback, HANDLE fileH BOOL retVal = FALSE; - HELPER_METHOD_FRAME_BEGIN_RET_0(); // Eventually calls BEGIN_SO_INTOLERANT_CODE_NOTHROW + HELPER_METHOD_FRAME_BEGIN_RET_0(); HANDLE hFile = (HANDLE) fileHandle; DWORD errCode = 0; @@ -721,7 +717,7 @@ FCIMPL1(FC_BOOL_RET, ThreadPoolNative::CorPostQueuedCompletionStatus, LPOVERLAPP BOOL res = FALSE; - HELPER_METHOD_FRAME_BEGIN_RET_1(overlapped); // Eventually calls BEGIN_SO_INTOLERANT_CODE_NOTHROW + HELPER_METHOD_FRAME_BEGIN_RET_1(overlapped); // OS doesn't signal handle, so do it here lpOverlapped->Internal = 0; @@ -793,7 +789,6 @@ VOID WINAPI AppDomainTimerCallback(PVOID callbackState, BOOLEAN timerOrWaitFired THROWS; MODE_ANY; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; diff --git a/src/vm/comtoclrcall.cpp b/src/vm/comtoclrcall.cpp index db262f1bf2..98391b9883 100644 --- a/src/vm/comtoclrcall.cpp +++ b/src/vm/comtoclrcall.cpp @@ -101,7 +101,6 @@ void ProfilerTransitionCallbackHelper(MethodDesc* pMD, Thread* pThread, COR_PRF_ NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(pMD)); PRECONDITION(CheckPointer(pThread)); PRECONDITION(CORProfilerTrackTransitions()); @@ -132,10 +131,6 @@ extern "C" HRESULT STDCALL StubRareDisableHRWorker(Thread *pThread) // Do not add a CONTRACT here. We haven't set up SEH. We rely // on HandleThreadAbort dealing with this situation properly. - // @todo - We need to probe here, but can't introduce destructors etc. - BEGIN_CONTRACT_VIOLATION(SOToleranceViolation); - - // WARNING!!!! // when we start executing here, we are actually in cooperative mode. But we // haven't synchronized with the barrier to reentry yet. So we are in a highly @@ -170,8 +165,6 @@ extern "C" HRESULT STDCALL StubRareDisableHRWorker(Thread *pThread) // should always be in coop mode here _ASSERTE(pThread->PreemptiveGCDisabled()); - END_CONTRACT_VIOLATION; - // Note that this code does not handle rare signatures that do not return HRESULT properly return hr; @@ -209,8 +202,8 @@ inline static void InvokeStub(ComCallMethodDesc *pCMD, PCODE pManagedTarget, OBJ PERMANENT_CONTRACT_VIOLATION(ThrowsViolation, ReasonILStubWillNotThrow); // - // NOTE! We do not use BEGIN_CALL_TO_MANAGEDEX around this call because we stayed in the SO_TOLERANT - // mode and COMToCLRDispatchHelper is responsible for pushing/popping the CPFH into the FS:0 chain. + // NOTE! We do not use BEGIN_CALL_TO_MANAGEDEX around this call because COMToCLRDispatchHelper is + // responsible for pushing/popping the CPFH into the FS:0 chain. // *pRetValOut = COMToCLRDispatchHelper( @@ -279,7 +272,6 @@ OBJECTREF COMToCLRGetObjectAndTarget_Delegate(ComCallWrapper * pWrap, PCODE * pp NOTHROW; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -302,7 +294,6 @@ bool COMToCLRGetObjectAndTarget_WinRTCtor(Thread * pThread, MethodDesc * pRealMD NOTHROW; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -322,8 +313,6 @@ bool COMToCLRGetObjectAndTarget_WinRTCtor(Thread * pThread, MethodDesc * pRealMD bool fSuccess = true; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(pThread, { *pRetValOut = COR_E_STACKOVERFLOW; return false; } ); - EX_TRY { *pObjectOut = AllocateObject(pMT); @@ -335,8 +324,6 @@ bool COMToCLRGetObjectAndTarget_WinRTCtor(Thread * pThread, MethodDesc * pRealMD } EX_END_CATCH(SwallowAllExceptions); - END_SO_INTOLERANT_CODE; - return fSuccess; } @@ -348,7 +335,6 @@ OBJECTREF COMToCLRGetObjectAndTarget_Virtual(ComCallWrapper * pWrap, MethodDesc NOTHROW; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -390,7 +376,6 @@ OBJECTREF COMToCLRGetObjectAndTarget_NonVirtual(ComCallWrapper * pWrap, MethodDe NOTHROW; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -409,7 +394,6 @@ void COMToCLRInvokeTarget(PCODE pManagedTarget, OBJECTREF pObject, ComCallMethod NOTHROW; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -433,7 +417,6 @@ void COMToCLRWorkerBody_Rare(Thread * pThread, ComMethodFrame * pFrame, ComCallW NOTHROW; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -494,7 +477,6 @@ void COMToCLRWorkerBody( NOTHROW; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -565,20 +547,6 @@ void COMToCLRWorkerBody( return; } -void COMToCLRWorkerBody_SOIntolerant(Thread * pThread, ComMethodFrame * pFrame, ComCallWrapper * pWrap, UINT64 * pRetValOut) -{ - STATIC_CONTRACT_THROWS; // THROWS due to END_SO_TOLERANT_CODE - STATIC_CONTRACT_GC_TRIGGERS; - STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_INTOLERANT; - - BEGIN_SO_TOLERANT_CODE(pThread); - - COMToCLRWorkerBody(pThread, pFrame, pWrap, pRetValOut); - - END_SO_TOLERANT_CODE; -} - //------------------------------------------------------------------ // UINT64 __stdcall COMToCLRWorker(Thread *pThread, // ComMethodFrame* pFrame) @@ -598,7 +566,6 @@ extern "C" UINT64 __stdcall COMToCLRWorker(Thread *pThread, ComMethodFrame* pFra // to leave the MODE_ contract enabled on x86. DISABLED(MODE_PREEMPTIVE); #endif - SO_TOLERANT; PRECONDITION(CheckPointer(pFrame)); PRECONDITION(CheckPointer(pThread, NULL_OK)); } @@ -769,9 +736,6 @@ static UINT64 __stdcall FieldCallWorker(Thread *pThread, ComMethodFrame* pFrame) HRESULT hrRetVal = S_OK; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(pThread, return COR_E_STACKOVERFLOW); - // BEGIN_ENTRYPOINT_NOTHROW_WITH_THREAD(pThread); - IUnknown** pip = (IUnknown **)pFrame->GetPointerToArguments(); IUnknown* pUnk = (IUnknown *)*pip; _ASSERTE(pUnk != NULL); @@ -809,9 +773,6 @@ static UINT64 __stdcall FieldCallWorker(Thread *pThread, ComMethodFrame* pFrame) LOG((LF_STUBS, LL_INFO1000000, "FieldCallWorker leave\n")); - END_SO_INTOLERANT_CODE; - //END_ENTRYPOINT_NOTHROW_WITH_THREAD; - return hrRetVal; } diff --git a/src/vm/comtoclrcall.h b/src/vm/comtoclrcall.h index 5425fc0074..03d05eeba1 100644 --- a/src/vm/comtoclrcall.h +++ b/src/vm/comtoclrcall.h @@ -133,7 +133,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(IsFieldCall()); } CONTRACT_END; @@ -149,7 +148,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(IsMethodCall()); } CONTRACT_END; @@ -249,7 +247,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(!IsFieldCall()); PRECONDITION(CheckPointer(m_pMD)); POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); @@ -267,7 +264,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(!IsFieldCall()); POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); SUPPORTS_DAC; @@ -298,7 +294,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(IsFieldCall()); PRECONDITION(CheckPointer(m_pFD)); POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); @@ -331,7 +326,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(IsMethodCall()); PRECONDITION(CheckPointer(m_pMD)); } @@ -348,7 +342,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(m_flags & enum_NativeInfoInitialized); SUPPORTS_DAC; } @@ -377,7 +370,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(IsMethodCall()); PRECONDITION(CheckPointer(m_pMD)); } diff --git a/src/vm/comutilnative.cpp b/src/vm/comutilnative.cpp index 56408c5f70..60874c3804 100644 --- a/src/vm/comutilnative.cpp +++ b/src/vm/comutilnative.cpp @@ -972,7 +972,6 @@ FCIMPL1(int, GCInterface::WaitForFullGCApproach, int millisecondsTimeout) THROWS; MODE_COOPERATIVE; DISABLED(GC_TRIGGERS); // can't use this in an FCALL because we're in forbid gc mode until we setup a H_M_F. - SO_TOLERANT; } CONTRACTL_END; @@ -997,7 +996,6 @@ FCIMPL1(int, GCInterface::WaitForFullGCComplete, int millisecondsTimeout) THROWS; MODE_COOPERATIVE; DISABLED(GC_TRIGGERS); // can't use this in an FCALL because we're in forbid gc mode until we setup a H_M_F. - SO_TOLERANT; } CONTRACTL_END; @@ -1279,7 +1277,6 @@ FCIMPLEND FORCEINLINE UINT64 GCInterface::InterlockedAdd (UINT64 *pAugend, UINT64 addend) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; UINT64 oldMemValue; UINT64 newMemValue; @@ -1300,7 +1297,6 @@ FORCEINLINE UINT64 GCInterface::InterlockedAdd (UINT64 *pAugend, UINT64 addend) FORCEINLINE UINT64 GCInterface::InterlockedSub(UINT64 *pMinuend, UINT64 subtrahend) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; UINT64 oldMemValue; UINT64 newMemValue; @@ -1879,7 +1875,6 @@ static BOOL HasOverriddenMethod(MethodTable* mt, MethodTable* classMT, WORD meth NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; _ASSERTE(mt != NULL); @@ -2038,7 +2033,6 @@ static INT32 FastGetValueTypeHashCodeHelper(MethodTable *mt, void *pObjRef) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; INT32 hashCode = 0; @@ -2254,7 +2248,6 @@ static bool HasOverriddenStreamMethod(MethodTable * pMT, WORD slot) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; PCODE actual = pMT->GetRestoredSlot(slot); diff --git a/src/vm/comwaithandle.cpp b/src/vm/comwaithandle.cpp index 5fd73c5c7a..935a8f031a 100644 --- a/src/vm/comwaithandle.cpp +++ b/src/vm/comwaithandle.cpp @@ -81,9 +81,8 @@ private: void AcquireSafeHandleFromWaitHandle(WAITHANDLEREF wh) { CONTRACTL { - THROWS; - GC_TRIGGERS; - SO_INTOLERANT; + THROWS; + GC_TRIGGERS; MODE_COOPERATIVE; PRECONDITION(wh != NULL); } CONTRACTL_END; @@ -97,9 +96,8 @@ void AcquireSafeHandleFromWaitHandle(WAITHANDLEREF wh) void ReleaseSafeHandleFromWaitHandle(WAITHANDLEREF wh) { CONTRACTL { - THROWS; - GC_TRIGGERS; - SO_TOLERANT; + THROWS; + GC_TRIGGERS; MODE_COOPERATIVE; PRECONDITION(wh != NULL); } CONTRACTL_END; diff --git a/src/vm/contractimpl.cpp b/src/vm/contractimpl.cpp index 1a83712b3e..870dc4f545 100644 --- a/src/vm/contractimpl.cpp +++ b/src/vm/contractimpl.cpp @@ -65,7 +65,6 @@ UINT32 TypeIDMap::LookupTypeID(PTR_MethodTable pMT) { CONTRACTL { NOTHROW; - SO_TOLERANT; PRECONDITION(CheckPointer(GetThread())); if (GetThread()->PreemptiveGCDisabled()) { GC_NOTRIGGER; } else { GC_TRIGGERS; } } CONTRACTL_END; @@ -82,7 +81,6 @@ PTR_MethodTable TypeIDMap::LookupType(UINT32 id) { CONTRACTL { NOTHROW; - SO_TOLERANT; PRECONDITION(CheckPointer(GetThread())); if (GetThread()->PreemptiveGCDisabled()) { GC_NOTRIGGER; } else { GC_TRIGGERS; } PRECONDITION(id <= TypeIDProvider::MAX_TYPE_ID); @@ -161,7 +159,6 @@ void TypeIDMap::RemoveTypes(LoaderAllocator *pLoaderAllocator) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; // Take the lock diff --git a/src/vm/contractimpl.h b/src/vm/contractimpl.h index d0652c1e20..3149a4dfe5 100644 --- a/src/vm/contractimpl.h +++ b/src/vm/contractimpl.h @@ -412,7 +412,6 @@ public: THROWS; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; INJECT_FAULT(COMPlusThrowOM()); PRECONDITION(m_nextID != 0); PRECONDITION(m_incSize != 0); @@ -440,7 +439,6 @@ public: THROWS; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; INJECT_FAULT(COMPlusThrowOM()); PRECONDITION(m_nextFatID != 0); PRECONDITION(m_incSize != 0); diff --git a/src/vm/corhost.cpp b/src/vm/corhost.cpp index d2859cc7ae..ae73123fe0 100644 --- a/src/vm/corhost.cpp +++ b/src/vm/corhost.cpp @@ -597,15 +597,8 @@ HRESULT ExecuteInAppDomainHelper(FExecuteInAppDomainCallback pCallback, void * cookie) { STATIC_CONTRACT_THROWS; - STATIC_CONTRACT_SO_INTOLERANT; - HRESULT hr = S_OK; - - BEGIN_SO_TOLERANT_CODE(GetThread()); - hr = pCallback(cookie); - END_SO_TOLERANT_CODE; - - return hr; + return pCallback(cookie); } HRESULT CorHost2::ExecuteInAppDomain(DWORD dwAppDomainId, @@ -640,7 +633,7 @@ HRESULT CorHost2::ExecuteInAppDomain(DWORD dwAppDomainId, ENTER_DOMAIN_ID(ADID(dwAppDomainId)) { // We are calling an unmanaged function pointer, either an unmanaged function, or a marshaled out delegate. - // The thread should be in preemptive mode, and SO_Tolerant. + // The thread should be in preemptive mode. GCX_PREEMP(); hr=ExecuteInAppDomainHelper (pCallback, cookie); } @@ -1194,7 +1187,6 @@ STDMETHODIMP CorHost2::UnloadAppDomain(DWORD dwDomainId, BOOL fWaitUntilDone) STDMETHODIMP CorHost2::UnloadAppDomain2(DWORD dwDomainId, BOOL fWaitUntilDone, int *pLatchedExitCode) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; if (!m_fStarted) return HOST_E_INVALIDOPERATION; @@ -1310,7 +1302,6 @@ ULONG CorRuntimeHostBase::AddRef() { WRAPPER(THROWS); WRAPPER(GC_TRIGGERS); - SO_TOLERANT; } CONTRACTL_END; return InterlockedIncrement(&m_cRef); @@ -1340,7 +1331,6 @@ HRESULT CorHost2::QueryInterface(REFIID riid, void **ppUnk) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; // no global state updates that need guarding. } CONTRACTL_END; @@ -1405,7 +1395,6 @@ HRESULT CorHost2::GetBucketParametersForCurrentException(BucketParameters *pPara { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -1430,13 +1419,11 @@ HRESULT CorHost2::CreateObject(REFIID riid, void **ppUnk) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; HRESULT hr = S_OK; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW; ); CorHost2 *pCorHost = new (nothrow) CorHost2(); if (!pCorHost) { @@ -1448,7 +1435,6 @@ HRESULT CorHost2::CreateObject(REFIID riid, void **ppUnk) if (FAILED(hr)) delete pCorHost; } - END_SO_INTOLERANT_CODE; return (hr); } @@ -1636,14 +1622,12 @@ public: virtual ULONG STDMETHODCALLTYPE AddRef(void) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return 1; } virtual ULONG STDMETHODCALLTYPE Release(void) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return 1; } @@ -1651,7 +1635,6 @@ public: void **ppvObject) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; if (riid != IID_ICLRPolicyManager && riid != IID_IUnknown) return (E_NOINTERFACE); @@ -1903,7 +1886,6 @@ HRESULT CCLRGCManager::_SetGCSegmentSize(SIZE_T SegmentSize) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -1929,7 +1911,6 @@ HRESULT CCLRGCManager::_SetGCMaxGen0Size(SIZE_T MaxGen0Size) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -2086,7 +2067,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; // no global state updates } CONTRACTL_END; @@ -2263,7 +2243,6 @@ HRESULT CCLRErrorReportingManager::QueryInterface(REFIID riid, void** ppUnk) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -2689,7 +2668,6 @@ extern "C" IExecutionEngine * __stdcall IEE() HRESULT STDMETHODCALLTYPE CExecutionEngine::QueryInterface(REFIID id, void **pInterface) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; if (!pInterface) return E_POINTER; @@ -2771,7 +2749,6 @@ void **CExecutionEngine::CheckThreadState(DWORD slot, BOOL force) STATIC_CONTRACT_THROWS; STATIC_CONTRACT_MODE_ANY; STATIC_CONTRACT_CANNOT_TAKE_LOCK; - STATIC_CONTRACT_SO_TOLERANT; //<TODO> @TODO: Decide on an exception strategy for all the DLLs of the CLR, and then // enable all the exceptions out of this method.</TODO> @@ -2799,9 +2776,6 @@ void **CExecutionEngine::CheckThreadState(DWORD slot, BOOL force) goto LError; } memset (pTlsInfo, 0, sizeof(ClrTlsInfo)); - // We save the last intolerant marker on stack in this slot. - // -1 is the larget unsigned number, and therefore our marker is always smaller than it. - pTlsInfo->data[TlsIdx_SOIntolerantTransitionHandler] = (void*)(-1); } if (!fInTls && pTlsInfo) @@ -2841,7 +2815,6 @@ void **CExecutionEngine::CheckThreadStateNoCreate(DWORD slot STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; // !!! This function is called during Thread::SwitchIn and SwitchOut // !!! It is extremely important that while executing this function, we will not @@ -2865,7 +2838,6 @@ void CExecutionEngine::SetupTLSForThread(Thread *pThread) { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_MODE_ANY; #ifdef STRESS_LOG @@ -3000,7 +2972,6 @@ void FreeClrDebugState(LPVOID pTlsData); VOID STDMETHODCALLTYPE CExecutionEngine::TLS_AssociateCallback(DWORD slot, PTLS_CALLBACK_FUNCTION callback) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; CheckThreadState(slot); @@ -3030,7 +3001,6 @@ LPVOID* STDMETHODCALLTYPE CExecutionEngine::TLS_GetDataBlock() STATIC_CONTRACT_THROWS; STATIC_CONTRACT_MODE_ANY; STATIC_CONTRACT_CANNOT_TAKE_LOCK; - STATIC_CONTRACT_SO_TOLERANT; return CExecutionEngine::GetTlsData(); } @@ -3038,21 +3008,18 @@ LPVOID* STDMETHODCALLTYPE CExecutionEngine::TLS_GetDataBlock() LPVOID STDMETHODCALLTYPE CExecutionEngine::TLS_GetValue(DWORD slot) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EETlsGetValue(slot); } BOOL STDMETHODCALLTYPE CExecutionEngine::TLS_CheckValue(DWORD slot, LPVOID * pValue) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EETlsCheckValue(slot, pValue); } VOID STDMETHODCALLTYPE CExecutionEngine::TLS_SetValue(DWORD slot, LPVOID pData) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; EETlsSetValue(slot,pData); } @@ -3060,7 +3027,6 @@ VOID STDMETHODCALLTYPE CExecutionEngine::TLS_SetValue(DWORD slot, LPVOID pData) VOID STDMETHODCALLTYPE CExecutionEngine::TLS_ThreadDetaching() { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; CExecutionEngine::ThreadDetaching(NULL); } @@ -3086,26 +3052,19 @@ CRITSEC_COOKIE STDMETHODCALLTYPE CExecutionEngine::CreateLock(LPCSTR szTag, LPCS void STDMETHODCALLTYPE CExecutionEngine::DestroyLock(CRITSEC_COOKIE cookie) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; ::EEDeleteCriticalSection(cookie); } void STDMETHODCALLTYPE CExecutionEngine::AcquireLock(CRITSEC_COOKIE cookie) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; - BEGIN_SO_INTOLERANT_CODE(GetThread()); ::EEEnterCriticalSection(cookie); - END_SO_INTOLERANT_CODE; } void STDMETHODCALLTYPE CExecutionEngine::ReleaseLock(CRITSEC_COOKIE cookie) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; - BEGIN_SO_INTOLERANT_CODE(GetThread()); ::EELeaveCriticalSection(cookie); - END_SO_INTOLERANT_CODE; } // Locking routines supplied by the EE to the other DLLs of the CLR. In a _DEBUG @@ -3187,7 +3146,6 @@ EVENT_COOKIE STDMETHODCALLTYPE CExecutionEngine::CreateManualEvent(BOOL bInitial void STDMETHODCALLTYPE CExecutionEngine::CloseEvent(EVENT_COOKIE event) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; if (event) { CLREvent *pEvent = CookieToCLREvent(event); pEvent->CloseEvent(); @@ -3201,7 +3159,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrSetEvent(EVENT_COOKIE event) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3218,7 +3175,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrResetEvent(EVENT_COOKIE event) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3234,7 +3190,6 @@ DWORD STDMETHODCALLTYPE CExecutionEngine::WaitForEvent(EVENT_COOKIE event, BOOL bAlertable) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; if (event) { CLREvent *pEvent = CookieToCLREvent(event); return pEvent->Wait(dwMilliseconds,bAlertable); @@ -3249,14 +3204,12 @@ DWORD STDMETHODCALLTYPE CExecutionEngine::WaitForSingleObject(HANDLE handle, DWORD dwMilliseconds) { STATIC_CONTRACT_WRAPPER; - STATIC_CONTRACT_SO_TOLERANT; return ::WaitForSingleObject(handle,dwMilliseconds); } static inline SEMAPHORE_COOKIE CLRSemaphoreToCookie(CLRSemaphore * pSemaphore) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE((((uintptr_t) pSemaphore) & POISON_BITS) == 0); #ifdef _DEBUG @@ -3287,7 +3240,6 @@ SEMAPHORE_COOKIE STDMETHODCALLTYPE CExecutionEngine::ClrCreateSemaphore(DWORD dw THROWS; MODE_ANY; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -3304,7 +3256,6 @@ void STDMETHODCALLTYPE CExecutionEngine::ClrCloseSemaphore(SEMAPHORE_COOKIE sema { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3321,7 +3272,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrReleaseSemaphore(SEMAPHORE_COOKIE se { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3334,7 +3284,6 @@ DWORD STDMETHODCALLTYPE CExecutionEngine::ClrWaitForSemaphore(SEMAPHORE_COOKIE s BOOL bAlertable) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; CLRSemaphore *pSemaphore = CookieToCLRSemaphore(semaphore); return pSemaphore->Wait(dwMilliseconds,bAlertable); } @@ -3372,7 +3321,6 @@ MUTEX_COOKIE STDMETHODCALLTYPE CExecutionEngine::ClrCreateMutex(LPSECURITY_ATTRI NOTHROW; MODE_ANY; GC_NOTRIGGER; - SO_TOLERANT; // we catch any erros and free the allocated memory } CONTRACTL_END; @@ -3401,7 +3349,6 @@ void STDMETHODCALLTYPE CExecutionEngine::ClrCloseMutex(MUTEX_COOKIE mutex) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3416,7 +3363,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrReleaseMutex(MUTEX_COOKIE mutex) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3432,7 +3378,6 @@ DWORD STDMETHODCALLTYPE CExecutionEngine::ClrWaitForMutex(MUTEX_COOKIE mutex, { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3444,8 +3389,6 @@ DWORD STDMETHODCALLTYPE CExecutionEngine::ClrWaitForMutex(MUTEX_COOKIE mutex, DWORD STDMETHODCALLTYPE CExecutionEngine::ClrSleepEx(DWORD dwMilliseconds, BOOL bAlertable) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; - return EESleepEx(dwMilliseconds,bAlertable); } #define ClrSleepEx EESleepEx @@ -3454,7 +3397,6 @@ DWORD STDMETHODCALLTYPE CExecutionEngine::ClrSleepEx(DWORD dwMilliseconds, BOOL BOOL STDMETHODCALLTYPE CExecutionEngine::ClrAllocationDisallowed() { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEAllocationDisallowed(); } #define ClrAllocationDisallowed EEAllocationDisallowed @@ -3466,7 +3408,6 @@ LPVOID STDMETHODCALLTYPE CExecutionEngine::ClrVirtualAlloc(LPVOID lpAddress, DWORD flProtect) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEVirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect); } #define ClrVirtualAlloc EEVirtualAlloc @@ -3477,7 +3418,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrVirtualFree(LPVOID lpAddress, DWORD dwFreeType) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEVirtualFree(lpAddress, dwSize, dwFreeType); } #define ClrVirtualFree EEVirtualFree @@ -3488,7 +3428,6 @@ SIZE_T STDMETHODCALLTYPE CExecutionEngine::ClrVirtualQuery(LPCVOID lpAddress, SIZE_T dwLength) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEVirtualQuery(lpAddress, lpBuffer, dwLength); } #define ClrVirtualQuery EEVirtualQuery @@ -3507,7 +3446,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrVirtualProtect(LPVOID lpAddress, PDWORD lpflOldProtect) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; // Get the UEF installation details - we will use these to validate // that the calls to ClrVirtualProtect are not going to affect the UEF. @@ -3623,7 +3561,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrVirtualProtect(LPVOID lpAddress, HANDLE STDMETHODCALLTYPE CExecutionEngine::ClrGetProcessHeap() { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEGetProcessHeap(); } #define ClrGetProcessHeap EEGetProcessHeap @@ -3632,7 +3569,6 @@ HANDLE STDMETHODCALLTYPE CExecutionEngine::ClrGetProcessHeap() HANDLE STDMETHODCALLTYPE CExecutionEngine::ClrGetProcessExecutableHeap() { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEGetProcessExecutableHeap(); } #define ClrGetProcessExecutableHeap EEGetProcessExecutableHeap @@ -3644,7 +3580,6 @@ HANDLE STDMETHODCALLTYPE CExecutionEngine::ClrHeapCreate(DWORD flOptions, SIZE_T dwMaximumSize) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEHeapCreate(flOptions, dwInitialSize, dwMaximumSize); } #define ClrHeapCreate EEHeapCreate @@ -3653,7 +3588,6 @@ HANDLE STDMETHODCALLTYPE CExecutionEngine::ClrHeapCreate(DWORD flOptions, BOOL STDMETHODCALLTYPE CExecutionEngine::ClrHeapDestroy(HANDLE hHeap) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEHeapDestroy(hHeap); } #define ClrHeapDestroy EEHeapDestroy @@ -3664,13 +3598,6 @@ LPVOID STDMETHODCALLTYPE CExecutionEngine::ClrHeapAlloc(HANDLE hHeap, SIZE_T dwBytes) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; - - // We need to guarentee a very small stack consumption in allocating. And we can't allow - // an SO to happen while calling into the host. This will force a hard SO which is OK because - // we shouldn't ever get this close inside the EE in SO-intolerant code, so this should - // only fail if we call directly in from outside the EE, such as the JIT. - MINIMAL_STACK_PROBE_CHECK_THREAD(GetThread()); return EEHeapAlloc(hHeap, dwFlags, dwBytes); } @@ -3682,7 +3609,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrHeapFree(HANDLE hHeap, LPVOID lpMem) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEHeapFree(hHeap, dwFlags, lpMem); } #define ClrHeapFree EEHeapFree @@ -3693,7 +3619,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrHeapValidate(HANDLE hHeap, LPCVOID lpMem) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return EEHeapValidate(hHeap, dwFlags, lpMem); } #define ClrHeapValidate EEHeapValidate @@ -3706,7 +3631,6 @@ BOOL STDMETHODCALLTYPE CExecutionEngine::ClrHeapValidate(HANDLE hHeap, void CExecutionEngine::GetLastThrownObjectExceptionFromThread(void **ppvException) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; // Cast to our real type. Exception **ppException = reinterpret_cast<Exception**>(ppvException); diff --git a/src/vm/crst.h b/src/vm/crst.h index fa8c307f3f..d2e70754ec 100644 --- a/src/vm/crst.h +++ b/src/vm/crst.h @@ -391,8 +391,6 @@ private: inline ~CrstHolder() { WRAPPER_NO_CONTRACT; - - VALIDATE_HOLDER_STACK_CONSUMPTION_FOR_TYPE(HSV_ValidateMinimumStackReq); ReleaseLock(m_pCrst); } }; diff --git a/src/vm/customattribute.cpp b/src/vm/customattribute.cpp index e77d55a498..97a9c8002d 100644 --- a/src/vm/customattribute.cpp +++ b/src/vm/customattribute.cpp @@ -866,7 +866,6 @@ FCIMPL5(VOID, COMCustomAttribute::ParseAttributeUsageAttribute, PVOID pData, ULO int inherited = 0; int allowMultiple = 1; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); { CustomAttributeParser ca(pData, cData); @@ -897,7 +896,6 @@ FCIMPL5(VOID, COMCustomAttribute::ParseAttributeUsageAttribute, PVOID pData, ULO *pInherited = namedArgs[inherited].val.boolean == TRUE; *pAllowMultiple = namedArgs[allowMultiple].val.boolean == TRUE; } - END_SO_INTOLERANT_CODE; } FCIMPLEND diff --git a/src/vm/custommarshalerinfo.h b/src/vm/custommarshalerinfo.h index 95390f2927..167007732f 100644 --- a/src/vm/custommarshalerinfo.h +++ b/src/vm/custommarshalerinfo.h @@ -87,7 +87,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; diff --git a/src/vm/dataimage.cpp b/src/vm/dataimage.cpp index 1abd57677f..108c6df855 100644 --- a/src/vm/dataimage.cpp +++ b/src/vm/dataimage.cpp @@ -597,7 +597,6 @@ void DataImage::StoreRvaInfo(FieldDesc * pFD, int __cdecl DataImage::rvaInfoVectorEntryCmp(const void* a_, const void* b_) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; DataImage::RvaInfoStructure *a = (DataImage::RvaInfoStructure *)a_; DataImage::RvaInfoStructure *b = (DataImage::RvaInfoStructure *)b_; int rvaComparisonResult = (int)(a->rva - b->rva); diff --git a/src/vm/debugdebugger.cpp b/src/vm/debugdebugger.cpp index daadc91a0a..3402a8b506 100644 --- a/src/vm/debugdebugger.cpp +++ b/src/vm/debugdebugger.cpp @@ -211,7 +211,6 @@ FCIMPLEND { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/debughelp.cpp b/src/vm/debughelp.cpp index b60434658a..ebc9e09ff8 100644 --- a/src/vm/debughelp.cpp +++ b/src/vm/debughelp.cpp @@ -20,7 +20,6 @@ BOOL isMemoryReadable(const TADDR start, unsigned len) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -108,7 +107,6 @@ bool isRetAddr(TADDR retAddr, TADDR* whereCalled) { NOTHROW; GC_NOTRIGGER; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/dispatchinfo.cpp b/src/vm/dispatchinfo.cpp index 78007b2c45..983d42359c 100644 --- a/src/vm/dispatchinfo.cpp +++ b/src/vm/dispatchinfo.cpp @@ -2306,7 +2306,6 @@ void DispatchInfo::MarshalParamNativeToManaged(DispatchMemberInfo *pMemberInfo, THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; @@ -2359,7 +2358,6 @@ void DispatchInfo::MarshalReturnValueManagedToNative(DispatchMemberInfo *pMember THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; @@ -3017,7 +3015,6 @@ MethodDesc* DispatchInfo::GetInvokeMemberMD() THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; POSTCONDITION(CheckPointer(RETVAL)); } CONTRACT_END; @@ -3034,7 +3031,6 @@ OBJECTREF DispatchInfo::GetReflectionObject() THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; @@ -3182,7 +3178,6 @@ DISPID DispatchInfo::GenerateDispID() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -3670,7 +3665,6 @@ MethodDesc* DispatchExInfo::GetInvokeMemberMD() THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; POSTCONDITION(CheckPointer(RETVAL)); } CONTRACT_END; diff --git a/src/vm/dllimport.cpp b/src/vm/dllimport.cpp index 18e77d8490..7dedce6f9d 100644 --- a/src/vm/dllimport.cpp +++ b/src/vm/dllimport.cpp @@ -6996,7 +6996,6 @@ EXTERN_C LPVOID STDCALL NDirectImportWorker(NDirectMethodDesc* pMD) THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/domainfile.cpp b/src/vm/domainfile.cpp index 31bc7a823b..0fd9c811d5 100644 --- a/src/vm/domainfile.cpp +++ b/src/vm/domainfile.cpp @@ -93,7 +93,6 @@ LoaderAllocator * DomainFile::GetLoaderAllocator() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -382,7 +381,6 @@ DomainAssembly *DomainFile::GetDomainAssembly() SUPPORTS_DAC; NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -514,7 +512,6 @@ BOOL DomainFile::DoIncrementalLoad(FileLoadLevel level) Thread *pThread; pThread = GetThread(); _ASSERTE(pThread); - INTERIOR_STACK_PROBE_FOR(pThread, 8); switch (level) { @@ -582,8 +579,6 @@ BOOL DomainFile::DoIncrementalLoad(FileLoadLevel level) UNREACHABLE(); } - END_INTERIOR_STACK_PROBE; - #ifdef FEATURE_MULTICOREJIT { Module * pModule = GetModule(); @@ -1658,7 +1653,6 @@ void DomainAssembly::DeliverAsyncEvents() NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; diff --git a/src/vm/domainfile.inl b/src/vm/domainfile.inl index e82ee3ed70..9c14a29035 100644 --- a/src/vm/domainfile.inl +++ b/src/vm/domainfile.inl @@ -7,7 +7,6 @@ inline Module* DomainFile::GetCurrentModule() { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; SUPPORTS_DAC; return m_pModule; @@ -47,7 +46,6 @@ inline Module* DomainFile::GetModule() inline Assembly* DomainAssembly::GetCurrentAssembly() { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return m_pAssembly; } @@ -70,14 +68,8 @@ inline Assembly* DomainAssembly::GetLoadedAssembly() inline Assembly* DomainAssembly::GetAssembly() { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; - { - // CheckLoadLevel() is SO_INTOLERANT. However, this is only done in - // debug for the consistency check, so we can accept the SO violation. - CONTRACT_VIOLATION(SOToleranceViolation); - CONSISTENCY_CHECK(CheckLoadLevel(FILE_LOAD_ALLOCATE)); - } + CONSISTENCY_CHECK(CheckLoadLevel(FILE_LOAD_ALLOCATE)); return m_pAssembly; } diff --git a/src/vm/dwreport.cpp b/src/vm/dwreport.cpp index 0890f3f334..fc5838e8c6 100644 --- a/src/vm/dwreport.cpp +++ b/src/vm/dwreport.cpp @@ -766,7 +766,6 @@ HRESULT RetrieveManagedBucketParameters( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -856,7 +855,6 @@ HRESULT GetBucketParametersForCurrentException( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/dynamicmethod.cpp b/src/vm/dynamicmethod.cpp index cbec6ae97d..5b9a6fac03 100644 --- a/src/vm/dynamicmethod.cpp +++ b/src/vm/dynamicmethod.cpp @@ -1054,7 +1054,6 @@ void LCGMethodResolver::GetJitContextCoop(SecurityControlFlags * securityControl THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; INJECT_FAULT(COMPlusThrowOM();); PRECONDITION(CheckPointer(securityControlFlags)); PRECONDITION(CheckPointer(typeOwner)); @@ -1479,7 +1478,6 @@ void* ChunkAllocator::New(size_t size) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/ecall.cpp b/src/vm/ecall.cpp index 3812ff1030..b8e0d64e8f 100644 --- a/src/vm/ecall.cpp +++ b/src/vm/ecall.cpp @@ -595,7 +595,6 @@ MethodDesc* ECall::MapTargetBackToMethod(PCODE pTarg, PCODE * ppAdjustedEntryPoi GC_NOTRIGGER; MODE_ANY; HOST_NOCALLS; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -633,7 +632,6 @@ CorInfoIntrinsics ECall::GetIntrinsicID(MethodDesc* pMD) THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; PRECONDITION(pMD->IsFCall()); } CONTRACTL_END; @@ -737,7 +735,6 @@ void HCallAssert(void*& cache, void* target) { CONTRACTL { - SO_TOLERANT; // STATIC_CONTRACT_DEBUG_ONLY NOTHROW; GC_NOTRIGGER; MODE_ANY; diff --git a/src/vm/eeconfig.cpp b/src/vm/eeconfig.cpp index a11dacd01d..d964243ce3 100644 --- a/src/vm/eeconfig.cpp +++ b/src/vm/eeconfig.cpp @@ -1278,7 +1278,6 @@ HRESULT EEConfig::GetConfigValueCallback(__in_z LPCWSTR pKey, __deref_out_opt LP NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(pValue)); PRECONDITION(CheckPointer(pKey)); } CONTRACT_END; @@ -1312,7 +1311,6 @@ HRESULT EEConfig::GetConfiguration_DontUse_(__in_z LPCWSTR pKey, ConfigSearch di NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; // TODO: Verify this does not do anything that would make it so_intolerant PRECONDITION(CheckPointer(pValue)); PRECONDITION(CheckPointer(pKey)); } CONTRACT_END; @@ -1330,9 +1328,7 @@ HRESULT EEConfig::GetConfiguration_DontUse_(__in_z LPCWSTR pKey, ConfigSearch di ConfigStringHashtable* table = iter.Next(); if(table != NULL) { - BEGIN_SO_INTOLERANT_CODE_NOTHROW(pThread, RETURN E_FAIL;) pair = table->Lookup(pKey); - END_SO_INTOLERANT_CODE if(pair != NULL) { *pValue = pair->value; @@ -1347,9 +1343,7 @@ HRESULT EEConfig::GetConfiguration_DontUse_(__in_z LPCWSTR pKey, ConfigSearch di table != NULL; table = iter.Next()) { - BEGIN_SO_INTOLERANT_CODE_NOTHROW(pThread, RETURN E_FAIL;) pair = table->Lookup(pKey); - END_SO_INTOLERANT_CODE if(pair != NULL) { *pValue = pair->value; @@ -1363,9 +1357,7 @@ HRESULT EEConfig::GetConfiguration_DontUse_(__in_z LPCWSTR pKey, ConfigSearch di table != NULL; table = iter.Previous()) { - BEGIN_SO_INTOLERANT_CODE_NOTHROW(pThread, RETURN E_FAIL;) pair = table->Lookup(pKey); - END_SO_INTOLERANT_CODE if(pair != NULL) { *pValue = pair->value; diff --git a/src/vm/eeconfig.h b/src/vm/eeconfig.h index 9df371515a..cf463365bb 100644 --- a/src/vm/eeconfig.h +++ b/src/vm/eeconfig.h @@ -118,7 +118,6 @@ public: GC_NOTRIGGER; // MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; pEnd = &(pList->m_pElement); @@ -137,7 +136,6 @@ public: GC_NOTRIGGER; // MODE_ANY; FORBID_FAULT; - SO_TOLERANT; POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); } CONTRACT_END; @@ -154,8 +152,7 @@ public: NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - // MODE_ANY; - SO_TOLERANT; + // MODE_ANY; POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); } CONTRACT_END; diff --git a/src/vm/eecontract.cpp b/src/vm/eecontract.cpp index 2d5212e6a0..77c1f7ea1f 100644 --- a/src/vm/eecontract.cpp +++ b/src/vm/eecontract.cpp @@ -29,7 +29,6 @@ void EEContract::DoChecks(UINT testmask, __in_z const char *szFunction, __in_z c SCAN_IGNORE_FAULT; // due to the contract checking logic itself. SCAN_IGNORE_TRIGGER; SCAN_IGNORE_LOCK; - SCAN_IGNORE_SO; // Many of the checks below result in calls to GetThread() // that work just fine if GetThread() returns NULL, so temporarily diff --git a/src/vm/eecontract.h b/src/vm/eecontract.h index fbe0d55a0d..602522d244 100644 --- a/src/vm/eecontract.h +++ b/src/vm/eecontract.h @@ -16,7 +16,6 @@ #define EECONTRACT_H_ #include "contract.h" -#include "stackprobe.h" // -------------------------------------------------------------------------------- // EECONTRACT is an extension of the lower level CONTRACT macros to include some @@ -109,7 +108,6 @@ class EEContract : public BaseContract THROWS; \ GC_TRIGGERS; \ MODE_PREEMPTIVE; \ - SO_INTOLERANT; \ INJECT_FAULT(COMPlusThrowOM();); \ #endif // EECONTRACT_H_ diff --git a/src/vm/eedbginterfaceimpl.cpp b/src/vm/eedbginterfaceimpl.cpp index cd5964352d..32da864a57 100644 --- a/src/vm/eedbginterfaceimpl.cpp +++ b/src/vm/eedbginterfaceimpl.cpp @@ -26,7 +26,6 @@ void EEDbgInterfaceImpl::Terminate(void) { CONTRACTL { - SO_INTOLERANT; NOTHROW; GC_NOTRIGGER; } @@ -83,7 +82,6 @@ Frame *EEDbgInterfaceImpl::GetFrame(CrawlFrame *pCF) { CONTRACT(Frame *) { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pCF)); @@ -101,7 +99,6 @@ bool EEDbgInterfaceImpl::InitRegDisplay(Thread* pThread, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pThread)); @@ -120,7 +117,6 @@ BOOL EEDbgInterfaceImpl::IsStringObject(Object* o) { CONTRACTL { - SO_NOT_MAINLINE; THROWS; GC_NOTRIGGER; PRECONDITION(CheckPointer(o)); @@ -134,7 +130,6 @@ BOOL EEDbgInterfaceImpl::IsTypedReference(MethodTable* pMT) { CONTRACTL { - SO_NOT_MAINLINE; THROWS; GC_NOTRIGGER; PRECONDITION(CheckPointer(pMT)); @@ -148,7 +143,6 @@ WCHAR* EEDbgInterfaceImpl::StringObjectGetBuffer(StringObject* so) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(so)); @@ -162,7 +156,6 @@ DWORD EEDbgInterfaceImpl::StringObjectGetStringLength(StringObject* so) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(so)); @@ -176,7 +169,6 @@ void* EEDbgInterfaceImpl::GetObjectFromHandle(OBJECTHANDLE handle) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -195,7 +187,6 @@ OBJECTHANDLE EEDbgInterfaceImpl::GetHandleFromObject(void *obj, { CONTRACTL { - SO_NOT_MAINLINE; THROWS; // From CreateHandle GC_NOTRIGGER; PRECONDITION(CheckPointer(pAppDomain)); @@ -227,7 +218,6 @@ void EEDbgInterfaceImpl::DbgDestroyHandle(OBJECTHANDLE oh, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -273,7 +263,6 @@ bool EEDbgInterfaceImpl::IsThreadExceptionNull(Thread *pThread) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pThread)); @@ -312,7 +301,6 @@ bool EEDbgInterfaceImpl::StartSuspendForDebug(AppDomain *pAppDomain, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -330,7 +318,6 @@ bool EEDbgInterfaceImpl::SweepThreadsForDebug(bool forceSync) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; DISABLED(GC_TRIGGERS); // Called by unmanaged threads. } @@ -343,7 +330,6 @@ void EEDbgInterfaceImpl::ResumeFromDebug(AppDomain *pAppDomain) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -356,7 +342,6 @@ void EEDbgInterfaceImpl::MarkThreadForDebugSuspend(Thread* pRuntimeThread) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pRuntimeThread)); @@ -371,7 +356,6 @@ void EEDbgInterfaceImpl::MarkThreadForDebugStepping(Thread* pRuntimeThread, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pRuntimeThread)); @@ -386,7 +370,6 @@ void EEDbgInterfaceImpl::SetThreadFilterContext(Thread *thread, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(thread)); @@ -459,7 +442,6 @@ BOOL EEDbgInterfaceImpl::IsInPrologOrEpilog(const BYTE *address, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -493,7 +475,6 @@ void EEDbgInterfaceImpl::DetermineIfOffsetsInFilterOrHandler(const BYTE *functio { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -557,7 +538,6 @@ void EEDbgInterfaceImpl::GetMethodRegionInfo(const PCODE pStart, { CONTRACTL { - SO_INTOLERANT; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pCold)); @@ -661,7 +641,6 @@ void EEDbgInterfaceImpl::DisablePreemptiveGC(void) { CONTRACTL { - SO_INTOLERANT; NOTHROW; DISABLED(GC_TRIGGERS); // Disabled because disabled in RareDisablePreemptiveGC() } @@ -674,7 +653,6 @@ void EEDbgInterfaceImpl::EnablePreemptiveGC(void) { CONTRACTL { - SO_INTOLERANT; NOTHROW; DISABLED(GC_TRIGGERS); // Disabled because disabled in RareEnablePreemptiveGC() } @@ -687,7 +665,6 @@ bool EEDbgInterfaceImpl::IsPreemptiveGCDisabled(void) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; } @@ -750,7 +727,6 @@ ULONG EEDbgInterfaceImpl::MethodDescGetRVA(MethodDesc *pFD) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pFD)); @@ -1016,7 +992,6 @@ TypeHandle EEDbgInterfaceImpl::LoadPointerOrByrefType(CorElementType et, { CONTRACTL { - SO_NOT_MAINLINE; THROWS; GC_TRIGGERS; } @@ -1030,7 +1005,6 @@ TypeHandle EEDbgInterfaceImpl::LoadFnptrType(TypeHandle *inst, { CONTRACTL { - SO_NOT_MAINLINE; THROWS; GC_TRIGGERS; } @@ -1044,7 +1018,6 @@ TypeHandle EEDbgInterfaceImpl::LoadElementType(CorElementType et) { CONTRACTL { - SO_NOT_MAINLINE; THROWS; GC_TRIGGERS; } @@ -1068,7 +1041,6 @@ HRESULT EEDbgInterfaceImpl::GetMethodImplProps(Module *pModule, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pModule)); @@ -1084,7 +1056,6 @@ HRESULT EEDbgInterfaceImpl::GetParentToken(Module *pModule, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pModule)); @@ -1098,7 +1069,6 @@ void EEDbgInterfaceImpl::MarkDebuggerAttached(void) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -1112,7 +1082,6 @@ void EEDbgInterfaceImpl::MarkDebuggerUnattached(void) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -1134,7 +1103,6 @@ HRESULT EEDbgInterfaceImpl::EnCApplyChanges(EditAndContinueModule *pModule, LOG((LF_ENC, LL_INFO100, "EncApplyChanges\n")); CONTRACTL { - SO_NOT_MAINLINE; DISABLED(THROWS); DISABLED(GC_TRIGGERS); PRECONDITION(CheckPointer(pModule)); @@ -1154,7 +1122,6 @@ void EEDbgInterfaceImpl::ResumeInUpdatedFunction(EditAndContinueModule *pModule, { CONTRACTL { - SO_NOT_MAINLINE; DISABLED(THROWS); DISABLED(GC_TRIGGERS); PRECONDITION(CheckPointer(pModule)); @@ -1173,8 +1140,6 @@ bool EEDbgInterfaceImpl::CrawlFrameIsGcSafe(CrawlFrame *pCF) { CONTRACTL { - SO_NOT_MAINLINE; - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pCF)); @@ -1188,7 +1153,6 @@ bool EEDbgInterfaceImpl::IsStub(const BYTE *ip) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -1219,7 +1183,6 @@ bool EEDbgInterfaceImpl::TraceStub(const BYTE *ip, #ifndef DACCESS_COMPILE CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -1238,7 +1201,6 @@ bool EEDbgInterfaceImpl::FollowTrace(TraceDestination *trace) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -1255,7 +1217,6 @@ bool EEDbgInterfaceImpl::TraceFrame(Thread *thread, { CONTRACTL { - SO_NOT_MAINLINE; THROWS; DISABLED(GC_TRIGGERS); // This is not a bug - the debugger can call this on an un-managed thread. PRECONDITION(CheckPointer(frame)); @@ -1289,7 +1250,6 @@ bool EEDbgInterfaceImpl::TraceManager(Thread *thread, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_TRIGGERS; PRECONDITION(CheckPointer(stubManager)); @@ -1332,7 +1292,6 @@ void EEDbgInterfaceImpl::EnableTraceCall(Thread *thread) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(thread)); @@ -1346,7 +1305,6 @@ void EEDbgInterfaceImpl::DisableTraceCall(Thread *thread) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(thread)); @@ -1376,7 +1334,6 @@ void EEDbgInterfaceImpl::GetRuntimeOffsets(SIZE_T *pTLSIndex, { CONTRACTL { - SO_INTOLERANT; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pTLSIndex)); @@ -1418,7 +1375,6 @@ void EEDbgInterfaceImpl::DebuggerModifyingLogSwitch (int iNewLevel, { CONTRACTL { - SO_NOT_MAINLINE; THROWS; GC_NOTRIGGER; } @@ -1438,7 +1394,6 @@ HRESULT EEDbgInterfaceImpl::SetIPFromSrcToDst(Thread *pThread, { CONTRACTL { - SO_NOT_MAINLINE; THROWS; GC_TRIGGERS; } @@ -1461,7 +1416,6 @@ void EEDbgInterfaceImpl::SetDebugState(Thread *pThread, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pThread)); @@ -1487,7 +1441,6 @@ void EEDbgInterfaceImpl::SetAllDebugState(Thread *et, { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -1512,7 +1465,6 @@ CorDebugUserState EEDbgInterfaceImpl::GetPartialUserState(Thread *pThread) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; PRECONDITION(CheckPointer(pThread)); diff --git a/src/vm/eedbginterfaceimpl.inl b/src/vm/eedbginterfaceimpl.inl index 3506a3261f..0b9306babf 100644 --- a/src/vm/eedbginterfaceimpl.inl +++ b/src/vm/eedbginterfaceimpl.inl @@ -25,7 +25,6 @@ class EEToDebuggerExceptionInterfaceWrapper { THROWS; GC_TRIGGERS; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -52,7 +51,6 @@ class EEToDebuggerExceptionInterfaceWrapper { THROWS; GC_TRIGGERS; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/eehash.inl b/src/vm/eehash.inl index ba25fcbee5..4ed9fa2b81 100644 --- a/src/vm/eehash.inl +++ b/src/vm/eehash.inl @@ -442,7 +442,6 @@ BOOL EEHashTableBase<KeyType, Helper, bDefaultCopyIsDeep>::GetValue(KeyType pKey WRAPPER(THROWS); WRAPPER(GC_NOTRIGGER); FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -494,7 +493,6 @@ FORCEINLINE BOOL EEHashTableBase<KeyType, Helper, bDefaultCopyIsDeep>::GetValueS #ifdef MODE_COOPERATIVE // This header file sees contract.h, not eecontract.h - what a kludge! MODE_COOPERATIVE; #endif - SO_TOLERANT; } CONTRACTL_END @@ -519,7 +517,6 @@ EEHashEntry_t *EEHashTableBase<KeyType, Helper, bDefaultCopyIsDeep>::FindItem(Ke WRAPPER(THROWS); WRAPPER(GC_NOTRIGGER); FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -535,7 +532,6 @@ EEHashEntry_t *EEHashTableBase<KeyType, Helper, bDefaultCopyIsDeep>::FindItem(Ke WRAPPER(THROWS); WRAPPER(GC_NOTRIGGER); FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -604,7 +600,6 @@ FORCEINLINE EEHashEntry_t *EEHashTableBase<KeyType, Helper, bDefaultCopyIsDeep>: #ifdef MODE_COOPERATIVE // This header file sees contract.h, not eecontract.h - what a kludge! MODE_COOPERATIVE; #endif - SO_TOLERANT; } CONTRACTL_END diff --git a/src/vm/eepolicy.cpp b/src/vm/eepolicy.cpp index 4cd4d0a03c..62e47b18c6 100644 --- a/src/vm/eepolicy.cpp +++ b/src/vm/eepolicy.cpp @@ -380,7 +380,6 @@ EPolicyAction EEPolicy::GetActionOnFailureNoHostNotification(EClrFailure failure { CONTRACTL { - SO_TOLERANT; MODE_ANY; GC_NOTRIGGER; NOTHROW; @@ -399,7 +398,6 @@ EPolicyAction EEPolicy::GetActionOnFailure(EClrFailure failure) { CONTRACTL { - SO_TOLERANT; MODE_ANY; GC_NOTRIGGER; NOTHROW; @@ -423,7 +421,6 @@ void EEPolicy::NotifyHostOnTimeout(EClrOperation operation, EPolicyAction action THROWS; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -437,7 +434,6 @@ void EEPolicy::NotifyHostOnDefaultAction(EClrOperation operation, EPolicyAction NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -445,8 +441,6 @@ void EEPolicy::NotifyHostOnDefaultAction(EClrOperation operation, EPolicyAction void SafeExitProcess(UINT exitCode, BOOL fAbort = FALSE, ShutdownCompleteAction sca = SCA_ExitProcessWhenShutdownComplete) { - // The process is shutting down. No need to check SO contract. - SO_NOT_MAINLINE_FUNCTION; STRESS_LOG2(LF_SYNC, LL_INFO10, "SafeExitProcess: exitCode = %d, fAbort = %d\n", exitCode, fAbort); CONTRACTL { @@ -654,7 +648,6 @@ EPolicyAction EEPolicy::DetermineResourceConstraintAction(Thread *pThread) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -735,60 +728,6 @@ void EEPolicy::HandleOutOfMemory() PerformResourceConstraintAction(pThread, action, HOST_E_EXITPROCESS_OUTOFMEMORY, TRUE); } -#ifdef FEATURE_STACK_PROBE -//--------------------------------------------------------------------------------------- -// -// IsSOTolerant - Is the current thread in SO Tolerant region? -// -// Arguments: -// pLimitFrame: the limit of search for frames -// -// Return Value: -// TRUE if in SO tolerant region. -// FALSE if in SO intolerant region. -// -// Note: -// We walk our frame chain to decide. If HelperMethodFrame is seen first, we are in tolerant -// region. If EnterSOIntolerantCodeFrame is seen first, we are in intolerant region. -// -BOOL Thread::IsSOTolerant(void * pLimitFrame) -{ - LIMITED_METHOD_CONTRACT; - - Frame *pFrame = GetFrame(); - void* pSOIntolerantMarker = ClrFlsGetValue(TlsIdx_SOIntolerantTransitionHandler); - if (pSOIntolerantMarker == FRAME_TOP) - { - // We have not set a marker for intolerant transition yet. - return TRUE; - } - while (pFrame != FRAME_TOP && pFrame < pLimitFrame) - { - Frame::ETransitionType type = pFrame->GetTransitionType(); - if (pFrame > pSOIntolerantMarker) - { - return FALSE; - } - else if (type == Frame::TT_M2U || type == Frame::TT_InternalCall || - // We can not call HelperMethodFrame::GetFunction on SO since the call - // may need to call into host. This is why we check for TT_InternalCall first. - pFrame->GetFunction() != NULL) - { - return TRUE; - } - pFrame = pFrame->Next(); - } - - if (pFrame == FRAME_TOP) - // We walked to the end of chain, but the thread has one IntolerantMarker on stack decided from - // the check above while loop. - return FALSE; - else - return TRUE; -} - -#endif - //--------------------------------------------------------------------------------------- // // EEPolicy::HandleStackOverflow - Handle stack overflow according to policy @@ -813,8 +752,7 @@ BOOL Thread::IsSOTolerant(void * pLimitFrame) // 3. If stack overflows in SO intolerant region, the process is killed as soon as the exception is seen by our vector handler, or // our managed exception handler. // -// If SO Probing code is disabled (by FEATURE_STACK_PROBE not defined) then the process -// is terminated if there is StackOverflow as all clr code will be considered SO Intolerant. +// The process is terminated if there is StackOverflow as all clr code is considered SO Intolerant. void EEPolicy::HandleStackOverflow(StackOverflowDetector detector, void * pLimitFrame) { WRAPPER_NO_CONTRACT; @@ -834,118 +772,14 @@ void EEPolicy::HandleStackOverflow(StackOverflowDetector detector, void * pLimit return; } -#ifdef FEATURE_STACK_PROBE - - // We only process SO once at - // 1. VectoredExceptionHandler if SO in mscorwks - // 2. managed exception handler - // 3. SO_Tolerant transition handler - if (pThread->HasThreadStateNC(Thread::TSNC_SOWorkNeeded) && - detector != SOD_UnmanagedFrameHandler) - { - return; - } -#endif - -#ifdef FEATURE_STACK_PROBE - BOOL fInSoTolerant = pThread->IsSOTolerant(pLimitFrame); -#else - BOOL fInSoTolerant = false; -#endif - EXCEPTION_POINTERS exceptionInfo; GetCurrentExceptionPointers(&exceptionInfo); _ASSERTE(exceptionInfo.ExceptionRecord); -#ifdef FEATURE_STACK_PROBE - DWORD exceptionCode = exceptionInfo.ExceptionRecord->ExceptionCode; - - AppDomain *pCurrentDomain = ::GetAppDomain(); - BOOL fInDefaultDomain = (pCurrentDomain == SystemDomain::System()->DefaultDomain()); - BOOL fInCLR = IsIPInModule(g_pMSCorEE, (PCODE)GetIP(exceptionInfo.ContextRecord)); - - if (exceptionCode == EXCEPTION_SOFTSO) - { - // Our probe detects a thread does not have enough stack. But we have not trashed the process - // state yet. - fInSoTolerant = TRUE; - } - else - { - _ASSERTE (exceptionCode == STATUS_STACK_OVERFLOW); - - switch (detector) - { - case SOD_ManagedFrameHandler: - if (!pThread->PreemptiveGCDisabled() && !fInCLR && fInSoTolerant) - { - // Managed exception handler detects SO, but the thread is in preemptive GC mode, - // and the IP is outside CLR. This means we are inside a PINVOKE call. - fInSoTolerant = FALSE; - } - break; - - case SOD_UnmanagedFrameHandler: - break; - - case SOD_SOIntolerantTransitor: - fInSoTolerant = FALSE; - break; - - case SOD_SOTolerantTransitor: - if (!fInCLR) - { - // If SO happens outside of CLR, and it is not detected by managed frame handler, - // it is fatal - fInSoTolerant = FALSE; - } - break; - - default: - _ASSERTE(!"should not get here"); - } - - if (fInDefaultDomain) - { - // StackOverflow in default domain is fatal - fInSoTolerant = FALSE; - } - } - -#endif // FEATURE_STACK_PROBE - - ProcessSOEventForHost(&exceptionInfo, fInSoTolerant); + ProcessSOEventForHost(&exceptionInfo, false /* fInSoTolerant */); -#ifdef FEATURE_STACK_PROBE - if (!CLRHosted() || GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) != eRudeUnloadAppDomain) - { - // For security reason, it is not safe to continue execution if stack overflow happens - // unless a host tells us to do something different. - EEPolicy::HandleFatalStackOverflow(&exceptionInfo); - } -#endif - - if (!fInSoTolerant) - { - EEPolicy::HandleFatalStackOverflow(&exceptionInfo); - } -#ifdef FEATURE_STACK_PROBE - else - { - // EnableADUnloadWorker is SO_Intolerant. - // But here we know that if we have only one page, we will only update states of the Domain. - CONTRACT_VIOLATION(SOToleranceViolation); - - pThread->PrepareThreadForSOWork(); - - pThread->MarkThreadForAbort( - (Thread::ThreadAbortRequester)(Thread::TAR_Thread|Thread::TAR_StackOverflow), - EEPolicy::TA_Rude); - - pThread->SetSOWorkNeeded(); - } -#endif + EEPolicy::HandleFatalStackOverflow(&exceptionInfo); } @@ -963,72 +797,6 @@ static EXCEPTION_RECORD g_SOExceptionRecord = { EXCEPTION_POINTERS g_SOExceptionPointers = {&g_SOExceptionRecord, NULL}; -#ifdef FEATURE_STACK_PROBE -// This function may be called on a thread before debugger is notified of the thread, like in -// ManagedThreadBase_DispatchMiddle. Currently we can not notify managed debugger, because -// RS requires that notification is sent first. -void EEPolicy::HandleSoftStackOverflow(BOOL fSkipDebugger) -{ - WRAPPER_NO_CONTRACT; - - // If we trigger a SO while handling the soft stack overflow, - // we'll rip the process - BEGIN_SO_INTOLERANT_CODE_NOPROBE; - - AppDomain *pCurrentDomain = ::GetAppDomain(); - - if (GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) != eRudeUnloadAppDomain || - pCurrentDomain == SystemDomain::System()->DefaultDomain()) - { - // We may not be able to build a context on stack - ProcessSOEventForHost(NULL, FALSE); - - - EEPolicy::HandleFatalStackOverflow(&g_SOExceptionPointers, fSkipDebugger); - } - //else if (pCurrentDomain == SystemDomain::System()->DefaultDomain()) - //{ - // We hit soft SO in Default domain, but default domain can not be unloaded. - // Soft SO can happen in default domain, eg. GetResourceString, or EnsureGrantSetSerialized. - // So the caller is going to throw a managed exception. - // RaiseException(EXCEPTION_SOFTSO, 0, 0, NULL); - //} - else - { - Thread* pThread = GetThread(); - - // We are leaving VM boundary, either entering managed code, or entering - // non-VM unmanaged code. - // We should not throw internal C++ exception. Instead we throw an exception - // with EXCEPTION_SOFTSO code. - RaiseException(EXCEPTION_SOFTSO, 0, 0, NULL); - } - - END_SO_INTOLERANT_CODE_NOPROBE; - -} - -void EEPolicy::HandleStackOverflowAfterCatch() -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - SO_TOLERANT; - MODE_ANY; - } - CONTRACTL_END; - -#ifdef STACK_GUARDS_DEBUG - BaseStackGuard::RestoreCurrentGuard(FALSE); -#endif - Thread *pThread = GetThread(); - pThread->RestoreGuardPage(); - pThread->FinishSOWork(); -} -#endif - - //--------------------------------------------------------------------------------------- // HandleExitProcess is used to shutdown the runtime, based on policy previously set, // then to exit the process. Note, however, that the process will not exit if @@ -1055,7 +823,6 @@ StackWalkAction LogCallstackForLogCallback( { THROWS; GC_TRIGGERS; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1355,7 +1122,7 @@ void DECLSPEC_NORETURN EEPolicy::HandleFatalStackOverflow(EXCEPTION_POINTERS *pE { // This is fatal error. We do not care about SO mode any more. // All of the code from here on out is robust to any failures in any API's that are called. - CONTRACT_VIOLATION(GCViolation | ModeViolation | SOToleranceViolation | FaultNotFatal | TakesLockViolation); + CONTRACT_VIOLATION(GCViolation | ModeViolation | FaultNotFatal | TakesLockViolation); WRAPPER_NO_CONTRACT; @@ -1468,7 +1235,7 @@ void DECLSPEC_NORETURN EEPolicy::HandleFatalError(UINT exitCode, UINT_PTR addres { // This is fatal error. We do not care about SO mode any more. // All of the code from here on out is robust to any failures in any API's that are called. - CONTRACT_VIOLATION(GCViolation | ModeViolation | SOToleranceViolation | FaultNotFatal | TakesLockViolation); + CONTRACT_VIOLATION(GCViolation | ModeViolation | FaultNotFatal | TakesLockViolation); // Setting g_fFatalErrorOccuredOnGCThread allows code to avoid attempting to make GC mode transitions which could diff --git a/src/vm/eetoprofinterfaceimpl.cpp b/src/vm/eetoprofinterfaceimpl.cpp index 63003caf7c..1b06eaeb94 100644 --- a/src/vm/eetoprofinterfaceimpl.cpp +++ b/src/vm/eetoprofinterfaceimpl.cpp @@ -50,7 +50,6 @@ // If you use MODE_ANY, you must comment why you don't want an exact mode. // CAN_TAKE_LOCK // ASSERT_NO_EE_LOCKS_HELD() -// SO_NOT_MAINLINE // Note that the preferred contracts in this file are DIFFERENT than the preferred // contracts for proftoeeinterfaceimpl.cpp. // @@ -142,9 +141,8 @@ enum ClrToProfEntrypointFlags return S_OK; \ } -// Least common denominator for the callback wrappers. Logs, removes stack -// guard (REMOVE_STACK_GUARD_FOR_PROFILER_CALL), records in EE Thread object that -// we're in a callback, and asserts that we're allowed to issue callbacks for the +// Least common denominator for the callback wrappers. Logs, records in EE Thread object +// that we're in a callback, and asserts that we're allowed to issue callbacks for the // specified ThreadID (i.e., no ThreadDestroyed callback has been issued for the // ThreadID). // @@ -153,7 +151,6 @@ enum ClrToProfEntrypointFlags CHECK_PROFILER_STATUS(ee2pFlags); \ LOG(logParams); \ _ASSERTE(m_pCallback2 != NULL); \ - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; \ /* Normally, set COR_PRF_CALLBACKSTATE_INCALLBACK | */ \ /* COR_PRF_CALLBACKSTATE_IN_TRIGGERS_SCOPE in the callback state, but omit */ \ /* COR_PRF_CALLBACKSTATE_IN_TRIGGERS_SCOPE if we're in a GC_NOTRIGGERS callback */ \ @@ -247,7 +244,6 @@ static HRESULT CoCreateProfiler( // which takes locks. CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; _ASSERTE(pClsid != NULL); @@ -630,17 +626,12 @@ HRESULT EEToProfInterfaceImpl::CreateProfiler( CAN_TAKE_LOCK; MODE_PREEMPTIVE; - SO_NOT_MAINLINE; } CONTRACTL_END; // Always called before Thread created. _ASSERTE(GetThreadNULLOk() == NULL); - // We'll be calling into the profiler to create its ICorProfilerCallback* - // implementation - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; - // Try and CoCreate the registered profiler ReleaseHolder<ICorProfilerCallback2> pCallback2; HModuleHolder hmodProfilerDLL; @@ -914,7 +905,6 @@ EEToProfInterfaceImpl::~EEToProfInterfaceImpl() { if (m_pCallback2 != NULL) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; m_pCallback2->Release(); m_pCallback2 = NULL; } @@ -923,49 +913,42 @@ EEToProfInterfaceImpl::~EEToProfInterfaceImpl() if (fIsV4Profiler) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; m_pCallback3->Release(); m_pCallback3 = NULL; } if (m_pCallback4 != NULL) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; m_pCallback4->Release(); m_pCallback4 = NULL; } if (m_pCallback5 != NULL) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; m_pCallback5->Release(); m_pCallback5 = NULL; } if (m_pCallback6 != NULL) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; m_pCallback6->Release(); m_pCallback6 = NULL; } if (m_pCallback7 != NULL) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; m_pCallback7->Release(); m_pCallback7 = NULL; } if (m_pCallback8 != NULL) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; m_pCallback8->Release(); m_pCallback8 = NULL; } if (m_pCallback9 != NULL) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; m_pCallback9->Release(); m_pCallback9 = NULL; } @@ -1153,7 +1136,6 @@ UINT_PTR EEToProfInterfaceImpl::EEFunctionIDMapper(FunctionID funcId, BOOL * pbH // ListLockEntry typically held during this callback (thanks to // MethodTable::DoRunClassInitThrowing). - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1522,7 +1504,6 @@ HRESULT EEToProfInterfaceImpl::AllocByClass(ObjectID objId, ClassID clsId, void { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -2228,7 +2209,6 @@ HRESULT EEToProfInterfaceImpl::SetEventMask(DWORD dwEventMask, DWORD dwEventMask MODE_ANY; EE_THREAD_NOT_REQUIRED; CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2557,7 +2537,6 @@ HRESULT EEToProfInterfaceImpl::SetEnterLeaveFunctionHooks(FunctionEnter * pFuncE MODE_ANY; EE_THREAD_NOT_REQUIRED; CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2615,7 +2594,6 @@ HRESULT EEToProfInterfaceImpl::SetEnterLeaveFunctionHooks2(FunctionEnter2 * pFun MODE_ANY; EE_THREAD_NOT_REQUIRED; CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2674,7 +2652,6 @@ HRESULT EEToProfInterfaceImpl::SetEnterLeaveFunctionHooks3(FunctionEnter3 * pFun MODE_ANY; EE_THREAD_NOT_REQUIRED; CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2735,7 +2712,6 @@ HRESULT EEToProfInterfaceImpl::SetEnterLeaveFunctionHooks3WithInfo(FunctionEnter MODE_ANY; EE_THREAD_NOT_REQUIRED; CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2811,7 +2787,6 @@ HRESULT EEToProfInterfaceImpl::Initialize() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2854,7 +2829,6 @@ HRESULT EEToProfInterfaceImpl::InitializeForAttach(void * pvClientData, UINT cbC // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2913,7 +2887,6 @@ HRESULT EEToProfInterfaceImpl::ProfilerAttachComplete() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2977,7 +2950,6 @@ HRESULT EEToProfInterfaceImpl::ThreadCreated(ThreadID threadId) // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3021,7 +2993,6 @@ HRESULT EEToProfInterfaceImpl::ThreadDestroyed(ThreadID threadId) // Thread store lock is typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3092,7 +3063,6 @@ HRESULT EEToProfInterfaceImpl::ThreadAssignedToOSThread(ThreadID managedThreadId // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3138,7 +3108,6 @@ HRESULT EEToProfInterfaceImpl::ThreadNameChanged(ThreadID managedThreadId, // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3181,7 +3150,6 @@ HRESULT EEToProfInterfaceImpl::Shutdown() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3227,7 +3195,6 @@ HRESULT EEToProfInterfaceImpl::JITCompilationFinished(FunctionID functionId, // The JIT / MethodDesc code likely hold locks while this callback is made - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3267,7 +3234,6 @@ HRESULT EEToProfInterfaceImpl::JITCompilationStarted(FunctionID functionId, // The JIT / MethodDesc code likely hold locks while this callback is made - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3299,7 +3265,6 @@ HRESULT EEToProfInterfaceImpl::DynamicMethodUnloaded(FunctionID functionId) GC_TRIGGERS; MODE_COOPERATIVE; // RuntimeMethodHandle::Destroy (the caller) moves from QCALL to GCX_COOP CAN_TAKE_LOCK; - SO_TOLERANT; } CONTRACTL_END; @@ -3336,7 +3301,6 @@ HRESULT EEToProfInterfaceImpl::DynamicMethodJITCompilationFinished(FunctionID fu // The JIT / MethodDesc code likely hold locks while this callback is made - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3374,7 +3338,6 @@ HRESULT EEToProfInterfaceImpl::DynamicMethodJITCompilationStarted(FunctionID fun // The JIT / MethodDesc code likely hold locks while this callback is made - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3423,7 +3386,6 @@ HRESULT EEToProfInterfaceImpl::JITCachedFunctionSearchStarted( // The JIT / MethodDesc code likely hold locks while this callback is made - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3462,7 +3424,6 @@ HRESULT EEToProfInterfaceImpl::JITCachedFunctionSearchFinished( // The JIT / MethodDesc code likely hold locks while this callback is made - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3512,7 +3473,6 @@ HRESULT EEToProfInterfaceImpl::JITInlining( // The JIT / MethodDesc code likely hold locks while this callback is made - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3554,7 +3514,6 @@ HRESULT EEToProfInterfaceImpl::ReJITCompilationStarted( // The JIT / MethodDesc code likely hold locks while this callback is made - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3604,7 +3563,6 @@ HRESULT EEToProfInterfaceImpl::GetReJITParameters( // The ReJIT code holds a lock while this callback is made - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3648,7 +3606,6 @@ HRESULT EEToProfInterfaceImpl::ReJITCompilationFinished( // ReJit holds a lock as well as possibly others... - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3692,7 +3649,6 @@ HRESULT EEToProfInterfaceImpl::ReJITError( // Yay! CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3737,7 +3693,6 @@ HRESULT EEToProfInterfaceImpl::ModuleLoadStarted(ModuleID moduleId) // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3778,7 +3733,6 @@ HRESULT EEToProfInterfaceImpl::ModuleLoadFinished( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3819,7 +3773,6 @@ HRESULT EEToProfInterfaceImpl::ModuleUnloadStarted( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3860,7 +3813,6 @@ HRESULT EEToProfInterfaceImpl::ModuleUnloadFinished( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3899,7 +3851,6 @@ HRESULT EEToProfInterfaceImpl::ModuleAttachedToAssembly( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3935,7 +3886,6 @@ HRESULT EEToProfInterfaceImpl::ModuleInMemorySymbolsUpdated(ModuleID moduleId) // Yay! CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3981,7 +3931,6 @@ HRESULT EEToProfInterfaceImpl::ClassLoadStarted( // UnresolvedClassLock typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4021,7 +3970,6 @@ HRESULT EEToProfInterfaceImpl::ClassLoadFinished( // UnresolvedClassLock typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4064,7 +4012,6 @@ HRESULT EEToProfInterfaceImpl::ClassUnloadStarted( // exception is thrown, and EEClass::Destruct is called from the catch clause // inside ClassLoader::CreateTypeHandleForTypeDefThrowing. - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4104,7 +4051,6 @@ HRESULT EEToProfInterfaceImpl::ClassUnloadFinished( // Locks can be held when this is called. See comment in ClassUnloadStarted - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4148,7 +4094,6 @@ HRESULT EEToProfInterfaceImpl::AppDomainCreationStarted( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4189,7 +4134,6 @@ HRESULT EEToProfInterfaceImpl::AppDomainCreationFinished( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4229,7 +4173,6 @@ HRESULT EEToProfInterfaceImpl::AppDomainShutdownStarted( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4269,7 +4212,6 @@ HRESULT EEToProfInterfaceImpl::AppDomainShutdownFinished( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4315,7 +4257,6 @@ HRESULT EEToProfInterfaceImpl::AssemblyLoadStarted( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4357,7 +4298,6 @@ HRESULT EEToProfInterfaceImpl::AssemblyLoadFinished( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4397,7 +4337,6 @@ HRESULT EEToProfInterfaceImpl::AssemblyUnloadStarted( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4437,7 +4376,6 @@ HRESULT EEToProfInterfaceImpl::AssemblyUnloadFinished( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4482,7 +4420,6 @@ HRESULT EEToProfInterfaceImpl::UnmanagedToManagedTransition( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4522,7 +4459,6 @@ HRESULT EEToProfInterfaceImpl::ManagedToUnmanagedTransition( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4565,7 +4501,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionThrown( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4603,7 +4538,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionSearchFunctionEnter( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4640,7 +4574,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionSearchFunctionLeave() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4676,7 +4609,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionSearchFilterEnter(FunctionID functionId) // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4713,7 +4645,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionSearchFilterLeave() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4749,7 +4680,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionSearchCatcherFound(FunctionID functionId // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4798,7 +4728,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionUnwindFunctionEnter(FunctionID functionI // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4838,7 +4767,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionUnwindFunctionLeave() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4877,7 +4805,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionUnwindFinallyEnter(FunctionID functionId // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4917,7 +4844,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionUnwindFinallyLeave() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4956,7 +4882,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionCatcherEnter(FunctionID functionId, Obje // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4995,7 +4920,6 @@ HRESULT EEToProfInterfaceImpl::ExceptionCatcherLeave() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5041,7 +4965,6 @@ HRESULT EEToProfInterfaceImpl::COMClassicVTableCreated( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5083,7 +5006,6 @@ HRESULT EEToProfInterfaceImpl::COMClassicVTableDestroyed( // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5133,7 +5055,6 @@ HRESULT EEToProfInterfaceImpl::RuntimeSuspendStarted( // Thread store lock is typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5172,7 +5093,6 @@ HRESULT EEToProfInterfaceImpl::RuntimeSuspendFinished() // Thread store lock is typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5217,7 +5137,6 @@ HRESULT EEToProfInterfaceImpl::RuntimeSuspendAborted() // Thread store lock is typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5256,7 +5175,6 @@ HRESULT EEToProfInterfaceImpl::RuntimeResumeStarted() // Thread store lock is typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5291,7 +5209,6 @@ HRESULT EEToProfInterfaceImpl::RuntimeResumeFinished() // Thread store lock is typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5327,7 +5244,6 @@ HRESULT EEToProfInterfaceImpl::RuntimeThreadSuspended(ThreadID suspendedThreadId // Thread store lock is typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5357,7 +5273,6 @@ HRESULT EEToProfInterfaceImpl::RuntimeThreadSuspended(ThreadID suspendedThreadId // Remaining essentials from our entrypoint macros with kEE2PNoTrigger flag SetCallbackStateFlagsHolder csf(COR_PRF_CALLBACKSTATE_INCALLBACK); - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; _ASSERTE(m_pCallback2 != NULL); { @@ -5425,7 +5340,6 @@ HRESULT EEToProfInterfaceImpl::RuntimeThreadResumed(ThreadID resumedThreadId) // Thread store lock is typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5454,7 +5368,6 @@ HRESULT EEToProfInterfaceImpl::RuntimeThreadResumed(ThreadID resumedThreadId) // Remaining essentials from our entrypoint macros with kEE2PNoTrigger flag SetCallbackStateFlagsHolder csf(COR_PRF_CALLBACKSTATE_INCALLBACK); - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; _ASSERTE(m_pCallback2 != NULL); { @@ -5488,7 +5401,6 @@ HRESULT EEToProfInterfaceImpl::RemotingClientInvocationStarted() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5524,7 +5436,6 @@ HRESULT EEToProfInterfaceImpl::RemotingClientSendingMessage(GUID *pCookie, BOOL // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5560,7 +5471,6 @@ HRESULT EEToProfInterfaceImpl::RemotingClientReceivingReply(GUID * pCookie, BOOL // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5596,7 +5506,6 @@ HRESULT EEToProfInterfaceImpl::RemotingClientInvocationFinished() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5632,7 +5541,6 @@ HRESULT EEToProfInterfaceImpl::RemotingServerReceivingMessage(GUID *pCookie, BOO // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5668,7 +5576,6 @@ HRESULT EEToProfInterfaceImpl::RemotingServerInvocationStarted() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5704,7 +5611,6 @@ HRESULT EEToProfInterfaceImpl::RemotingServerInvocationReturned() // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5740,7 +5646,6 @@ HRESULT EEToProfInterfaceImpl::RemotingServerSendingReply(GUID *pCookie, BOOL fI // Yay! ASSERT_NO_EE_LOCKS_HELD(); - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5781,7 +5686,6 @@ HRESULT EEToProfInterfaceImpl::ObjectAllocated( // CrstAppDomainHandleTable can be held while this is called - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5818,7 +5722,6 @@ HRESULT EEToProfInterfaceImpl::MovedReferences(GCReferencesData *pData) // Thread store lock normally held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5921,7 +5824,6 @@ HRESULT EEToProfInterfaceImpl::NotifyAllocByClass(AllocByClassData *pData) // Thread store lock normally held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6014,7 +5916,6 @@ HRESULT EEToProfInterfaceImpl::ObjectReference(ObjectID objId, // Thread store lock normally held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6055,7 +5956,6 @@ HRESULT EEToProfInterfaceImpl::FinalizeableObjectQueued(BOOL isCritical, ObjectI // Thread store lock normally held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6092,7 +5992,6 @@ HRESULT EEToProfInterfaceImpl::RootReferences2(GCReferencesData *pData) // Thread store lock normally held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6157,7 +6056,6 @@ HRESULT EEToProfInterfaceImpl::ConditionalWeakTableElementReferences(GCReference // Thread store lock normally held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6217,7 +6115,6 @@ HRESULT EEToProfInterfaceImpl::HandleCreated(UINT_PTR handleId, ObjectID initial // CrstAppDomainHandleTable can be held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6255,7 +6152,6 @@ HRESULT EEToProfInterfaceImpl::HandleDestroyed(UINT_PTR handleId) // Thread store lock is typically held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6291,7 +6187,6 @@ HRESULT EEToProfInterfaceImpl::GarbageCollectionStarted(int cGenerations, BOOL g // Thread store lock normally held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6329,7 +6224,6 @@ HRESULT EEToProfInterfaceImpl::GarbageCollectionFinished() // Thread store lock normally held during this callback - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6367,7 +6261,6 @@ HRESULT EEToProfInterfaceImpl::ProfilerDetachSucceeded() // ProfilingAPIUtility::s_csStatus is held while this callback is issued. - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6405,7 +6298,6 @@ HRESULT EEToProfInterfaceImpl::GetAssemblyReferences(LPCWSTR wszAssemblyPath, IA // Yay! CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/eetoprofinterfaceimpl.inl b/src/vm/eetoprofinterfaceimpl.inl index b0fb41fff9..c504731f26 100644 --- a/src/vm/eetoprofinterfaceimpl.inl +++ b/src/vm/eetoprofinterfaceimpl.inl @@ -206,7 +206,6 @@ inline UINT_PTR EEToProfInterfaceImpl::LookupClientIDFromCache(FunctionID functi { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; diff --git a/src/vm/encee.cpp b/src/vm/encee.cpp index 86d9736e65..7291256217 100644 --- a/src/vm/encee.cpp +++ b/src/vm/encee.cpp @@ -1366,7 +1366,6 @@ void EnCSyncBlockInfo::Cleanup() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/eventreporter.cpp b/src/vm/eventreporter.cpp index 5f0b2cacc2..53556b2fed 100644 --- a/src/vm/eventreporter.cpp +++ b/src/vm/eventreporter.cpp @@ -196,7 +196,6 @@ void EventReporter::AddDescription(__in WCHAR *pString) { THROWS; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -220,7 +219,6 @@ void EventReporter::AddDescription(SString& s) { THROWS; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -276,7 +274,6 @@ void EventReporter::BeginStackTrace() { THROWS; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -370,7 +367,6 @@ void EventReporter::AddFailFastStackTrace(SString& s) { THROWS; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -544,7 +540,6 @@ StackWalkAction LogCallstackForEventReporterCallback( { THROWS; GC_TRIGGERS; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/eventtrace.cpp b/src/vm/eventtrace.cpp index a37fa92d09..96f2ebe630 100644 --- a/src/vm/eventtrace.cpp +++ b/src/vm/eventtrace.cpp @@ -256,7 +256,6 @@ ETW::SamplingLog::EtwStackWalkStatus ETW::SamplingLog::GetCurrentThreadsCallStac NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -296,7 +295,6 @@ ETW::SamplingLog::EtwStackWalkStatus ETW::SamplingLog::SaveCurrentStack(int skip NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -4409,7 +4407,6 @@ extern "C" MODE_ANY; CAN_TAKE_LOCK; STATIC_CONTRACT_FAULT; - SO_NOT_MAINLINE; } CONTRACTL_END; // Mark that we are the special ETWRundown thread. Currently all this does @@ -4983,7 +4980,6 @@ VOID ETW::CodeSymbolLog::EmitCodeSymbols(Module* pModule) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5067,7 +5063,6 @@ HRESULT ETW::CodeSymbolLog::GetInMemorySymbolsLength( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5150,7 +5145,6 @@ HRESULT ETW::CodeSymbolLog::ReadInMemorySymbols( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6246,7 +6240,6 @@ VOID ETW::MethodLog::SendMethodEvent(MethodDesc *pMethodDesc, DWORD dwEventOptio CONTRACTL { THROWS; GC_NOTRIGGER; - SO_NOT_MAINLINE; } CONTRACTL_END; Module *pModule = NULL; @@ -6647,7 +6640,6 @@ VOID ETW::MethodLog::SendMethodILToNativeMapEvent(MethodDesc * pMethodDesc, DWOR { THROWS; GC_NOTRIGGER; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/excep.cpp b/src/vm/excep.cpp index 34adc32ad2..17919701fe 100644 --- a/src/vm/excep.cpp +++ b/src/vm/excep.cpp @@ -81,7 +81,6 @@ BOOL IsExceptionFromManagedCode(const EXCEPTION_RECORD * pExceptionRecord) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; PRECONDITION(CheckPointer(pExceptionRecord)); } CONTRACTL_END; @@ -375,7 +374,6 @@ HRESULT GetExceptionHResult(OBJECTREF throwable) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -402,7 +400,6 @@ DWORD GetExceptionXCode(OBJECTREF throwable) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -2766,14 +2763,7 @@ VOID DECLSPEC_NORETURN RaiseTheException(OBJECTREF throwable, BOOL rethrow // We should throw c++ exception instead. ThrowOutOfMemory(); } -#ifdef FEATURE_STACK_PROBE - else if (throwable == CLRException::GetPreallocatedStackOverflowException()) - { - ThrowStackOverflow(); - } -#else _ASSERTE(throwable != CLRException::GetPreallocatedStackOverflowException()); -#endif #ifdef FEATURE_CORRUPTING_EXCEPTIONS if (!g_pConfig->LegacyCorruptedStateExceptionsPolicy()) @@ -2984,58 +2974,12 @@ VOID DECLSPEC_NORETURN RaiseTheExceptionInternalOnly(OBJECTREF throwable, BOOL r RaiseException(code, flags, argCount, args); } - // Probe for sufficient stack. - PUSH_STACK_PROBE_FOR_THROW(pParam->pThread); - -#ifndef STACK_GUARDS_DEBUG // This needs to be both here and inside the handler below // enable preemptive mode before call into OS GCX_PREEMP_NO_DTOR(); // In non-debug, we can just raise the exception once we've probed. RaiseException(code, flags, argCount, args); - -#else - // In a debug build, we need to unwind our probe structure off the stack. - BaseStackGuard *pThrowGuard = NULL; - // Stach away the address of the guard we just pushed above in PUSH_STACK_PROBE_FOR_THROW - SAVE_ADDRESS_OF_STACK_PROBE_FOR_THROW(pThrowGuard); - - // Add the stack guard reference to the structure below so that it can be accessed within - // PAL_TRY as well - struct ParamInner - { - ULONG code; - ULONG flags; - ULONG argCount; - ULONG_PTR *args; - BaseStackGuard *pGuard; - } param; - param.code = code; - param.flags = flags; - param.argCount = argCount; - param.args = args; - param.pGuard = pThrowGuard; - - PAL_TRY(ParamInner *, pParam, ¶m) - { - // enable preemptive mode before call into OS - GCX_PREEMP_NO_DTOR(); - - RaiseException(pParam->code, pParam->flags, pParam->argCount, pParam->args); - - // We never return from RaiseException, so shouldn't have to call SetNoException. - // However, in the debugger we can, and if we don't call SetNoException we get - // a short-circuit return assert. - RESET_EXCEPTION_FROM_STACK_PROBE_FOR_THROW(pParam->pGuard); - } - PAL_FINALLY - { - // pop the guard that we pushed above in PUSH_STACK_PROBE_FOR_THROW - POP_STACK_PROBE_FOR_THROW(pThrowGuard); - } - PAL_ENDTRY -#endif } PAL_EXCEPT_FILTER (RaiseExceptionFilter) { @@ -3071,14 +3015,7 @@ static VOID DECLSPEC_NORETURN RealCOMPlusThrowWorker(OBJECTREF throwable, BOOL r // We should throw c++ exception instead. ThrowOutOfMemory(); } -#ifdef FEATURE_STACK_PROBE - else if (throwable == CLRException::GetPreallocatedStackOverflowException()) - { - ThrowStackOverflow(); - } -#else _ASSERTE(throwable != CLRException::GetPreallocatedStackOverflowException()); -#endif // TODO: Do we need to install COMPlusFrameHandler here? INSTALL_COMPLUS_EXCEPTION_HANDLER(); @@ -3171,18 +3108,6 @@ STRINGREF GetResourceStringFromManaged(STRINGREF key) gc.key = key; gc.ret = NULL; - // The standard probe isn't good enough here. It's possible that we only have ~14 pages of stack - // left. By the time we transition to the default domain and start fetching this resource string, - // another 12 page probe could fail. - // This failing probe would cause us to unload the default appdomain, which would cause us - // to take down the process. - - // Instead, let's probe for a lots more stack to make sure that doesn' happen. - - // We need to have enough stack to survive 2 more probes... the original entrypoint back - // into mscorwks after we go into managed code, and a "large" probe that protects the GC - - INTERIOR_STACK_PROBE_FOR(GetThread(), DEFAULT_ENTRY_PROBE_AMOUNT * 2); GCPROTECT_BEGIN(gc); MethodDescCallSite getResourceStringLocal(METHOD__ENVIRONMENT__GET_RESOURCE_STRING_LOCAL); @@ -3200,9 +3125,6 @@ STRINGREF GetResourceStringFromManaged(STRINGREF key) GCPROTECT_END(); - END_INTERIOR_STACK_PROBE; - - return gc.ret; } @@ -3264,7 +3186,6 @@ void FreeExceptionData(ExceptionData *pedata) { NOTHROW; GC_TRIGGERS; - SO_TOLERANT; } CONTRACTL_END; @@ -3556,7 +3477,6 @@ void StackTraceInfo::Init() GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -3577,7 +3497,6 @@ void StackTraceInfo::FreeStackTrace() GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -3760,13 +3679,9 @@ void UnwindFrameChain(Thread* pThread, LPVOID pvLimitSP) NOTHROW; DISABLED(GC_TRIGGERS); // some Frames' ExceptionUnwind methods trigger :( MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; - // @todo - Remove this and add a hard SO probe as can't throw from here. - CONTRACT_VIOLATION(SOToleranceViolation); - Frame* pFrame = pThread->m_pFrame; if (pFrame < pvLimitSP) { @@ -3846,7 +3761,6 @@ BOOL IsAsyncThreadException(OBJECTREF *pThrowable) { BOOL IsUncatchable(OBJECTREF *pThrowable) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -3879,7 +3793,7 @@ BOOL IsUncatchable(OBJECTREF *pThrowable) BOOL IsStackOverflowException(Thread* pThread, EXCEPTION_RECORD* pExceptionRecord) { - if (IsSOExceptionCode(pExceptionRecord->ExceptionCode)) + if (pExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW) { return true; } @@ -4415,7 +4329,6 @@ static SpinLock initLock; void DECLSPEC_NORETURN RaiseDeadLockException() { STATIC_CONTRACT_THROWS; - STATIC_CONTRACT_SO_TOLERANT; // Disable the "initialization of static local vars is no thread safe" error #ifdef _MSC_VER @@ -4505,7 +4418,6 @@ LONG UserBreakpointFilter(EXCEPTION_POINTERS* pEP) GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -4579,7 +4491,6 @@ LONG DefaultCatchFilter(EXCEPTION_POINTERS *ep, PVOID pv) GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -5192,8 +5103,6 @@ LONG InternalUnhandledExceptionFilter( STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_ANY; - // We don't need to be SO-robust for an unhandled exception - SO_NOT_MAINLINE_FUNCTION; LOG((LF_EH, LL_INFO100, "InternalUnhandledExceptionFilter: at sp %p.\n", GetCurrentSP())); @@ -5276,14 +5185,11 @@ LONG EntryPointFilter(PEXCEPTION_POINTERS pExceptionInfo, PVOID _pData) THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; LONG ret = -1; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return EXCEPTION_CONTINUE_SEARCH;); - // Invoke the UEF worker to perform unhandled exception processing ret = InternalUnhandledExceptionFilter_Worker (pExceptionInfo); @@ -5297,9 +5203,6 @@ LONG EntryPointFilter(PEXCEPTION_POINTERS pExceptionInfo, PVOID _pData) LOG((LF_EH, LL_INFO100, "EntryPointFilter: setting TSNC_ProcessedUnhandledException\n")); pThread->SetThreadStateNC(Thread::TSNC_ProcessedUnhandledException); } - - - END_SO_INTOLERANT_CODE; return ret; } @@ -5328,8 +5231,6 @@ LONG __stdcall COMUnhandledExceptionFilter( // EXCEPTION_CONTINUE_SEARCH or STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_ANY; - // We don't need to be SO-robust for an unhandled exception - SO_NOT_MAINLINE_FUNCTION; LONG retVal = EXCEPTION_CONTINUE_SEARCH; @@ -6385,7 +6286,6 @@ LPVOID COMPlusCheckForAbort(UINT_PTR uTryCatchResumeAddress) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -6420,18 +6320,6 @@ LPVOID COMPlusCheckForAbort(UINT_PTR uTryCatchResumeAddress) // Question: Should we also check for (pThread->m_PreventAsync == 0) -#if !defined(WIN64EXCEPTIONS) && defined(FEATURE_STACK_PROBE) - // On Win64, this function is called by our exception handling code which has probed. - // But on X86, this is called from JIT code directly. We probe here so that - // we can restore the state of the thread below. - if (GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) == eRudeUnloadAppDomain) - { - // In case of SO, we will skip the managed code. - CONTRACT_VIOLATION(ThrowsViolation); - RetailStackProbe(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), pThread); - } -#endif // !WIN64EXCEPTIONS && FEATURE_STACK_PROBE - pThread->SetThrowControlForThread(Thread::InducedThreadRedirectAtEndOfCatch); if (!pThread->ReadyForAbort()) { @@ -6509,7 +6397,6 @@ BOOL IsThreadHijackedForThreadStop(Thread* pThread, EXCEPTION_RECORD* pException GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -6551,7 +6438,6 @@ void AdjustContextForThreadStop(Thread* pThread, GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -6613,7 +6499,6 @@ CreateCOMPlusExceptionObject(Thread *pThread, EXCEPTION_RECORD *pExceptionRecord GC_TRIGGERS; MODE_COOPERATIVE; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -6643,12 +6528,6 @@ CreateCOMPlusExceptionObject(Thread *pThread, EXCEPTION_RECORD *pExceptionRecord { EX_TRY { - // We need to disable the backout stack validation at this point since CreateThrowable can - // take arbitrarily large amounts of stack for different exception types; however we know - // for a fact that we will never go through this code path if the exception is a stack - // overflow exception since we already handled that case above with the pre-allocated SO exception. - DISABLE_BACKOUT_STACK_VALIDATION; - FAULT_NOT_FATAL(); ThreadPreventAsyncHolder preventAsync; @@ -6851,7 +6730,6 @@ IsDebuggerFault(EXCEPTION_RECORD *pExceptionRecord, LIMITED_METHOD_CONTRACT; #ifdef DEBUGGING_SUPPORTED - SO_NOT_MAINLINE_FUNCTION; #ifdef _TARGET_ARM_ // On ARM we don't have any reliable hardware support for single stepping so it is emulated in software. @@ -7275,7 +7153,6 @@ bool ShouldHandleManagedFault( { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -7471,7 +7348,7 @@ LONG WINAPI CLRVectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo) } #endif // defined(WIN64EXCEPTIONS) && defined(FEATURE_HIJACK) - if (IsSOExceptionCode(pExceptionInfo->ExceptionRecord->ExceptionCode)) + if (pExceptionInfo->ExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW) { // // Not an Out-of-memory situation, so no need for a forbid fault region here @@ -7481,18 +7358,6 @@ LONG WINAPI CLRVectoredExceptionHandler(PEXCEPTION_POINTERS pExceptionInfo) LONG retVal = 0; -#ifdef FEATURE_STACK_PROBE - // See if we've got enough stack to handle this exception - - // There isn't much stack left to attempt to report an exception. Let's trigger a hard - // SO, so we clear the guard page and give us at least another page of stack to work with. - - if (pThread && !pThread->IsStackSpaceAvailable(ADJUST_PROBE(1))) - { - DontCallDirectlyForceStackOverflow(); - } -#endif // FEATURE_STACK_PROBE - // We can't probe here, because we won't return from the CLRVectoredExceptionHandlerPhase2 // on WIN64 // @@ -7614,8 +7479,6 @@ LONG WINAPI CLRVectoredExceptionHandlerPhase2(PEXCEPTION_POINTERS pExceptionInfo BOOL fExternalException = FALSE; - BEGIN_SO_INTOLERANT_CODE_NOPROBE; - { // ExecutionManager::IsManagedCode takes a spinlock. Since we're in the middle of throwing, // we'll allow the lock, even if a caller didn't expect it. @@ -7625,8 +7488,6 @@ LONG WINAPI CLRVectoredExceptionHandlerPhase2(PEXCEPTION_POINTERS pExceptionInfo !IsIPInModule(g_pMSCorEE, GetIP(pExceptionInfo->ContextRecord))); } - END_SO_INTOLERANT_CODE_NOPROBE; - if (fExternalException) { // The breakpoint was not ours. Someone else can handle it. (Or if not, we'll get it again as @@ -7793,7 +7654,7 @@ VEH_ACTION WINAPI CLRVectoredExceptionHandlerPhase3(PEXCEPTION_POINTERS pExcepti PCODE ip = (PCODE)GetIP(pContext); if (IsIPInModule(g_pMSCorEE, ip) || IsIPInModule(GCHeapUtilities::GetGCModule(), ip)) { - CONTRACT_VIOLATION(ThrowsViolation|FaultViolation|SOToleranceViolation); + CONTRACT_VIOLATION(ThrowsViolation|FaultViolation); // // If you're debugging, set the debugger to catch first-chance AV's, then simply hit F5 or @@ -8390,7 +8251,6 @@ void UnwindAndContinueRethrowHelperInsideCatch(Frame* pEntryFrame, Exception* pE STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; Thread* pThread = GetThread(); @@ -8412,13 +8272,11 @@ void UnwindAndContinueRethrowHelperInsideCatch(Frame* pEntryFrame, Exception* pE if (!NingenEnabled()) { CONTRACT_VIOLATION(ThrowsViolation); - BEGIN_SO_INTOLERANT_CODE(pThread); // Call CLRException::GetThrowableFromException to force us to retrieve the THROWABLE // while we are still within the context of the catch block. This will help diagnose // cases where the last thrown object is NULL. OBJECTREF orThrowable = CLRException::GetThrowableFromException(pException); CONSISTENCY_CHECK(orThrowable != NULL); - END_SO_INTOLERANT_CODE; } #endif } @@ -8432,14 +8290,6 @@ VOID DECLSPEC_NORETURN UnwindAndContinueRethrowHelperAfterCatch(Frame* pEntryFra STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; - - // We really should probe before switching to cooperative mode, although there's no chance - // we'll SO in doing that as we've just caught an exception. We can't probe just - // yet though, because we want to avoid reprobing on an SO exception and we need to switch - // to cooperative to check the throwable for an SO as well as the pException object (as the - // pException could be a LastThrownObjectException.) Blech. - CONTRACT_VIOLATION(SOToleranceViolation); GCX_COOP(); @@ -8459,12 +8309,8 @@ VOID DECLSPEC_NORETURN UnwindAndContinueRethrowHelperAfterCatch(Frame* pEntryFra } else if (orThrowable->GetMethodTable() == g_pStackOverflowExceptionClass) { -#ifdef FEATURE_STACK_PROBE - EEPolicy::HandleSoftStackOverflow(); -#else /* The parameters of the function do not matter here */ EEPolicy::HandleStackOverflow(SOD_UnmanagedFrameHandler, NULL); -#endif } } @@ -8478,7 +8324,6 @@ void SaveCurrentExceptionInfo(PEXCEPTION_RECORD pRecord, PCONTEXT pContext) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -8493,10 +8338,10 @@ void SaveCurrentExceptionInfo(PEXCEPTION_RECORD pRecord, PCONTEXT pContext) if (CExecutionEngine::CheckThreadStateNoCreate(TlsIdx_PEXCEPTION_RECORD)) { BOOL fSave = TRUE; - if (!IsSOExceptionCode(pRecord->ExceptionCode)) + if (pRecord->ExceptionCode != STATUS_STACK_OVERFLOW) { DWORD dwLastExceptionCode = (DWORD)(SIZE_T) (ClrFlsGetValue(TlsIdx_EXCEPTION_CODE)); - if (IsSOExceptionCode(dwLastExceptionCode)) + if (dwLastExceptionCode == STATUS_STACK_OVERFLOW) { PEXCEPTION_RECORD lastRecord = static_cast<PEXCEPTION_RECORD> (ClrFlsGetValue(TlsIdx_PEXCEPTION_RECORD)); @@ -8874,7 +8719,6 @@ BOOL IsException(MethodTable *pMT) { NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -8897,7 +8741,6 @@ BOOL ExceptionTypeOverridesStackTraceGetter(PTR_MethodTable pMT) THROWS; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -11063,7 +10906,6 @@ void EHWatsonBucketTracker::SaveIpForWatsonBucket( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(IsWatsonEnabled()); } CONTRACTL_END; @@ -11106,7 +10948,6 @@ PTR_VOID EHWatsonBucketTracker::RetrieveWatsonBuckets() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(IsWatsonEnabled()); } CONTRACTL_END; @@ -11130,7 +10971,6 @@ void EHWatsonBucketTracker::ClearWatsonBucketDetails() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(IsWatsonEnabled()); } CONTRACTL_END; @@ -11202,7 +11042,6 @@ PTR_ExInfo GetEHTrackerForException(OBJECTREF oThrowable, PTR_ExInfo pStartingEH GC_NOTRIGGER; MODE_COOPERATIVE; NOTHROW; - SO_TOLERANT; PRECONDITION(GetThread() != NULL); PRECONDITION(oThrowable != NULL); } @@ -11253,7 +11092,6 @@ BOOL CEHelper::IsProcessCorruptedStateException(DWORD dwExceptionCode, BOOL fChe NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -11501,7 +11339,6 @@ BOOL CEHelper::IsProcessCorruptedStateException(OBJECTREF oThrowable) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; PRECONDITION(oThrowable != NULL); } CONTRACTL_END; @@ -11549,7 +11386,6 @@ void CEHelper::SetupCorruptionSeverityForActiveExceptionInUnwindPass(Thread *pCu NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(!fIsFirstPass); // This method should only be called during an unwind PRECONDITION(pCurThread != NULL); } @@ -11891,7 +11727,6 @@ void CEHelper::MarkLastActiveExceptionCorruptionSeverityForReraiseReuse() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(GetThread() != NULL); } CONTRACTL_END; @@ -12789,7 +12624,6 @@ VOID DECLSPEC_NORETURN RealCOMPlusThrowOM() DISABLED(GC_NOTRIGGER); // Must sanitize first pass handling to enable this CANNOT_TAKE_LOCK; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -13236,44 +13070,6 @@ VOID DECLSPEC_NORETURN RealCOMPlusThrowHR(EXCEPINFO *pExcepInfo) #endif // FEATURE_COMINTEROP - -#ifdef FEATURE_STACK_PROBE -//========================================================================== -// Throw a StackOverflowError -//========================================================================== -VOID DECLSPEC_NORETURN RealCOMPlusThrowSO() -{ - CONTRACTL - { - // This should be throws... But it isn't because a SO doesn't technically - // fall into the same THROW/NOTHROW conventions as the rest of the contract - // infrastructure. - NOTHROW; - - DISABLED(GC_NOTRIGGER); // Must sanitize first pass handling to enable this - SO_TOLERANT; - MODE_ANY; - } - CONTRACTL_END; - - // We only use BreakOnSO if we are in debug mode, so we'll only checking if the - // _DEBUG flag is set. -#ifdef _DEBUG - static int breakOnSO = -1; - - if (breakOnSO == -1) - breakOnSO = CLRConfig::GetConfigValue(CLRConfig::UNSUPPORTED_BreakOnSO); - - if (breakOnSO != 0) - { - _ASSERTE(!"SO occurred"); - } -#endif - - ThrowStackOverflow(); -} -#endif - //========================================================================== // Throw an InvalidCastException //========================================================================== @@ -13317,7 +13113,6 @@ VOID CheckAndThrowSameTypeAndAssemblyInvalidCastException(TypeHandle thCastFrom, THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; Module *pModuleTypeFrom = thCastFrom.GetModule(); diff --git a/src/vm/exceptionhandling.cpp b/src/vm/exceptionhandling.cpp index 8e6da16e8b..b97717cb64 100644 --- a/src/vm/exceptionhandling.cpp +++ b/src/vm/exceptionhandling.cpp @@ -882,7 +882,7 @@ ProcessCLRException(IN PEXCEPTION_RECORD pExceptionRecord // we don't handle the SO. if (!(dwExceptionFlags & EXCEPTION_UNWINDING)) { - if (IsSOExceptionCode(pExceptionRecord->ExceptionCode)) + if (pExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW) { // We don't need to unwind the frame chain here because we have backstop // personality routines at the U2M boundary to handle do that. They are @@ -896,15 +896,6 @@ ProcessCLRException(IN PEXCEPTION_RECORD pExceptionRecord FastInterlockAnd (&pThread->m_fPreemptiveGCDisabled, 0); return ExceptionContinueSearch; } - else - { -#ifdef FEATURE_STACK_PROBE - if (GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) == eRudeUnloadAppDomain) - { - RetailStackProbe(static_cast<unsigned int>(ADJUST_PROBE(BACKOUT_CODE_STACK_LIMIT)), pThread); - } -#endif - } } else { @@ -916,14 +907,12 @@ ProcessCLRException(IN PEXCEPTION_RECORD pExceptionRecord // look at our saved exception code. exceptionCode = GetCurrentExceptionCode(); - if (IsSOExceptionCode(exceptionCode)) + if (exceptionCode == STATUS_STACK_OVERFLOW) { return ExceptionContinueSearch; } } - BEGIN_CONTRACT_VIOLATION(SOToleranceViolation); - StackFrame sf((UINT_PTR)MemoryStackFp); @@ -986,15 +975,11 @@ ProcessCLRException(IN PEXCEPTION_RECORD pExceptionRecord // It is a breakpoint; is it from the runtime or managed code? PCODE ip = GetIP(pContextRecord); // IP of the fault. - BOOL fExternalException = FALSE; - - BEGIN_SO_INTOLERANT_CODE_NOPROBE; + BOOL fExternalException; fExternalException = (!ExecutionManager::IsManagedCode(ip) && !IsIPInModule(g_pMSCorEE, ip)); - END_SO_INTOLERANT_CODE_NOPROBE; - if (fExternalException) { // The breakpoint was not ours. Someone else can handle it. (Or if not, we'll get it again as @@ -1246,7 +1231,7 @@ ProcessCLRException(IN PEXCEPTION_RECORD pExceptionRecord // SO-tolerant mode before we do so. RestoreSOToleranceState(); #endif - RESET_CONTRACT_VIOLATION(); + ExceptionTracker::ResumeExecution(pContextRecord, NULL ); @@ -1264,8 +1249,6 @@ lExit: ; GCX_PREEMP_NO_DTOR(); } - END_CONTRACT_VIOLATION; - SetLastError(dwLastError); return returnDisposition; @@ -1287,7 +1270,6 @@ bool FixNonvolatileRegisters(UINT_PTR uOriginalSP, MODE_COOPERATIVE; NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -2683,17 +2665,6 @@ CLRUnwindStatus ExceptionTracker::ProcessManagedCallFrame( } -#ifdef FEATURE_STACK_PROBE - // Don't call a handler if we're within a certain distance of the end of the stack. Could end up here via probe, in - // which case guard page is intact, or via hard SO, in which case guard page won't be. So don't check for presence of - // guard page, just check for sufficient space on stack. - if ( IsStackOverflowException() - && !pThread->CanResetStackTo((void*)sf.SP)) - { - EH_LOG((LL_INFO100, " STACKOVERFLOW: IGNOREFRAME: stack frame too close to guard page: sf.SP: %p\n", sf.SP)); - } - else -#endif // FEATURE_STACK_PROBE { IJitManager* pJitMan = pcfThisFrame->GetJitManager(); const METHODTOKEN& MethToken = pcfThisFrame->GetMethodToken(); @@ -3275,24 +3246,6 @@ lExit: return ReturnStatus; } -// <64bit_And_Arm_Specific> - -// For funclets, add support for unwinding frame chain during SO. These definitions will be automatically picked up by -// BEGIN_SO_TOLERANT_CODE/END_SO_TOLERANT_CODE usage in ExceptionTracker::CallHandler below. -// -// This is required since funclet invocation is the only case of calling managed code from VM that is not wrapped by -// assembly helper with associated personality routine. The personality routine will invoke CleanupForSecondPass to -// release exception trackers and unwind frame chain. -// -// We need to do the same work as CleanupForSecondPass for funclet invocation in the face of SO. Thus, we redefine OPTIONAL_SO_CLEANUP_UNWIND -// below. This will perform frame chain unwind inside the "__finally" block that is part of the END_SO_TOLERANT_CODE macro only in the face -// of an SO. -// -// The second part of work, releasing exception trackers, is done inside the "__except" block also part of the END_SO_TOLERANT_CODE by invoking -// ClearExceptionStateAfterSO. -// -// </64bit_And_Arm_Specific> - #undef OPTIONAL_SO_CLEANUP_UNWIND #define OPTIONAL_SO_CLEANUP_UNWIND(pThread, pFrame) if (pThread->GetFrame() < pFrame) { UnwindFrameChain(pThread, pFrame); } @@ -3374,15 +3327,6 @@ DWORD_PTR ExceptionTracker::CallHandler( throwable = PossiblyUnwrapThrowable(pThread->GetThrowable(), pMD->GetAssembly()); - // We probe for stack space before attempting to call a filter, finally, or catch clause. The path from - // here to the actual managed code is very short. We must probe, however, because the JIT does not generate a - // probe for us upon entry to the handler. This probe ensures we have enough stack space to actually make it - // into the managed code. - // - // Incase a SO happens, this macro will also unwind the frame chain before continuing to dispatch the SO - // upstack (look at the macro implementation for details). - BEGIN_SO_TOLERANT_CODE(pThread); - // Stores the current SP and BSP, which will be the caller SP and BSP for the funclet. // Note that we are making the assumption here that the SP and BSP don't change from this point // forward until we actually make the call to the funclet. If it's not the case then we will need @@ -3450,8 +3394,6 @@ DWORD_PTR ExceptionTracker::CallHandler( this->m_EHClauseInfo.SetManagedCodeEntered(FALSE); - END_SO_TOLERANT_CODE; - // The first parameter specifies whether we want to make callbacks before (true) or after (false) // calling the handler. MakeCallbacksRelatedToHandler(false, pThread, pMD, pEHClause, uHandlerStartPC, sf); @@ -3886,7 +3828,7 @@ ExceptionTracker* ExceptionTracker::GetOrCreateTracker( // // Thus, if we see that we are here for SO in the 2nd pass, then // we shouldn't attempt to create a throwable. - if ((!fIsFirstPass) && (IsSOExceptionCode(pExceptionRecord->ExceptionCode))) + if ((!fIsFirstPass) && (pExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW)) { fCreateThrowableForCurrentPass = false; } @@ -5636,7 +5578,6 @@ BOOL FirstCallToHandler ( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -5671,7 +5612,6 @@ NOT_WIN64_ARG(IN ULONG MemoryStackFp), GC_NOTRIGGER; NOTHROW; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -5684,8 +5624,6 @@ NOT_WIN64_ARG(IN ULONG MemoryStackFp), Thread* pThread = GetThread(); CONTEXT *pNewContext = NULL; - VALIDATE_BACKOUT_STACK_CONSUMPTION; - if (FirstCallToHandler(pDispatcherContext, &pNewContext)) { // @@ -5735,11 +5673,6 @@ FixContextHandler(IN PEXCEPTION_RECORD pExceptionRecord { CONTEXT* pNewContext = NULL; - VALIDATE_BACKOUT_STACK_CONSUMPTION; - - // Our backout validation should ensure that we don't SO here. - BEGIN_CONTRACT_VIOLATION(SOToleranceViolation); - if (FirstCallToHandler(pDispatcherContext, &pNewContext)) { // @@ -5753,8 +5686,6 @@ FixContextHandler(IN PEXCEPTION_RECORD pExceptionRecord FixupDispatcherContext(pDispatcherContext, pNewContext, pContextRecord); - END_CONTRACT_VIOLATION; - // Returning ExceptionCollidedUnwind will cause the OS to take our new context record // and dispatcher context and restart the exception dispatching on this call frame, // which is exactly the behavior we want in order to restore our thread's unwindability @@ -5893,10 +5824,7 @@ UMThunkUnwindFrameChainHandler(IN PEXCEPTION_RECORD pExceptionRecord return ExceptionContinueSearch; } - bool fIsSO = - IsSOExceptionCode(pExceptionRecord->ExceptionCode); - - VALIDATE_BACKOUT_STACK_CONSUMPTION; + bool fIsSO = pExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW; if (IS_UNWINDING(pExceptionRecord->ExceptionFlags)) { @@ -5907,8 +5835,6 @@ UMThunkUnwindFrameChainHandler(IN PEXCEPTION_RECORD pExceptionRecord pThread->DisablePreemptiveGC(); } } - // The VALIDATE_BACKOUT_STACK_CONSUMPTION makes sure that this function does not use stack more than backout limit. - CONTRACT_VIOLATION(SOToleranceViolation); CleanUpForSecondPass(pThread, fIsSO, (void*)MemoryStackFp, (void*)MemoryStackFp); } @@ -5998,7 +5924,7 @@ CallDescrWorkerUnwindFrameChainHandler(IN PEXCEPTION_RECORD pExceptionReco Thread* pThread = GetThread(); _ASSERTE(pThread); - if (IsSOExceptionCode(pExceptionRecord->ExceptionCode)) + if (pExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW) { if (IS_UNWINDING(pExceptionRecord->ExceptionFlags)) { @@ -6017,10 +5943,6 @@ CallDescrWorkerUnwindFrameChainHandler(IN PEXCEPTION_RECORD pExceptionReco pContextRecord, pDispatcherContext); - // Our backout validation should ensure that we don't SO here. Add a - // backout validation here. - BEGIN_CONTRACT_VIOLATION(SOToleranceViolation); - if (retVal == ExceptionContinueSearch) { @@ -6034,8 +5956,6 @@ CallDescrWorkerUnwindFrameChainHandler(IN PEXCEPTION_RECORD pExceptionReco GCX_PREEMP_NO_DTOR(); } - END_CONTRACT_VIOLATION; - return retVal; } @@ -6073,7 +5993,6 @@ FixRedirectContextHandler( GC_NOTRIGGER; NOTHROW; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -6083,8 +6002,6 @@ FixRedirectContextHandler( pContextRecord, pDispatcherContext->ContextRecord); - VALIDATE_BACKOUT_STACK_CONSUMPTION; - CONTEXT *pRedirectedContext = GetCONTEXTFromRedirectedStubStackFrame(pDispatcherContext); FixupDispatcherContext(pDispatcherContext, pRedirectedContext, pContextRecord); diff --git a/src/vm/exceptmacros.h b/src/vm/exceptmacros.h index 8e78fc4221..9690155ca9 100644 --- a/src/vm/exceptmacros.h +++ b/src/vm/exceptmacros.h @@ -119,12 +119,8 @@ class Frame; class Exception; VOID DECLSPEC_NORETURN RealCOMPlusThrowOM(); -VOID DECLSPEC_NORETURN RealCOMPlusThrowSO(); #include <excepcpu.h> -#include "stackprobe.h" - - //========================================================================== // Macros to allow catching exceptions from within the EE. These are lightweight @@ -357,13 +353,7 @@ VOID DECLSPEC_NORETURN DispatchManagedException(PAL_SEHException& ex, bool isHar #define INSTALL_UNWIND_AND_CONTINUE_HANDLER \ INSTALL_UNWIND_AND_CONTINUE_HANDLER_NO_PROBE \ /* The purpose of the INSTALL_UNWIND_AND_CONTINUE_HANDLER is to translate an exception to a managed */ \ - /* exception before it hits managed code. The transition to SO_INTOLERANT code does not logically belong here. */ \ - /* However, we don't want to miss any probe points and the intersection between a probe point and installing */ \ - /* an INSTALL_UNWIND_AND_CONTINUE_HANDLER is very high. The probes are very cheap, so we can tolerate */ \ - /* those few places where we are probing and don't need to. */ \ - /* Ideally, we would instead have an encompassing ENTER_SO_INTOLERANT_CODE macro that would */ \ - /* include INSTALL_UNWIND_AND_CONTINUE_HANDLER */ \ - BEGIN_SO_INTOLERANT_CODE(GET_THREAD()); + /* exception before it hits managed code. */ // Optimized version for helper method frame. Avoids redundant GetThread() calls. #define INSTALL_UNWIND_AND_CONTINUE_HANDLER_FOR_HMF(pHelperFrame) \ @@ -374,8 +364,7 @@ VOID DECLSPEC_NORETURN DispatchManagedException(PAL_SEHException& ex, bool isHar SCAN_EHMARKER(); \ if (true) PAL_CPP_TRY { \ SCAN_EHMARKER_TRY(); \ - DEBUG_ASSURE_NO_RETURN_BEGIN(IUACH); \ - BEGIN_SO_INTOLERANT_CODE(GET_THREAD()); + DEBUG_ASSURE_NO_RETURN_BEGIN(IUACH); #define UNINSTALL_UNWIND_AND_CONTINUE_HANDLER_NO_PROBE \ DEBUG_ASSURE_NO_RETURN_END(IUACH) \ @@ -399,8 +388,7 @@ VOID DECLSPEC_NORETURN DispatchManagedException(PAL_SEHException& ex, bool isHar } \ #define UNINSTALL_UNWIND_AND_CONTINUE_HANDLER \ - END_SO_INTOLERANT_CODE; \ - UNINSTALL_UNWIND_AND_CONTINUE_HANDLER_NO_PROBE; \ + UNINSTALL_UNWIND_AND_CONTINUE_HANDLER_NO_PROBE; #endif // DACCESS_COMPILE || CROSSGEN_COMPILE @@ -444,9 +432,6 @@ extern DWORD g_ExceptionLine; #define COMPlusThrowHR if(THROWLOG() && 0) { } else RealCOMPlusThrowHR #define COMPlusThrowWin32 if(THROWLOG() && 0) { } else RealCOMPlusThrowWin32 #define COMPlusThrowOM if(THROWLOG() && 0) { } else RealCOMPlusThrowOM -#ifdef FEATURE_STACK_PROBE -#define COMPlusThrowSO if(THROWLOG() && 0) { } else RealCOMPlusThrowSO -#endif #define COMPlusThrowArithmetic if(THROWLOG() && 0) { } else RealCOMPlusThrowArithmetic #define COMPlusThrowArgumentNull if(THROWLOG() && 0) { } else RealCOMPlusThrowArgumentNull #define COMPlusThrowArgumentOutOfRange if(THROWLOG() && 0) { } else RealCOMPlusThrowArgumentOutOfRange @@ -469,9 +454,6 @@ extern DWORD g_ExceptionLine; #endif #define COMPlusThrowWin32 RealCOMPlusThrowWin32 #define COMPlusThrowOM RealCOMPlusThrowOM -#ifdef FEATURE_STACK_PROBE -#define COMPlusThrowSO RealCOMPlusThrowSO -#endif #define COMPlusThrowArithmetic RealCOMPlusThrowArithmetic #define COMPlusThrowArgumentNull RealCOMPlusThrowArgumentNull #define COMPlusThrowArgumentOutOfRange RealCOMPlusThrowArgumentOutOfRange @@ -523,14 +505,12 @@ void COMPlusCooperativeTransitionHandler(Frame* pFrame); { \ MAKE_CURRENT_THREAD_AVAILABLE(); \ BEGIN_GCX_ASSERT_PREEMP; \ - BEGIN_SO_INTOLERANT_CODE(CURRENT_THREAD); \ CoopTransitionHolder __CoopTransition(CURRENT_THREAD); \ DEBUG_ASSURE_NO_RETURN_BEGIN(COOP_TRANSITION) #define COOPERATIVE_TRANSITION_END() \ DEBUG_ASSURE_NO_RETURN_END(COOP_TRANSITION) \ __CoopTransition.SuppressRelease(); \ - END_SO_INTOLERANT_CODE; \ END_GCX_ASSERT_PREEMP; \ } diff --git a/src/vm/exinfo.cpp b/src/vm/exinfo.cpp index 1a73e25a6e..ef42774af6 100644 --- a/src/vm/exinfo.cpp +++ b/src/vm/exinfo.cpp @@ -22,7 +22,6 @@ void ExInfo::DestroyExceptionHandle(void) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -47,7 +46,6 @@ void ExInfo::CopyAndClearSource(ExInfo *from) GC_NOTRIGGER; if (GetThread() != NULL) MODE_COOPERATIVE; else MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -92,7 +90,6 @@ void ExInfo::Init() GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; @@ -175,7 +172,6 @@ void ExInfo::UnwindExInfo(VOID* limit) NOTHROW; // This function does not throw. GC_NOTRIGGER; if (GetThread() != NULL) MODE_COOPERATIVE; else MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -292,7 +288,6 @@ void ExInfo::SetExceptionCode(const EXCEPTION_RECORD *pCER) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE(pCER != NULL); m_ExceptionCode = pCER->ExceptionCode; diff --git a/src/vm/exstate.cpp b/src/vm/exstate.cpp index 0dc902a1f1..addca63ff8 100644 --- a/src/vm/exstate.cpp +++ b/src/vm/exstate.cpp @@ -151,7 +151,6 @@ OBJECTREF ThreadExceptionState::GetThrowable() MODE_COOPERATIVE; NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -177,7 +176,6 @@ void ThreadExceptionState::SetThrowable(OBJECTREF throwable DEBUG_ARG(SetThrowab if ((throwable == NULL) || CLRException::IsPreallocatedExceptionObject(throwable)) NOTHROW; else THROWS; // From CreateHandle GC_NOTRIGGER; if (throwable == NULL) MODE_ANY; else MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -207,13 +205,9 @@ void ThreadExceptionState::SetThrowable(OBJECTREF throwable DEBUG_ARG(SetThrowab } else { - BEGIN_SO_INTOLERANT_CODE(GetThread()); - { - AppDomain* pDomain = GetMyThread()->GetDomain(); - PREFIX_ASSUME(pDomain != NULL); - hNewThrowable = pDomain->CreateHandle(throwable); - } - END_SO_INTOLERANT_CODE; + AppDomain* pDomain = GetMyThread()->GetDomain(); + PREFIX_ASSUME(pDomain != NULL); + hNewThrowable = pDomain->CreateHandle(throwable); } #ifdef WIN64EXCEPTIONS diff --git a/src/vm/extensibleclassfactory.cpp b/src/vm/extensibleclassfactory.cpp index 5ffb5752d6..2b51650dce 100644 --- a/src/vm/extensibleclassfactory.cpp +++ b/src/vm/extensibleclassfactory.cpp @@ -31,7 +31,6 @@ static StackWalkAction FrameCallback(CrawlFrame *pCF, void *pData) THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(pMD)); PRECONDITION(CheckPointer(pData, NULL_OK)); PRECONDITION(pMD->GetMethodTable() != NULL); diff --git a/src/vm/fcall.cpp b/src/vm/fcall.cpp index 68fc271936..417cce7242 100644 --- a/src/vm/fcall.cpp +++ b/src/vm/fcall.cpp @@ -23,7 +23,6 @@ NOINLINE LPVOID __FCThrow(LPVOID __me, RuntimeExceptionKind reKind, UINT resID, // that we won't trigger without having setup a frame. // STATIC_CONTRACT_TRIGGER STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; // function probes before it does any work // side effect the compiler can't remove if (FC_NO_TAILCALL != 1) @@ -67,7 +66,6 @@ NOINLINE LPVOID __FCThrowArgument(LPVOID __me, RuntimeExceptionKind reKind, LPCW // that we won't trigger without having setup a frame. // STATIC_CONTRACT_TRIGGER STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; // function probes before it does any work // side effect the compiler can't remove if (FC_NO_TAILCALL != 1) @@ -119,7 +117,6 @@ NOINLINE Object* FC_GCPoll(void* __me, Object* objToProtect) // This isn't strictly true... But the guarentee that we make here is // that we won't trigger without having setup a frame. UNCHECKED(GC_NOTRIGGER); - SO_TOLERANT; // function probes before it does any work } CONTRACTL_END; FC_CAN_TRIGGER_GC(); diff --git a/src/vm/fcall.h b/src/vm/fcall.h index 9fb7ba0322..24b6f383a1 100644 --- a/src/vm/fcall.h +++ b/src/vm/fcall.h @@ -220,7 +220,6 @@ #include "gms.h" #include "runtimeexceptionkind.h" #include "debugreturn.h" -#include "stackprobe.h" //============================================================================================== // These macros defeat compiler optimizations that might mix nonvolatile @@ -583,8 +582,7 @@ LPVOID __FCThrowArgument(LPVOID me, enum RuntimeExceptionKind reKind, LPCWSTR ar #define HELPER_METHOD_FRAME_BEGIN_EX_NOTHROW(ret, helperFrame, gcpoll, allowGC, probeFailExpr) \ HELPER_METHOD_FRAME_BEGIN_EX_BODY(ret, helperFrame, gcpoll, allowGC) \ /* <TODO>TODO TURN THIS ON!!! </TODO> */ \ - /* gcpoll; */ \ - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GET_THREAD(), probeFailExpr); + /* gcpoll; */ // The while(__helperframe.RestoreState() needs a bit of explanation. @@ -615,7 +613,6 @@ LPVOID __FCThrowArgument(LPVOID me, enum RuntimeExceptionKind reKind, LPCWSTR ar HELPER_METHOD_FRAME_END_EX_BODY(gcpoll,allowGC); #define HELPER_METHOD_FRAME_END_EX_NOTHROW(gcpoll,allowGC) \ - END_SO_INTOLERANT_CODE; \ HELPER_METHOD_FRAME_END_EX_BODY(gcpoll,allowGC); #define HELPER_METHOD_FRAME_BEGIN_ATTRIB(attribs) \ @@ -869,8 +866,6 @@ private: { \ Thread *_pThread = GetThread(); \ Thread::ObjectRefFlush(_pThread); \ - /*_ASSERTE (_pThread->IsSOTolerant() ||*/ \ - /* _pThread->HasThreadStateNC(Thread::TSNC_DisableSOCheckInHCALL)); */ \ } \ FCallCheck __fCallCheck(__FILE__, __LINE__); \ FCALL_TRANSITION_BEGIN(); \ @@ -1378,8 +1373,7 @@ typedef UINT16 FC_UINT16_RET; #define FCALL_CHECK \ THROWS; \ DISABLED(GC_TRIGGERS); /* FCALLS with HELPER frames have issues with GC_TRIGGERS */ \ - MODE_COOPERATIVE; \ - SO_TOLERANT + MODE_COOPERATIVE; // // FCALL_CONTRACT should be the following shortcut: @@ -1389,7 +1383,6 @@ typedef UINT16 FC_UINT16_RET; // Since there is very little value in having runtime contracts in FCalls, FCALL_CONTRACT is defined as static contract only for performance reasons. // #define FCALL_CONTRACT \ - STATIC_CONTRACT_SO_TOLERANT; \ STATIC_CONTRACT_THROWS; \ /* FCALLS are a special case contract wise, they are "NOTRIGGER, unless you setup a frame" */ \ STATIC_CONTRACT_GC_NOTRIGGER; \ diff --git a/src/vm/field.cpp b/src/vm/field.cpp index 443ada6689..8706ca370d 100644 --- a/src/vm/field.cpp +++ b/src/vm/field.cpp @@ -143,7 +143,6 @@ TypeHandle FieldDesc::LookupFieldTypeHandle(ClassLoadLevel level, BOOL dropGener GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END @@ -169,15 +168,7 @@ TypeHandle FieldDesc::LookupFieldTypeHandle(ClassLoadLevel level, BOOL dropGener ); // == FailIfNotLoaded, can also assert that the thing is restored - TypeHandle th = NULL; - - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), return NULL); - { - th = sig.GetLastTypeHandleThrowing(ClassLoader::DontLoadTypes, level, dropGenericArgumentLevel); - } - END_SO_INTOLERANT_CODE; - - return th; + return sig.GetLastTypeHandleThrowing(ClassLoader::DontLoadTypes, level, dropGenericArgumentLevel); } #else //simplified version TypeHandle FieldDesc::LookupFieldTypeHandle(ClassLoadLevel level, BOOL dropGenericArgumentLevel) @@ -209,7 +200,6 @@ void* FieldDesc::GetStaticAddress(void *base) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; // Needed by profiler and server GC } CONTRACTL_END; @@ -232,7 +222,6 @@ MethodTable * FieldDesc::GetExactDeclaringType(MethodTable * ownerOrSubType) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -260,7 +249,6 @@ PTR_VOID FieldDesc::GetStaticAddressHandle(PTR_VOID base) GC_NOTRIGGER; MODE_ANY; FORBID_FAULT; - SO_TOLERANT; PRECONDITION(IsStatic()); PRECONDITION(GetEnclosingMethodTable()->IsRestored_NoLogging()); } @@ -281,15 +269,9 @@ PTR_VOID FieldDesc::GetStaticAddressHandle(PTR_VOID base) PTR_VOID retVal = NULL; - // BEGIN_SO_INTOLERANT_CODE will throw if we don't have enough stack - // and GetStaticAddressHandle has no failure semantics, so we need - // to just do the SO policy (e.g. rip the appdomain or process). - CONTRACT_VIOLATION(ThrowsViolation) - #ifdef DACCESS_COMPILE DacNotImpl(); #else - BEGIN_SO_INTOLERANT_CODE(GetThread()); { GCX_COOP(); // This routine doesn't have a failure semantic - but Resolve*Field(...) does. @@ -297,7 +279,6 @@ PTR_VOID FieldDesc::GetStaticAddressHandle(PTR_VOID base) CONTRACT_VIOLATION(ThrowsViolation|FaultViolation|GCViolation); //B#25680 (Fix Enc violations) retVal = (void *)(pModule->ResolveOrAllocateField(NULL, pFD)); } - END_SO_INTOLERANT_CODE; #endif // !DACCESS_COMPILE return retVal; } @@ -465,9 +446,7 @@ PTR_VOID FieldDesc::GetAddressNoThrowNoGC(PTR_VOID o) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; PRECONDITION(!IsEnCNew()); - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -542,7 +521,6 @@ void *FieldDesc::GetAddressGuaranteedInHeap(void *o) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/field.h b/src/vm/field.h index eb304f2e1c..ee54fc00e0 100644 --- a/src/vm/field.h +++ b/src/vm/field.h @@ -656,7 +656,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END @@ -706,7 +705,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END @@ -724,7 +722,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END diff --git a/src/vm/fieldmarshaler.cpp b/src/vm/fieldmarshaler.cpp index 57f41c33ce..5c6a7db3ba 100644 --- a/src/vm/fieldmarshaler.cpp +++ b/src/vm/fieldmarshaler.cpp @@ -1196,7 +1196,6 @@ BOOL IsStructMarshalable(TypeHandle th) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(!th.IsNull()); } CONTRACTL_END; diff --git a/src/vm/fieldmarshaler.h b/src/vm/fieldmarshaler.h index 24b10211c6..55e7773cb7 100644 --- a/src/vm/fieldmarshaler.h +++ b/src/vm/fieldmarshaler.h @@ -396,7 +396,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); } CONTRACT_END; diff --git a/src/vm/fptrstubs.cpp b/src/vm/fptrstubs.cpp index 79660eccaf..202f9fca83 100644 --- a/src/vm/fptrstubs.cpp +++ b/src/vm/fptrstubs.cpp @@ -65,7 +65,6 @@ PCODE FuncPtrStubs::GetFuncPtrStub(MethodDesc * pMD, PrecodeType type) { THROWS; GC_TRIGGERS; - SO_INTOLERANT; INJECT_FAULT(ThrowOutOfMemory();); } CONTRACTL_END diff --git a/src/vm/frames.cpp b/src/vm/frames.cpp index b387161761..73c4d567bb 100644 --- a/src/vm/frames.cpp +++ b/src/vm/frames.cpp @@ -389,7 +389,6 @@ VOID Frame::Push() NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -403,7 +402,6 @@ VOID Frame::Push(Thread *pThread) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -439,7 +437,6 @@ VOID Frame::Pop() NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -453,7 +450,6 @@ VOID Frame::Pop(Thread *pThread) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -480,7 +476,6 @@ void Frame::PopIfChained() NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -618,7 +613,6 @@ MethodDesc* StubDispatchFrame::GetFunction() CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; MethodDesc * pMD = m_pMD; @@ -904,7 +898,6 @@ GCFrame::GCFrame(OBJECTREF *pObjRefs, UINT numObjRefs, BOOL maybeInterior) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -918,7 +911,6 @@ GCFrame::GCFrame(Thread *pThread, OBJECTREF *pObjRefs, UINT numObjRefs, BOOL may NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -932,7 +924,6 @@ void GCFrame::Init(Thread *pThread, OBJECTREF *pObjRefs, UINT numObjRefs, BOOL m NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -1603,7 +1594,6 @@ void HelperMethodFrame::Push() if (m_Attribs & FRAME_ATTR_NO_THREAD_ABORT) NOTHROW; else THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; // @@ -1636,7 +1626,6 @@ void HelperMethodFrame::Pop() if (m_Attribs & FRAME_ATTR_NO_THREAD_ABORT) NOTHROW; else THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; Thread * pThread = m_pThread; @@ -1661,7 +1650,6 @@ NOINLINE void HelperMethodFrame::PushSlowHelper() if (m_Attribs & FRAME_ATTR_NO_THREAD_ABORT) NOTHROW; else THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; if (!(m_Attribs & FRAME_ATTR_NO_THREAD_ABORT)) @@ -1680,7 +1668,6 @@ NOINLINE void HelperMethodFrame::PopSlowHelper() THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; m_pThread->HandleThreadAbort(); @@ -1738,7 +1725,6 @@ BOOL HelperMethodFrame::InsureInit(bool initialInit, CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; if ((hostCallPreference == AllowHostCalls) && !m_MachState.isValid()) { HOST_CALLS; } else { HOST_NOCALLS; } SUPPORTS_DAC; } CONTRACTL_END; diff --git a/src/vm/frames.h b/src/vm/frames.h index f8bd4bec79..8847641198 100644 --- a/src/vm/frames.h +++ b/src/vm/frames.h @@ -1678,7 +1678,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; // Frame MethodDesc should be always updated in cooperative mode to avoid racing with GC stackwalk - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/gccover.cpp b/src/vm/gccover.cpp index 95e5d2aa81..d4f0bacff1 100644 --- a/src/vm/gccover.cpp +++ b/src/vm/gccover.cpp @@ -1281,8 +1281,6 @@ void RemoveGcCoverageInterrupt(TADDR instrPtr, BYTE * savedInstrPtr) BOOL OnGcCoverageInterrupt(PCONTEXT regs) { - SO_NOT_MAINLINE_FUNCTION; - // So that you can set counted breakpoint easily; GCcoverCount++; forceStack[0]= ®s; // This is so I can see it fastchecked diff --git a/src/vm/gcenv.ee.common.cpp b/src/vm/gcenv.ee.common.cpp index 8ce6709a61..6915ec8bda 100644 --- a/src/vm/gcenv.ee.common.cpp +++ b/src/vm/gcenv.ee.common.cpp @@ -176,7 +176,6 @@ void GcReportLoaderAllocator(promote_func* fn, ScanContext* sc, LoaderAllocator { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; diff --git a/src/vm/gchandleutilities.h b/src/vm/gchandleutilities.h index 8359db08a6..86227cdd6a 100644 --- a/src/vm/gchandleutilities.h +++ b/src/vm/gchandleutilities.h @@ -267,7 +267,6 @@ inline void DestroyHandleCommon(OBJECTHANDLE handle, HandleType type) GC_NOTRIGGER; MODE_ANY; CAN_TAKE_LOCK; - SO_TOLERANT; } CONTRACTL_END; @@ -375,7 +374,6 @@ inline void DestroyWinRTWeakHandle(OBJECTHANDLE handle) GC_NOTRIGGER; MODE_ANY; CAN_TAKE_LOCK; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/gchelpers.cpp b/src/vm/gchelpers.cpp index 945ae603e7..a52e10bb4f 100644 --- a/src/vm/gchelpers.cpp +++ b/src/vm/gchelpers.cpp @@ -233,9 +233,6 @@ inline Object* Alloc(size_t size, BOOL bFinalize, BOOL bContainsPointers ) Object *retVal = NULL; CheckObjectSize(size); - // We don't want to throw an SO during the GC, so make sure we have plenty - // of stack before calling in. - INTERIOR_STACK_PROBE_FOR(GetThread(), static_cast<unsigned>(DEFAULT_ENTRY_PROBE_AMOUNT * 1.5)); if (GCHeapUtilities::UseThreadAllocationContexts()) { gc_alloc_context *threadContext = GetThreadAllocContext(); @@ -256,7 +253,6 @@ inline Object* Alloc(size_t size, BOOL bFinalize, BOOL bContainsPointers ) ThrowOutOfMemory(); } - END_INTERIOR_STACK_PROBE; return retVal; } @@ -278,9 +274,6 @@ inline Object* AllocAlign8(size_t size, BOOL bFinalize, BOOL bContainsPointers, Object *retVal = NULL; CheckObjectSize(size); - // We don't want to throw an SO during the GC, so make sure we have plenty - // of stack before calling in. - INTERIOR_STACK_PROBE_FOR(GetThread(), static_cast<unsigned>(DEFAULT_ENTRY_PROBE_AMOUNT * 1.5)); if (GCHeapUtilities::UseThreadAllocationContexts()) { gc_alloc_context *threadContext = GetThreadAllocContext(); @@ -300,7 +293,6 @@ inline Object* AllocAlign8(size_t size, BOOL bFinalize, BOOL bContainsPointers, ThrowOutOfMemory(); } - END_INTERIOR_STACK_PROBE; return retVal; } #endif // FEATURE_64BIT_ALIGNMENT @@ -336,9 +328,6 @@ inline Object* AllocLHeap(size_t size, BOOL bFinalize, BOOL bContainsPointers ) Object *retVal = NULL; CheckObjectSize(size); - // We don't want to throw an SO during the GC, so make sure we have plenty - // of stack before calling in. - INTERIOR_STACK_PROBE_FOR(GetThread(), static_cast<unsigned>(DEFAULT_ENTRY_PROBE_AMOUNT * 1.5)); retVal = GCHeapUtilities::GetGCHeap()->AllocLHeap(size, flags); if (!retVal) @@ -346,7 +335,6 @@ inline Object* AllocLHeap(size_t size, BOOL bFinalize, BOOL bContainsPointers ) ThrowOutOfMemory(); } - END_INTERIOR_STACK_PROBE; return retVal; } @@ -682,11 +670,6 @@ OBJECTREF AllocateArrayEx(MethodTable *pArrayMT, INT32 *pArgs, DWORD dwNumArgs, } else { - // Since we're about to *really* recurse, probe for stack. - // @todo: is the default amount really correct? - _ASSERTE(GetThread()); - INTERIOR_STACK_PROBE(GetThread()); - TypeHandle subArrayType = pArrayMT->GetApproxArrayElementTypeHandle(); for (UINT32 i = 0; i < cElements; i++) { @@ -696,8 +679,6 @@ OBJECTREF AllocateArrayEx(MethodTable *pArrayMT, INT32 *pArgs, DWORD dwNumArgs, iholder.Release(); - END_INTERIOR_STACK_PROBE - orArray = (ArrayBase *) OBJECTREFToObject(outerArray); } } // GcStressPolicy::~InhibitHolder() @@ -913,13 +894,6 @@ OBJECTREF AllocatePrimitiveArray(CorElementType type, DWORD cElements) MODE_COOPERATIVE; // returns an objref without pinning it => cooperative } CONTRACTL_END; -#ifdef _DEBUG - // fastPrimitiveArrayAllocator is called by VM and managed code. If called from managed code, we - // make sure that the thread is in SOTolerantState. -#ifdef FEATURE_STACK_PROBE - Thread::DisableSOCheckInHCALL disableSOCheckInHCALL; -#endif // FEATURE_STACK_PROBE -#endif // _DEBUG return OBJECTREF( HCCALL2(fastPrimitiveArrayAllocator, type, cElements) ); } @@ -941,13 +915,6 @@ OBJECTREF AllocateObjectArray(DWORD cElements, TypeHandle ElementType) // typehandle for every object in the heap. TypeHandle ArrayType = ClassLoader::LoadArrayTypeThrowing(ElementType); -#ifdef _DEBUG - // fastObjectArrayAllocator is called by VM and managed code. If called from managed code, we - // make sure that the thread is in SOTolerantState. -#ifdef FEATURE_STACK_PROBE - Thread::DisableSOCheckInHCALL disableSOCheckInHCALL; -#endif // FEATURE_STACK_PROBE -#endif // _DEBUG return OBJECTREF( HCCALL2(fastObjectArrayAllocator, ArrayType.AsArray()->GetTemplateMethodTable(), cElements)); } @@ -959,13 +926,6 @@ STRINGREF AllocateString( DWORD cchStringLength ) MODE_COOPERATIVE; // returns an objref without pinning it => cooperative } CONTRACTL_END; -#ifdef _DEBUG - // fastStringAllocator is called by VM and managed code. If called from managed code, we - // make sure that the thread is in SOTolerantState. -#ifdef FEATURE_STACK_PROBE - Thread::DisableSOCheckInHCALL disableSOCheckInHCALL; -#endif // FEATURE_STACK_PROBE -#endif // _DEBUG return STRINGREF(HCCALL1(fastStringAllocator, cchStringLength)); } @@ -1479,7 +1439,6 @@ void ErectWriteBarrier(OBJECTREF *dst, OBJECTREF ref) STATIC_CONTRACT_MODE_COOPERATIVE; STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; // if the dst is outside of the heap (unboxed value classes) then we // simply exit @@ -1520,7 +1479,6 @@ void ErectWriteBarrierForMT(MethodTable **dst, MethodTable *ref) STATIC_CONTRACT_MODE_COOPERATIVE; STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; *dst = ref; diff --git a/src/vm/generics.cpp b/src/vm/generics.cpp index 773d863244..4913651967 100644 --- a/src/vm/generics.cpp +++ b/src/vm/generics.cpp @@ -19,7 +19,6 @@ #include "eeconfig.h" #include "generics.h" #include "genericdict.h" -#include "stackprobe.h" #include "typestring.h" #include "typekey.h" #include "dumpcommon.h" @@ -144,13 +143,6 @@ TypeHandle ClassLoader::LoadCanonicalGenericInstantiation(TypeKey *pTypeKey, ThrowHR(COR_E_OVERFLOW); TypeHandle ret = TypeHandle(); - DECLARE_INTERIOR_STACK_PROBE; -#ifndef DACCESS_COMPILE - if ((dwAllocSize/GetOsPageSize()+1) >= 2) - { - DO_INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD((10+dwAllocSize/GetOsPageSize()+1), NO_FORBIDGC_LOADER_USE_ThrowSO();); - } -#endif // DACCESS_COMPILE TypeHandle *repInst = (TypeHandle*) _alloca(dwAllocSize); for (DWORD i = 0; i < ntypars; i++) @@ -162,7 +154,6 @@ TypeHandle ClassLoader::LoadCanonicalGenericInstantiation(TypeKey *pTypeKey, TypeKey canonKey(pTypeKey->GetModule(), pTypeKey->GetTypeToken(), Instantiation(repInst, ntypars)); ret = ClassLoader::LoadConstructedTypeThrowing(&canonKey, fLoadTypes, level); - END_INTERIOR_STACK_PROBE; RETURN(ret); } @@ -968,7 +959,6 @@ BOOL GetExactInstantiationsOfMethodAndItsClassFromCallInformation( { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; CANNOT_TAKE_LOCK; PRECONDITION(CheckPointer(pRepMethod)); SUPPORTS_DAC; @@ -1007,7 +997,6 @@ BOOL GetExactInstantiationsOfMethodAndItsClassFromCallInformation( { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; CANNOT_TAKE_LOCK; PRECONDITION(CheckPointer(pRepMethod)); SUPPORTS_DAC; diff --git a/src/vm/hash.cpp b/src/vm/hash.cpp index 20eddfd9ae..656622cad6 100644 --- a/src/vm/hash.cpp +++ b/src/vm/hash.cpp @@ -535,7 +535,6 @@ UPTR HashMap::LookupValue(UPTR key, UPTR value) { DISABLED(THROWS); // This is not a bug, we cannot decide, since the function ptr called may be either. DISABLED(GC_NOTRIGGER); // This is not a bug, we cannot decide, since the function ptr called may be either. - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/hosting.cpp b/src/vm/hosting.cpp index 035fff8812..720a691478 100644 --- a/src/vm/hosting.cpp +++ b/src/vm/hosting.cpp @@ -42,7 +42,6 @@ DEBUG_NOINLINE void AddHostCallsStaticMarker() STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_CANNOT_TAKE_LOCK; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_HOST_CALLS; METHOD_CANNOT_BE_FOLDED_DEBUG; @@ -203,7 +202,6 @@ LPVOID EEVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, D { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -277,7 +275,6 @@ BOOL EEVirtualFree(LPVOID lpAddress, SIZE_T dwSize, DWORD dwFreeType) { { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -302,7 +299,6 @@ SIZE_T EEVirtualQuery(LPCVOID lpAddress, PMEMORY_BASIC_INFORMATION lpBuffer, SIZ { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -319,7 +315,6 @@ BOOL EEVirtualProtect(LPVOID lpAddress, SIZE_T dwSize, DWORD flNewProtect, PDWOR { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -335,11 +330,8 @@ HANDLE EEGetProcessHeap() // Note: this can be called a little early for real contracts, so we use static contracts instead. STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - { - return GetProcessHeap(); - } + return GetProcessHeap(); } #define GetProcessHeap() Dont_Use_GetProcessHeap() @@ -350,7 +342,6 @@ HANDLE EEHeapCreate(DWORD flOptions, SIZE_T dwInitialSize, SIZE_T dwMaximumSize) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -372,7 +363,6 @@ BOOL EEHeapDestroy(HANDLE hHeap) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -400,7 +390,6 @@ BOOL EEHeapDestroy(HANDLE hHeap) LPVOID EEHeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) { STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_SO_INTOLERANT; #ifdef FAILPOINTS_ENABLED if (RFS_HashStack ()) @@ -442,7 +431,6 @@ LPVOID EEHeapAlloc(HANDLE hHeap, DWORD dwFlags, SIZE_T dwBytes) LPVOID EEHeapAllocInProcessHeap(DWORD dwFlags, SIZE_T dwBytes) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; #ifdef _DEBUG // Check whether (indispensable) implicit casting in ClrAllocInProcessHeapBootstrap is safe. @@ -451,12 +439,6 @@ LPVOID EEHeapAllocInProcessHeap(DWORD dwFlags, SIZE_T dwBytes) static HANDLE ProcessHeap = NULL; - // We need to guarentee a very small stack consumption in allocating. And we can't allow - // an SO to happen while calling into the host. This will force a hard SO which is OK because - // we shouldn't ever get this close inside the EE in SO-intolerant code, so this should - // only fail if we call directly in from outside the EE, such as the JIT. - MINIMAL_STACK_PROBE_CHECK_THREAD(GetThread()); - if (ProcessHeap == NULL) ProcessHeap = EEGetProcessHeap(); @@ -468,11 +450,6 @@ BOOL EEHeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem) { STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - - // @todo - Need a backout validation here. - CONTRACT_VIOLATION(SOToleranceViolation); - BOOL retVal = FALSE; @@ -509,7 +486,6 @@ BOOL EEHeapFreeInProcessHeap(DWORD dwFlags, LPVOID lpMem) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -519,10 +495,6 @@ BOOL EEHeapFreeInProcessHeap(DWORD dwFlags, LPVOID lpMem) static FastFreeInProcessHeapFunc pFunc = EEHeapFreeInProcessHeap; #endif - // Take a look at comment in EEHeapFree and EEHeapAllocInProcessHeap, obviously someone - // needs to take a little time to think more about this code. - //CONTRACT_VIOLATION(SOToleranceViolation); - static HANDLE ProcessHeap = NULL; if (ProcessHeap == NULL) @@ -602,7 +574,6 @@ DWORD EESleepEx(DWORD dwMilliseconds, BOOL bAlertable) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -627,7 +598,6 @@ BOOL __SwitchToThread (DWORD dwSleepMSec, DWORD dwSwitchCount) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -643,7 +613,6 @@ BOOL __DangerousSwitchToThread (DWORD dwSleepMSec, DWORD dwSwitchCount, BOOL goT NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(dwSleepMSec < 10000 || GetThread() == NULL || !GetThread()->PreemptiveGCDisabled()); } CONTRACTL_END; @@ -759,12 +728,9 @@ void EEDeleteCriticalSection(CRITSEC_COOKIE cookie) { NOTHROW; WRAPPER(GC_NOTRIGGER); - SO_TOLERANT; } CONTRACTL_END; - VALIDATE_BACKOUT_STACK_CONSUMPTION; - Crst *pCrst = CookieToCrst(cookie); _ASSERTE(pCrst); @@ -782,7 +748,6 @@ DEBUG_NOINLINE void EEEnterCriticalSection(CRITSEC_COOKIE cookie) { { WRAPPER(THROWS); WRAPPER(GC_TRIGGERS); - SO_INTOLERANT; } CONTRACTL_END; @@ -800,7 +765,6 @@ DEBUG_NOINLINE void EELeaveCriticalSection(CRITSEC_COOKIE cookie) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; } CONTRACTL_END; @@ -818,7 +782,6 @@ LPVOID EETlsGetValue(DWORD slot) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_MODE_ANY; STATIC_CONTRACT_CANNOT_TAKE_LOCK; - STATIC_CONTRACT_SO_TOLERANT; // // @todo: we don't want TlsGetValue to throw, but CheckThreadState throws right now. Either modify @@ -840,7 +803,6 @@ BOOL EETlsCheckValue(DWORD slot, LPVOID * pValue) STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; // // @todo: we don't want TlsGetValue to throw, but CheckThreadState throws right now. Either modify @@ -865,7 +827,6 @@ VOID EETlsSetValue(DWORD slot, LPVOID pData) STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; void **pTlsData = CExecutionEngine::CheckThreadState(slot); diff --git a/src/vm/i386/cgenx86.cpp b/src/vm/i386/cgenx86.cpp index f9e7c2bc16..45ac5272b0 100644 --- a/src/vm/i386/cgenx86.cpp +++ b/src/vm/i386/cgenx86.cpp @@ -105,9 +105,6 @@ void GetSpecificCpuInfo(CORINFO_CPU * cpuInfo) _ASSERTE(tempVal.dwCPUType); #ifdef _DEBUG - { - SO_NOT_MAINLINE_REGION(); - /* Set Family+Model+Stepping string (eg., x690 for Banias, or xF30 for P4 Prescott) * instead of Family only */ @@ -120,15 +117,11 @@ void GetSpecificCpuInfo(CORINFO_CPU * cpuInfo) assert((configCpuFamily & 0xFFF) == configCpuFamily); tempVal.dwCPUType = (tempVal.dwCPUType & 0xFFFF0000) | configCpuFamily; } - } #endif tempVal.dwFeatures = GetSpecificCpuFeaturesAsm(&tempVal.dwExtendedFeatures); // written in ASM & doesn't participate in contracts #ifdef _DEBUG - { - SO_NOT_MAINLINE_REGION(); - /* Set the 32-bit feature mask */ @@ -139,7 +132,6 @@ void GetSpecificCpuInfo(CORINFO_CPU * cpuInfo) { tempVal.dwFeatures = configCpuFeatures; } - } #endif val = *cpuInfo = tempVal; @@ -910,7 +902,6 @@ WORD GetUnpatchedCodeData(LPCBYTE pAddr) GC_NOTRIGGER; PRECONDITION(CORDebuggerAttached()); PRECONDITION(CheckPointer(pAddr)); - SO_TOLERANT; } CONTRACT_END; // Ordering is because x86 is little-endien. @@ -1480,7 +1471,6 @@ BOOL DoesSlotCallPrestub(PCODE pCode) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(pCode != NULL); PRECONDITION(pCode != GetPreStubEntryPoint()); } CONTRACTL_END; diff --git a/src/vm/i386/excepx86.cpp b/src/vm/i386/excepx86.cpp index 97b4087797..c837b55b2a 100644 --- a/src/vm/i386/excepx86.cpp +++ b/src/vm/i386/excepx86.cpp @@ -475,10 +475,6 @@ EXCEPTION_DISPOSITION COMPlusAfterUnwind( LOG((LF_EH, LL_INFO1000, "COMPlusAfterUnwind: going to: pFunc:%#X, pStack:%#X\n", tct.pFunc, tct.pStack)); - // TODO: UnwindFrames ends up calling into StackWalkFrames which is SO_INTOLERANT - // as is UnwindFrames, etc... Should we make COMPlusAfterUnwind SO_INTOLERANT??? - ANNOTATION_VIOLATION(SOToleranceViolation); - UnwindFrames(pThread, &tct); #ifdef DEBUGGING_SUPPORTED @@ -649,7 +645,6 @@ CPFH_RealFirstPassHandler( // ExceptionContinueSearch, etc. STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_TOLERANT; #ifdef _DEBUG static int breakOnFirstPass = -1; @@ -1079,7 +1074,6 @@ CPFH_RealFirstPassHandler( // ExceptionContinueSearch, etc. #ifdef FEATURE_CORRUPTING_EXCEPTIONS { - BEGIN_SO_INTOLERANT_CODE(GetThread()); // Setup the state in current exception tracker indicating the corruption severity // of the active exception. CEHelper::SetupCorruptionSeverityForActiveException(bRethrownException, bNestedException, @@ -1088,8 +1082,6 @@ CPFH_RealFirstPassHandler( // ExceptionContinueSearch, etc. // Failfast if exception indicates corrupted process state if (pExInfo->GetCorruptionSeverity() == ProcessCorrupting) EEPOLICY_HANDLE_FATAL_ERROR(exceptionCode); - - END_SO_INTOLERANT_CODE; } #endif // FEATURE_CORRUPTING_EXCEPTIONS @@ -1146,10 +1138,7 @@ CPFH_RealFirstPassHandler( // ExceptionContinueSearch, etc. if (bRethrownException || bNestedException) { _ASSERTE(pExInfo->m_pPrevNestedInfo != NULL); - - BEGIN_SO_INTOLERANT_CODE(GetThread()); SetStateForWatsonBucketing(bRethrownException, pExInfo->GetPreviousExceptionTracker()->GetThrowableAsHandle()); - END_SO_INTOLERANT_CODE; } #ifdef DEBUGGING_SUPPORTED @@ -1708,7 +1697,7 @@ EXCEPTION_HANDLER_IMPL(COMPlusFrameHandler) Thread *pThread = GetThread(); if ((pExceptionRecord->ExceptionFlags & (EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND)) == 0) { - if (IsSOExceptionCode(pExceptionRecord->ExceptionCode)) + if (pExceptionRecord->ExceptionCode == STATUS_STACK_OVERFLOW) { EEPolicy::HandleStackOverflow(SOD_ManagedFrameHandler, (void*)pEstablisherFrame); @@ -1736,15 +1725,6 @@ EXCEPTION_HANDLER_IMPL(COMPlusFrameHandler) return ExceptionContinueSearch; } - else - { -#ifdef FEATURE_STACK_PROBE - if (GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) == eRudeUnloadAppDomain) - { - RetailStackProbe(static_cast<unsigned int>(ADJUST_PROBE(BACKOUT_CODE_STACK_LIMIT)), pThread); - } -#endif - } } else { @@ -1758,7 +1738,7 @@ EXCEPTION_HANDLER_IMPL(COMPlusFrameHandler) exceptionCode = GetCurrentExceptionCode(); } - if (IsSOExceptionCode(exceptionCode)) + if (exceptionCode == STATUS_STACK_OVERFLOW) { // We saved the context during the first pass in case the stack overflow exception is // unhandled and Watson dump code needs it. Now we are in the second pass, therefore @@ -1799,9 +1779,6 @@ EXCEPTION_HANDLER_IMPL(COMPlusFrameHandler) } } - // <TODO> . We need to probe here, but can't introduce destructors etc. </TODO> - BEGIN_CONTRACT_VIOLATION(SOToleranceViolation); - if (pExceptionRecord->ExceptionFlags & (EXCEPTION_UNWINDING | EXCEPTION_EXIT_UNWIND)) { retVal = CPFH_UnwindHandler(pExceptionRecord, @@ -1823,8 +1800,6 @@ EXCEPTION_HANDLER_IMPL(COMPlusFrameHandler) } - END_CONTRACT_VIOLATION; - return retVal; } // COMPlusFrameHandler() @@ -1839,7 +1814,6 @@ NOINLINE LPVOID COMPlusEndCatchWorker(Thread * pThread) STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_INTOLERANT; LOG((LF_EH, LL_INFO1000, "COMPlusPEndCatch:called with " "pThread:0x%x\n",pThread)); @@ -1850,9 +1824,6 @@ NOINLINE LPVOID COMPlusEndCatchWorker(Thread * pThread) void* esp = NULL; - // @todo . We need to probe in the EH code, but can't introduce destructors etc. - BEGIN_CONTRACT_VIOLATION(SOToleranceViolation); - // Notify the profiler that the catcher has finished running // IL stubs don't contain catch blocks so inability to perform this check does not matter. // if (!pFunc->IsILStub()) @@ -1905,8 +1876,6 @@ NOINLINE LPVOID COMPlusEndCatchWorker(Thread * pThread) pThread->SyncManagedExceptionState(fIsDebuggerHelperThread); LOG((LF_EH, LL_INFO1000, "COMPlusPEndCatch: esp=%p\n", esp)); - - END_CONTRACT_VIOLATION; return esp; } @@ -1929,7 +1898,6 @@ LPVOID STDCALL COMPlusEndCatch(LPVOID ebp, DWORD ebx, DWORD edi, DWORD esi, LPVO STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_INTOLERANT; ETW::ExceptionLog::ExceptionCatchEnd(); ETW::ExceptionLog::ExceptionThrownEnd(); @@ -2066,7 +2034,6 @@ VOID UnwindExceptionTrackerAndResumeInInterceptionFrame(ExInfo* pExInfo, EHConte STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE(pExInfo && context); @@ -2088,7 +2055,6 @@ BOOL PopNestedExceptionRecords(LPVOID pTargetSP, BOOL bCheckForUnknownHandlers) // No CONTRACT here, because we can't run the risk of it pushing any SEH into the current method. STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; PEXCEPTION_REGISTRATION_RECORD pEHR = GetCurrentSEHRecord(); @@ -3301,7 +3267,6 @@ int CallJitEHFilterWorker(size_t *pShadowSP, EHContext *pContext) STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_INTOLERANT; int retVal = EXCEPTION_CONTINUE_SEARCH; @@ -3554,8 +3519,6 @@ EXCEPTION_HANDLER_IMPL(UMThunkPrestubHandler) EXCEPTION_DISPOSITION retval = ExceptionContinueSearch; - BEGIN_CONTRACT_VIOLATION(SOToleranceViolation); - // We must forward to the COMPlusFrameHandler. This will unwind the Frame Chain up to here, and also leave the // preemptive GC mode set correctly. retval = EXCEPTION_HANDLER_FWD(COMPlusFrameHandler); @@ -3582,8 +3545,6 @@ EXCEPTION_HANDLER_IMPL(UMThunkPrestubHandler) pFrame->Pop(pThread); } - END_CONTRACT_VIOLATION; - return retval; } diff --git a/src/vm/i386/gmsx86.cpp b/src/vm/i386/gmsx86.cpp index 53bd23fba2..94843b061a 100644 --- a/src/vm/i386/gmsx86.cpp +++ b/src/vm/i386/gmsx86.cpp @@ -369,7 +369,6 @@ void LazyMachState::unwindLazyState(LazyMachState* baseState, CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -1283,7 +1282,6 @@ void LazyMachState::unwindLazyState(LazyMachState* baseState, CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; diff --git a/src/vm/i386/jitinterfacex86.cpp b/src/vm/i386/jitinterfacex86.cpp index 7be22f79a5..78401d85e0 100644 --- a/src/vm/i386/jitinterfacex86.cpp +++ b/src/vm/i386/jitinterfacex86.cpp @@ -68,7 +68,6 @@ extern "C" void STDCALL JIT_WriteBarrierReg_PostGrow();// JIThelp.asm/JIThelp.s #ifdef _DEBUG extern "C" void STDCALL WriteBarrierAssert(BYTE* ptr, Object* obj) { - STATIC_CONTRACT_SO_TOLERANT; WRAPPER_NO_CONTRACT; static BOOL fVerifyHeap = -1; @@ -103,7 +102,6 @@ extern "C" void STDCALL WriteBarrierAssert(BYTE* ptr, Object* obj) __declspec(naked) void F_CALL_CONV JIT_Stelem_Ref(PtrArray* array, unsigned idx, Object* val) { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -197,7 +195,6 @@ Epilog: extern "C" __declspec(naked) Object* F_CALL_CONV JIT_IsInstanceOfClass(MethodTable *pMT, Object *pObject) { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -256,7 +253,6 @@ extern "C" __declspec(naked) Object* F_CALL_CONV JIT_IsInstanceOfClass(MethodTab extern "C" __declspec(naked) Object* F_CALL_CONV JIT_ChkCastClass(MethodTable *pMT, Object *pObject) { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -296,7 +292,6 @@ extern "C" __declspec(naked) Object* F_CALL_CONV JIT_ChkCastClass(MethodTable *p extern "C" __declspec(naked) Object* F_CALL_CONV JIT_ChkCastClassSpecial(MethodTable *pMT, Object *pObject) { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; @@ -378,7 +373,6 @@ void STDCALL JIT_TailCallHelper(Thread * pThread) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; pThread->UnhijackThread(); @@ -783,7 +777,6 @@ HCIMPL2_RAW(Object*, UnframedAllocateObjectArray, MethodTable *pArrayMT, DWORD c THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; return OBJECTREFToObject(AllocateArrayEx(pArrayMT, @@ -804,7 +797,6 @@ HCIMPL2_RAW(Object*, UnframedAllocatePrimitiveArray, CorElementType type, DWORD THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; return OBJECTREFToObject( AllocatePrimitiveArray(type, cElements, FALSE) ); diff --git a/src/vm/ibclogger.cpp b/src/vm/ibclogger.cpp index a780754e05..991f936b09 100644 --- a/src/vm/ibclogger.cpp +++ b/src/vm/ibclogger.cpp @@ -141,7 +141,6 @@ void IBCLogger::LogAccessThreadSafeHelperStatic(const void * p, pfnIBCAccessCall void IBCLogger::LogAccessThreadSafeHelper(const void * p, pfnIBCAccessCallback callback) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; CONTRACT_VIOLATION( HostViolation ); /* For the Global Class we may see p == NULL */ @@ -183,7 +182,6 @@ CrstStatic* IBCLogger::GetSync() THROWS; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -258,7 +256,6 @@ static const int c_minCountIncr = 8; ThreadLocalIBCInfo::ThreadLocalIBCInfo() { LIMITED_METHOD_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; m_fCallbackFailed = false; m_fProcessingDelayedList = false; @@ -290,7 +287,6 @@ void ThreadLocalIBCInfo::DeleteDelayedCallbacks() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -318,7 +314,6 @@ void ThreadLocalIBCInfo::FlushDelayedCallbacks() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -338,7 +333,6 @@ DelayCallbackTable * ThreadLocalIBCInfo::GetPtrDelayList() THROWS; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -357,7 +351,6 @@ int ThreadLocalIBCInfo::ProcessDelayedCallbacks() THROWS; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -430,7 +423,6 @@ void ThreadLocalIBCInfo::CallbackHelper(const void * p, pfnIBCAccessCallback cal GC_NOTRIGGER; MODE_ANY; CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -506,7 +498,6 @@ void IBCLogger::LogMethodAccessHelper(const MethodDesc* pMD, ULONG flagNum) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; PRECONDITION(g_IBCLogger.InstrEnabled()); } CONTRACTL_END; @@ -592,7 +583,6 @@ void IBCLogger::LogMethodAccessWrapper(IBCLogger* pLogger, const void * pValue1, void IBCLogger::LogMethodDescAccessHelper(const MethodDesc *pMD) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogMethodAccessHelper(pMD, ReadMethodDesc); } @@ -600,7 +590,6 @@ void IBCLogger::LogMethodDescAccessHelper(const MethodDesc *pMD) void IBCLogger::LogMethodDescWriteAccessHelper(MethodDesc *pMD) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogMethodAccessHelper(pMD, ReadMethodDesc); LogMethodAccessHelper(pMD, WriteMethodDesc); @@ -609,7 +598,6 @@ void IBCLogger::LogMethodDescWriteAccessHelper(MethodDesc *pMD) void IBCLogger::LogMethodPrecodeAccessHelper(MethodDesc *pMD) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogMethodAccessHelper(pMD, ReadMethodPrecode); } @@ -617,7 +605,6 @@ void IBCLogger::LogMethodPrecodeAccessHelper(MethodDesc *pMD) void IBCLogger::LogMethodPrecodeWriteAccessHelper(MethodDesc *pMD) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogMethodAccessHelper(pMD, ReadMethodPrecode); LogMethodAccessHelper(pMD, WriteMethodPrecode); @@ -631,7 +618,6 @@ void IBCLogger::LogMethodCodeAccessHelper(MethodDesc *pMD) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; PRECONDITION(g_IBCLogger.InstrEnabled()); } CONTRACTL_END; @@ -647,7 +633,6 @@ void IBCLogger::LogNDirectCodeAccessHelper(MethodDesc *pMD) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; PRECONDITION(g_IBCLogger.InstrEnabled()); } CONTRACTL_END; @@ -661,7 +646,6 @@ void IBCLogger::LogNDirectCodeAccessHelper(MethodDesc *pMD) void IBCLogger::LogMethodGCInfoAccessHelper(MethodDesc *pMD) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; _ASSERTE(InstrEnabled()); @@ -673,7 +657,6 @@ void IBCLogger::LogMethodGCInfoAccessHelper(MethodDesc *pMD) void IBCLogger::LogMethodTableAccessHelper(MethodTable const * pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(pMT, ReadMethodTable); } @@ -682,7 +665,6 @@ void IBCLogger::LogMethodTableAccessHelper(MethodTable const * pMT) void IBCLogger::LogTypeMethodTableAccessHelper(const TypeHandle *th) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(*th, ReadMethodTable); } @@ -691,7 +673,6 @@ void IBCLogger::LogTypeMethodTableAccessHelper(const TypeHandle *th) void IBCLogger::LogTypeMethodTableWriteableAccessHelper(const TypeHandle *th) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(*th, ReadTypeDesc); LogTypeAccessHelper(*th, WriteTypeDesc); @@ -705,7 +686,6 @@ void IBCLogger::LogTypeAccessHelper(TypeHandle th, ULONG flagNum) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; PRECONDITION(g_IBCLogger.InstrEnabled()); } CONTRACTL_END; @@ -790,7 +770,6 @@ void IBCLogger::LogTypeAccessWrapper(IBCLogger* pLogger, const void * pValue, co { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -801,7 +780,6 @@ void IBCLogger::LogTypeAccessWrapper(IBCLogger* pLogger, const void * pValue, co void IBCLogger::LogMethodTableWriteableDataAccessHelper(MethodTable const * pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(pMT, ReadMethodTable); LogTypeAccessHelper(pMT, ReadMethodTableWriteableData); @@ -811,7 +789,6 @@ void IBCLogger::LogMethodTableWriteableDataAccessHelper(MethodTable const * pMT) void IBCLogger::LogMethodTableWriteableDataWriteAccessHelper(MethodTable *pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(pMT, ReadMethodTable); LogTypeAccessHelper(pMT, WriteMethodTableWriteableData); @@ -820,7 +797,6 @@ void IBCLogger::LogMethodTableWriteableDataWriteAccessHelper(MethodTable *pMT) void IBCLogger::LogMethodTableNonVirtualSlotsAccessHelper(MethodTable const * pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(pMT, ReadMethodTable); LogTypeAccessHelper(pMT, ReadNonVirtualSlots); @@ -830,7 +806,6 @@ void IBCLogger::LogMethodTableNonVirtualSlotsAccessHelper(MethodTable const * pM void IBCLogger::LogEEClassAndMethodTableAccessHelper(MethodTable * pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; if (pMT == NULL) return; @@ -849,7 +824,6 @@ void IBCLogger::LogEEClassAndMethodTableAccessHelper(MethodTable * pMT) void IBCLogger::LogEEClassCOWTableAccessHelper(MethodTable * pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; if (pMT == NULL) return; @@ -869,7 +843,6 @@ void IBCLogger::LogEEClassCOWTableAccessHelper(MethodTable * pMT) void IBCLogger::LogFieldDescsAccessHelper(FieldDesc * pFD) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; MethodTable * pMT = pFD->GetApproxEnclosingMethodTable_NoLogging(); @@ -886,7 +859,6 @@ void IBCLogger::LogFieldDescsAccessHelper(FieldDesc * pFD) void IBCLogger::LogDispatchMapAccessHelper(MethodTable *pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(pMT, ReadMethodTable); LogTypeAccessHelper(pMT, ReadDispatchMap); @@ -895,7 +867,6 @@ void IBCLogger::LogDispatchMapAccessHelper(MethodTable *pMT) void IBCLogger::LogDispatchTableAccessHelper(MethodTable *pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(pMT, ReadMethodTable); LogTypeAccessHelper(pMT, ReadDispatchMap); @@ -905,7 +876,6 @@ void IBCLogger::LogDispatchTableAccessHelper(MethodTable *pMT) void IBCLogger::LogDispatchTableSlotAccessHelper(DispatchSlot *pDS) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; if (pDS->IsNull()) return; @@ -919,7 +889,6 @@ void IBCLogger::LogDispatchTableSlotAccessHelper(DispatchSlot *pDS) void IBCLogger::LogFieldMarshalersReadAccessHelper(MethodTable * pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; if (pMT == NULL) return; @@ -939,7 +908,6 @@ void IBCLogger::LogFieldMarshalersReadAccessHelper(MethodTable * pMT) void IBCLogger::LogCCtorInfoReadAccessHelper(MethodTable *pMT) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(pMT, ReadCCtorInfo); } @@ -947,7 +915,6 @@ void IBCLogger::LogCCtorInfoReadAccessHelper(MethodTable *pMT) void IBCLogger::LogTypeHashTableAccessHelper(const TypeHandle *th) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; LogTypeAccessHelper(*th, ReadTypeHashTable); } @@ -960,7 +927,6 @@ void IBCLogger::LogClassHashTableAccessHelper(EEClassHashEntry *pEntry) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; PRECONDITION(g_IBCLogger.InstrEnabled()); } CONTRACTL_END; @@ -1017,7 +983,6 @@ void IBCLogger::LogMetaDataAccessHelper(const void * addr) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; PRECONDITION(g_IBCLogger.InstrEnabled()); } CONTRACTL_END; @@ -1050,7 +1015,6 @@ void IBCLogger::LogMetaDataSearchAccessHelper(const void * result) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; PRECONDITION(g_IBCLogger.InstrEnabled()); } CONTRACTL_END; @@ -1083,7 +1047,6 @@ void IBCLogger::LogCerMethodListReadAccessHelper(MethodDesc *pMD) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; PRECONDITION(g_IBCLogger.InstrEnabled()); } CONTRACTL_END; @@ -1094,7 +1057,6 @@ void IBCLogger::LogCerMethodListReadAccessHelper(MethodDesc *pMD) void IBCLogger::LogRidMapAccessHelper( RidMapLogData data ) { WRAPPER_NO_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; data.First()->LogTokenAccess( data.Second(), RidMap ); } @@ -1107,7 +1069,6 @@ void IBCLogger::LogRVADataAccessHelper(FieldDesc *pFD) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; PRECONDITION(g_IBCLogger.InstrEnabled()); } CONTRACTL_END; diff --git a/src/vm/interoputil.cpp b/src/vm/interoputil.cpp index c70154d39c..5c000569d6 100644 --- a/src/vm/interoputil.cpp +++ b/src/vm/interoputil.cpp @@ -1418,13 +1418,10 @@ void SafeRelease_OnException(IUnknown* pUnk, RCW* pRCW { NOTHROW; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; #ifndef CROSSGEN_COMPILE - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return;) - #ifdef MDA_SUPPORTED // Report the exception that was thrown. if (pProbe) @@ -1435,8 +1432,6 @@ void SafeRelease_OnException(IUnknown* pUnk, RCW* pRCW LogInterop(W("An exception occurred during release")); LogInteropLeak(pUnk); #endif // FEATURE_COMINTEROP - - END_SO_INTOLERANT_CODE; #endif // CROSSGEN_COMPILE } @@ -1450,7 +1445,6 @@ ULONG SafeReleasePreemp(IUnknown * pUnk, RCW * pRCW) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk, NULL_OK)); } CONTRACTL_END; @@ -1524,7 +1518,6 @@ ULONG SafeRelease(IUnknown* pUnk, RCW* pRCW) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk, NULL_OK)); } CONTRACTL_END; @@ -1647,7 +1640,6 @@ BOOL IsComObjectClass(TypeHandle type) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -1676,7 +1668,6 @@ ReadBestFitCustomAttribute(MethodDesc* pMD, BOOL* BestFit, BOOL* ThrowOnUnmappab { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1698,7 +1689,6 @@ ReadBestFitCustomAttribute(IMDInternalImport* pInternalImport, mdTypeDef cl, BOO NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(pInternalImport)); } CONTRACTL_END; @@ -1952,7 +1942,6 @@ HRESULT SafeQueryInterface(IUnknown* pUnk, REFIID riid, IUnknown** pResUnk) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE(pUnk); _ASSERTE(pResUnk); @@ -1964,7 +1953,6 @@ HRESULT SafeQueryInterface(IUnknown* pUnk, REFIID riid, IUnknown** pResUnk) GCX_PREEMP_NO_DTOR_HAVE_THREAD(pThread); BEGIN_CONTRACT_VIOLATION(ThrowsViolation); // message pump could happen, so arbitrary managed code could run - BEGIN_SO_TOLERANT_CODE(pThread); struct Param { HRESULT * const hr; IUnknown** const pUnk; REFIID riid; IUnknown*** const pResUnk; } param = { &hr, &pUnk, riid, &pResUnk }; #define PAL_TRY_ARG(argName) (*(pParam->argName)) @@ -1986,7 +1974,6 @@ HRESULT SafeQueryInterface(IUnknown* pUnk, REFIID riid, IUnknown** pResUnk) #undef PAL_TRY_ARG #undef PAL_TRY_REFARG - END_SO_TOLERANT_CODE; END_CONTRACT_VIOLATION; LOG((LF_INTEROP, LL_EVERYTHING, hr == S_OK ? "QI Succeeded\n" : "QI Failed\n")); @@ -2013,7 +2000,6 @@ HRESULT SafeQueryInterfacePreemp(IUnknown* pUnk, REFIID riid, IUnknown** pResUnk STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_PREEMPTIVE; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE(pUnk); _ASSERTE(pResUnk); @@ -2023,7 +2009,6 @@ HRESULT SafeQueryInterfacePreemp(IUnknown* pUnk, REFIID riid, IUnknown** pResUnk HRESULT hr = E_FAIL; BEGIN_CONTRACT_VIOLATION(ThrowsViolation); // message pump could happen, so arbitrary managed code could run - BEGIN_SO_TOLERANT_CODE(pThread); struct Param { HRESULT * const hr; IUnknown** const pUnk; REFIID riid; IUnknown*** const pResUnk; } param = { &hr, &pUnk, riid, &pResUnk }; #define PAL_TRY_ARG(argName) (*(pParam->argName)) @@ -2045,10 +2030,8 @@ HRESULT SafeQueryInterfacePreemp(IUnknown* pUnk, REFIID riid, IUnknown** pResUnk #undef PAL_TRY_ARG #undef PAL_TRY_REFARG - END_SO_TOLERANT_CODE; END_CONTRACT_VIOLATION; - LOG((LF_INTEROP, LL_EVERYTHING, hr == S_OK ? "QI Succeeded\n" : "QI Failed\n")); // Ensure if the QI returned ok that it actually set a pointer. @@ -2297,7 +2280,6 @@ HRESULT EnsureComStartedNoThrow(BOOL fCoInitCurrentThread) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; PRECONDITION(g_fEEStarted); PRECONDITION(GetThread() != NULL); // Should always be inside BEGIN_EXTERNAL_ENTRYPOINT } @@ -2310,11 +2292,7 @@ HRESULT EnsureComStartedNoThrow(BOOL fCoInitCurrentThread) GCX_COOP(); EX_TRY { - BEGIN_SO_INTOLERANT_CODE(GetThread()); - EnsureComStarted(fCoInitCurrentThread); - - END_SO_INTOLERANT_CODE; } EX_CATCH_HRESULT(hr); } @@ -2377,7 +2355,6 @@ ULONG SafeAddRef(IUnknown* pUnk) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -2409,7 +2386,6 @@ ULONG SafeAddRefPreemp(IUnknown* pUnk) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -3963,7 +3939,6 @@ static HRESULT InvokeExHelper( STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_INTOLERANT; _ASSERTE(pDispEx != NULL); @@ -3992,8 +3967,6 @@ static HRESULT InvokeExHelper( PAL_TRY(Param *, pParam, ¶m) { - BEGIN_SO_TOLERANT_CODE(GetThread()); - pParam->hr = pParam->pDispEx->InvokeEx(pParam->MemberID, pParam->lcid, pParam->flags, @@ -4001,8 +3974,6 @@ static HRESULT InvokeExHelper( pParam->pVarResult, pParam->pExcepInfo, pParam->pspCaller); - - END_SO_TOLERANT_CODE; } PAL_EXCEPT_FILTER(CallOutFilter) { @@ -4027,7 +3998,6 @@ static HRESULT InvokeHelper( STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_INTOLERANT; _ASSERTE(pDisp != NULL); @@ -4060,8 +4030,6 @@ static HRESULT InvokeHelper( PAL_TRY(Param *, pParam, ¶m) { - BEGIN_SO_TOLERANT_CODE(GetThread()); - pParam->hr = pParam->pDisp->Invoke(pParam->MemberID, pParam->riid, pParam->lcid, @@ -4070,8 +4038,6 @@ static HRESULT InvokeHelper( pParam->pVarResult, pParam->pExcepInfo, pParam->piArgErr); - - END_SO_TOLERANT_CODE; } PAL_EXCEPT_FILTER(CallOutFilter) { @@ -6410,7 +6376,6 @@ VOID LogInteropAddRef(IUnknown* pItf, ULONG cbRef, __in_z LPCSTR szMsg) GC_TRIGGERS; MODE_ANY; PRECONDITION(CheckPointer(pItf)); - SO_TOLERANT; } CONTRACTL_END; @@ -6444,7 +6409,6 @@ VOID LogInteropRelease(IUnknown* pItf, ULONG cbRef, __in_z LPCSTR szMsg) GC_NOTRIGGER; MODE_ANY; PRECONDITION(CheckPointer(pItf, NULL_OK)); - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/interoputil.inl b/src/vm/interoputil.inl index 80cd8f496d..3a396c331d 100644 --- a/src/vm/interoputil.inl +++ b/src/vm/interoputil.inl @@ -14,7 +14,6 @@ inline BOOL ComInterfaceSlotIs(IUnknown* pUnk, int slot, LPVOID pvFunction) GC_NOTRIGGER; FORBID_FAULT; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); } CONTRACTL_END; @@ -63,7 +62,6 @@ FORCEINLINE ComCallWrapper* MapIUnknownToWrapper(IUnknown* pUnk) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk, NULL_OK)); } CONTRACT_END; diff --git a/src/vm/interpreter.cpp b/src/vm/interpreter.cpp index bdadc3245d..2f27b62e39 100644 --- a/src/vm/interpreter.cpp +++ b/src/vm/interpreter.cpp @@ -3286,7 +3286,6 @@ void Interpreter::EndFilter() bool Interpreter::MethodHandlesException(OBJECTREF orThrowable) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -3538,7 +3537,6 @@ void Interpreter::BackwardsBranchActions(int offset) bool Interpreter::SearchForCoveringFinally() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_ANY; @@ -4055,7 +4053,6 @@ bool CorInfoTypeIsPointer(CorInfoType cit) void Interpreter::LdArg(int argNum) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -4067,7 +4064,6 @@ void Interpreter::LdArg(int argNum) void Interpreter::LdArgA(int argNum) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -4081,7 +4077,6 @@ void Interpreter::LdArgA(int argNum) void Interpreter::StArg(int argNum) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -4094,7 +4089,6 @@ void Interpreter::StArg(int argNum) void Interpreter::LdLocA(int locNum) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -4121,7 +4115,6 @@ void Interpreter::LdLocA(int locNum) void Interpreter::LdIcon(INT32 c) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -4135,7 +4128,6 @@ void Interpreter::LdIcon(INT32 c) void Interpreter::LdR4con(INT32 c) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -4149,7 +4141,6 @@ void Interpreter::LdR4con(INT32 c) void Interpreter::LdLcon(INT64 c) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -4163,7 +4154,6 @@ void Interpreter::LdLcon(INT64 c) void Interpreter::LdR8con(INT64 c) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -4177,7 +4167,6 @@ void Interpreter::LdR8con(INT64 c) void Interpreter::LdNull() { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -4272,7 +4261,6 @@ template<int op> void Interpreter::BinaryArithOp() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -4531,7 +4519,6 @@ template<int op, bool asUnsigned> void Interpreter::BinaryArithOvfOp() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -4746,7 +4733,6 @@ template<int op, typename T, CorInfoType cit, bool TypeIsUnchanged> void Interpreter::BinaryArithOvfOpWork(T val1, T val2) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -4789,7 +4775,6 @@ template<int op> void Interpreter::BinaryIntOp() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -4939,7 +4924,6 @@ template<int op> void Interpreter::ShiftOp() { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -5032,7 +5016,6 @@ void Interpreter::ShiftOpWork(unsigned op1idx, CorInfoType cit2) void Interpreter::Neg() { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -5075,7 +5058,6 @@ void Interpreter::Neg() void Interpreter::Not() { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -5111,7 +5093,6 @@ template<typename T, bool TIsUnsigned, bool TCanHoldPtr, bool TIsShort, CorInfoT void Interpreter::Conv() { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -5199,7 +5180,6 @@ void Interpreter::Conv() void Interpreter::ConvRUn() { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -5240,7 +5220,6 @@ template<typename T, INT64 TMin, UINT64 TMax, bool TCanHoldPtr, CorInfoType cit> void Interpreter::ConvOvf() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -5337,7 +5316,6 @@ template<typename T, INT64 TMin, UINT64 TMax, bool TCanHoldPtr, CorInfoType cit> void Interpreter::ConvOvfUn() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -5433,7 +5411,6 @@ void Interpreter::ConvOvfUn() void Interpreter::LdObj() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -5479,7 +5456,6 @@ void Interpreter::LdObj() void Interpreter::LdObjValueClassWork(CORINFO_CLASS_HANDLE valueClsHnd, unsigned ind, void* src) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -5510,7 +5486,6 @@ void Interpreter::LdObjValueClassWork(CORINFO_CLASS_HANDLE valueClsHnd, unsigned CORINFO_CLASS_HANDLE Interpreter::GetTypeFromToken(BYTE* codePtr, CorInfoTokenKind tokKind InterpTracingArg(ResolveTokenKind rtk)) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -5535,7 +5510,6 @@ bool Interpreter::IsValidPointerType(CorInfoType cit) void Interpreter::CpObj() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -5590,7 +5564,6 @@ void Interpreter::CpObj() void Interpreter::StObj() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -5714,7 +5687,6 @@ void Interpreter::StObj() void Interpreter::InitObj() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -5767,7 +5739,6 @@ void Interpreter::InitObj() void Interpreter::LdStr() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -5787,14 +5758,12 @@ void Interpreter::NewObj() { #if INTERP_DYNAMIC_CONTRACTS CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; } CONTRACTL_END; #else // Dynamic contract occupies too much stack. - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_COOPERATIVE; @@ -5968,7 +5937,6 @@ void Interpreter::NewObj() void Interpreter::NewArr() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6040,7 +6008,6 @@ void Interpreter::NewArr() void Interpreter::IsInst() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6074,7 +6041,6 @@ void Interpreter::IsInst() void Interpreter::CastClass() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6111,7 +6077,6 @@ void Interpreter::CastClass() void Interpreter::LocAlloc() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6153,7 +6118,6 @@ void Interpreter::LocAlloc() void Interpreter::MkRefany() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6198,7 +6162,6 @@ void Interpreter::MkRefany() void Interpreter::RefanyType() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6248,7 +6211,6 @@ OBJECTREF Interpreter::TypeHandleToTypeRef(TypeHandle* pth) CorInfoType Interpreter::GetTypeForPrimitiveValueClass(CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6262,7 +6224,6 @@ CorInfoType Interpreter::GetTypeForPrimitiveValueClass(CORINFO_CLASS_HANDLE clsH void Interpreter::RefanyVal() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6294,7 +6255,6 @@ void Interpreter::RefanyVal() void Interpreter::CkFinite() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6326,7 +6286,6 @@ void Interpreter::CkFinite() void Interpreter::LdToken() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6378,7 +6337,6 @@ void Interpreter::LdToken() void Interpreter::LdFtn() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6424,7 +6382,6 @@ void Interpreter::LdFtn() void Interpreter::LdVirtFtn() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6483,7 +6440,6 @@ void Interpreter::LdVirtFtn() void Interpreter::Sizeof() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6648,7 +6604,6 @@ template<int op> void Interpreter::CompareOp() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -6666,7 +6621,6 @@ template<int op> INT32 Interpreter::CompareOpRes(unsigned op1idx) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7154,7 +7108,6 @@ template<int compOp, bool reverse, int targetLen> void Interpreter::BrOnComparison() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7200,7 +7153,6 @@ void Interpreter::BrOnComparison() void Interpreter::LdFld(FieldDesc* fldIn) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7432,7 +7384,6 @@ void Interpreter::LdFld(FieldDesc* fldIn) void Interpreter::LdFldA() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7485,7 +7436,6 @@ void Interpreter::LdFldA() void Interpreter::StFld() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7642,7 +7592,6 @@ void Interpreter::StFld() bool Interpreter::StaticFldAddrWork(CORINFO_ACCESS_FLAGS accessFlgs, /*out (byref)*/void** pStaticFieldAddr, /*out*/InterpreterType* pit, /*out*/UINT* pFldSize, /*out*/bool* pManagedMem) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7713,7 +7662,6 @@ bool Interpreter::StaticFldAddrWork(CORINFO_ACCESS_FLAGS accessFlgs, /*out (byre void Interpreter::LdSFld() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7817,7 +7765,6 @@ void Interpreter::EnsureClassInit(MethodTable* pMT) void Interpreter::LdSFldA() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7850,7 +7797,6 @@ void Interpreter::LdSFldA() void Interpreter::StSFld() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7917,7 +7863,6 @@ template<typename T, bool IsObjType, CorInfoType cit> void Interpreter::LdElemWithType() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -7989,7 +7934,6 @@ template<typename T, bool IsObjType> void Interpreter::StElemWithType() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8069,7 +8013,6 @@ template<bool takeAddress> void Interpreter::LdElem() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8195,7 +8138,6 @@ void Interpreter::LdElem() void Interpreter::StElem() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8337,7 +8279,6 @@ void Interpreter::StElem() void Interpreter::InitBlk() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8388,7 +8329,6 @@ void Interpreter::InitBlk() void Interpreter::CpBlk() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8446,7 +8386,6 @@ void Interpreter::CpBlk() void Interpreter::Box() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8514,7 +8453,6 @@ void Interpreter::Box() void Interpreter::BoxStructRefAt(unsigned ind, CORINFO_CLASS_HANDLE valCls) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8551,7 +8489,6 @@ void Interpreter::BoxStructRefAt(unsigned ind, CORINFO_CLASS_HANDLE valCls) void Interpreter::Unbox() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8646,7 +8583,6 @@ void Interpreter::Unbox() void Interpreter::Throw() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8683,7 +8619,6 @@ void Interpreter::Throw() void Interpreter::Rethrow() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8696,7 +8631,6 @@ void Interpreter::Rethrow() void Interpreter::UnboxAny() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8823,7 +8757,6 @@ void Interpreter::UnboxAny() void Interpreter::LdLen() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -8852,14 +8785,12 @@ void Interpreter::DoCall(bool virtualCall) { #if INTERP_DYNAMIC_CONTRACTS CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; } CONTRACTL_END; #else // Dynamic contract occupies too much stack. - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_COOPERATIVE; @@ -8915,14 +8846,12 @@ void Interpreter::DoCallWork(bool virtualCall, void* thisArg, CORINFO_RESOLVED_T { #if INTERP_DYNAMIC_CONTRACTS CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; } CONTRACTL_END; #else // Dynamic contract occupies too much stack. - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_COOPERATIVE; @@ -10020,14 +9949,12 @@ void Interpreter::CallI() { #if INTERP_DYNAMIC_CONTRACTS CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; } CONTRACTL_END; #else // Dynamic contract occupies too much stack. - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_COOPERATIVE; @@ -10418,7 +10345,6 @@ void Interpreter::CallI() bool Interpreter::IsDeadSimpleGetter(CEEInfo* info, MethodDesc* pMD, size_t* offsetOfLd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_ANY; @@ -10492,7 +10418,6 @@ bool Interpreter::IsDeadSimpleGetter(CEEInfo* info, MethodDesc* pMD, size_t* off void Interpreter::DoStringLength() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10532,7 +10457,6 @@ void Interpreter::DoStringLength() void Interpreter::DoStringGetChar() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10593,7 +10517,6 @@ void Interpreter::DoStringGetChar() void Interpreter::DoGetTypeFromHandle() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10621,7 +10544,6 @@ void Interpreter::DoGetTypeFromHandle() void Interpreter::DoByReferenceCtor() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10657,7 +10579,6 @@ void Interpreter::DoByReferenceCtor() void Interpreter::DoByReferenceValue() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10691,7 +10612,6 @@ void Interpreter::DoByReferenceValue() void Interpreter::DoSIMDHwAccelerated() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10710,7 +10630,6 @@ void Interpreter::DoSIMDHwAccelerated() void Interpreter::RecordConstrainedCall() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10795,7 +10714,6 @@ void Interpreter::VerificationError(const char* msg) void Interpreter::ThrowDivideByZero() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10807,7 +10725,6 @@ void Interpreter::ThrowDivideByZero() void Interpreter::ThrowSysArithException() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10821,7 +10738,6 @@ void Interpreter::ThrowSysArithException() void Interpreter::ThrowNullPointerException() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10833,7 +10749,6 @@ void Interpreter::ThrowNullPointerException() void Interpreter::ThrowOverflowException() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10845,7 +10760,6 @@ void Interpreter::ThrowOverflowException() void Interpreter::ThrowArrayBoundsException() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10857,7 +10771,6 @@ void Interpreter::ThrowArrayBoundsException() void Interpreter::ThrowInvalidCastException() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10869,7 +10782,6 @@ void Interpreter::ThrowInvalidCastException() void Interpreter::ThrowStackOverflow() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -10899,7 +10811,6 @@ Interpreter::AddrToMDMap* Interpreter::GetAddrToMdMap() { #if 0 CONTRACTL { - SO_TOLERANT; THROWS; GC_NOTRIGGER; } CONTRACTL_END; @@ -10916,7 +10827,6 @@ void Interpreter::RecordInterpreterStubForMethodDesc(CORINFO_METHOD_HANDLE md, v { #if 0 CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; } CONTRACTL_END; @@ -10935,7 +10845,6 @@ void Interpreter::RecordInterpreterStubForMethodDesc(CORINFO_METHOD_HANDLE md, v MethodDesc* Interpreter::InterpretationStubToMethodInfo(PCODE addr) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; } CONTRACTL_END; @@ -10961,7 +10870,6 @@ Interpreter::MethodHandleToInterpMethInfoPtrMap* Interpreter::GetMethodHandleToI { #if 0 CONTRACTL { - SO_TOLERANT; THROWS; GC_NOTRIGGER; } CONTRACTL_END; @@ -10978,7 +10886,6 @@ InterpreterMethodInfo* Interpreter::RecordInterpreterMethodInfoForMethodHandle(C { #if 0 CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; } CONTRACTL_END; @@ -11013,7 +10920,6 @@ InterpreterMethodInfo* Interpreter::RecordInterpreterMethodInfoForMethodHandle(C InterpreterMethodInfo* Interpreter::MethodHandleToInterpreterMethInfoPtr(CORINFO_METHOD_HANDLE md) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_TRIGGERS; } CONTRACTL_END; @@ -11545,7 +11451,6 @@ static const char* CorInfoTypeNames[] = { const char* eeGetMethodFullName(CEEInfo* info, CORINFO_METHOD_HANDLE hnd, const char** clsName) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_ANY; diff --git a/src/vm/interpreter.hpp b/src/vm/interpreter.hpp index 49f419d424..c87dc91b18 100644 --- a/src/vm/interpreter.hpp +++ b/src/vm/interpreter.hpp @@ -38,7 +38,6 @@ FILE* Interpreter::GetLogFile() inline void Interpreter::LdFromMemAddr(void* addr, InterpreterType tp) { CONTRACTL { - SO_TOLERANT; THROWS; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -113,7 +112,6 @@ inline void Interpreter::LdFromMemAddr(void* addr, InterpreterType tp) inline void Interpreter::LdLoc(int locNum) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -136,7 +134,6 @@ inline void Interpreter::LdLoc(int locNum) void Interpreter::StLoc(int locNum) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; @@ -217,7 +214,6 @@ void Interpreter::StLoc(int locNum) void Interpreter::StToLocalMemAddr(void* addr, InterpreterType tp) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_COOPERATIVE; diff --git a/src/vm/jithelpers.cpp b/src/vm/jithelpers.cpp index d0e0b4463b..ea1d2da2ed 100644 --- a/src/vm/jithelpers.cpp +++ b/src/vm/jithelpers.cpp @@ -39,7 +39,6 @@ #include "ecall.h" #include "generics.h" #include "typestring.h" -#include "stackprobe.h" #include "typedesc.h" #include "genericdict.h" #include "array.h" @@ -2180,7 +2179,6 @@ TypeHandle::CastResult ArrayIsInstanceOfNoGC(Object *pObject, TypeHandle toTypeH NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pObject)); PRECONDITION(pObject->GetMethodTable()->IsArray()); PRECONDITION(toTypeHnd.IsArray()); @@ -2233,7 +2231,6 @@ TypeHandle::CastResult ArrayObjSupportsBizarreInterfaceNoGC(Object *pObject, Met NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pObject)); PRECONDITION(pObject->GetMethodTable()->IsArray()); PRECONDITION(pInterfaceMT->IsInterface()); @@ -2265,7 +2262,6 @@ TypeHandle::CastResult STDCALL ObjIsInstanceOfNoGC(Object *pObject, TypeHandle t NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pObject)); } CONTRACTL_END; @@ -2915,7 +2911,6 @@ HCIMPL1_RAW(StringObject*, UnframedAllocateString, DWORD stringLength) THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; STRINGREF result; @@ -4806,9 +4801,6 @@ HCIMPL1(void, IL_Throw, Object* obj) { FCALL_CONTRACT; - // This "violation" isn't a really a violation. - // We are calling a assembly helper that can't have an SO Tolerance contract - CONTRACT_VIOLATION(SOToleranceViolation); /* Make no assumptions about the current machine state */ ResetCurrentContext(); @@ -5180,7 +5172,6 @@ void DoJITFailFast () MODE_ANY; WRAPPER(GC_TRIGGERS); WRAPPER(THROWS); - SO_NOT_MAINLINE; // If process is coming down, SO probe is not going to do much good } CONTRACTL_END; LOG((LF_ALWAYS, LL_FATALERROR, "Unsafe buffer security check failure: Buffer overrun detected")); @@ -5390,7 +5381,6 @@ extern "C" void * _ReturnAddress(void); HCIMPL0(void, JIT_DbgIsJustMyCode) { FCALL_CONTRACT; - SO_NOT_MAINLINE_FUNCTION; // We need to get both the ip of the managed function this probe is in // (which will be our return address) and the frame pointer for that @@ -5716,7 +5706,6 @@ Thread * __stdcall JIT_InitPInvokeFrame(InlinedCallFrame *pFrame, PTR_VOID StubS { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_TRIGGERS; } CONTRACTL_END; @@ -5901,7 +5890,6 @@ void F_CALL_VA_CONV JIT_TailCall(PCODE copyArgs, PCODE target, ...) // Can't have a regular contract because we would never pop it // We only throw a stack overflow if needed, and we can't handle // a GC because the incoming parameters are totally unprotected. - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_COOPERATIVE @@ -6144,7 +6132,6 @@ void WriteJitHelperCountToSTRESSLOG() { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/jitinterface.cpp b/src/vm/jitinterface.cpp index d05a040c25..def08c629f 100644 --- a/src/vm/jitinterface.cpp +++ b/src/vm/jitinterface.cpp @@ -40,7 +40,6 @@ #include "ecall.h" #include "generics.h" #include "typestring.h" -#include "stackprobe.h" #include "typedesc.h" #include "genericdict.h" #include "array.h" @@ -212,7 +211,6 @@ inline static void GetTypeContext(CORINFO_CONTEXT_HANDLE context, SigTypeContext { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; PRECONDITION(context != NULL); } @@ -374,7 +372,6 @@ void CheckForEquivalenceAndLoadTypeBeforeCodeIsRun(Module *pModule, mdToken toke { THROWS; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; @@ -566,7 +563,6 @@ CEEInfo::ConvToJitSig( CORINFO_CLASS_HANDLE CEEInfo::getTokenTypeAsHandle (CORINFO_RESOLVED_TOKEN * pResolvedToken) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -605,7 +601,6 @@ size_t CEEInfo::findNameOfToken ( size_t FQNameCapacity) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -634,7 +629,6 @@ size_t CEEInfo::findNameOfToken ( CorInfoCanSkipVerificationResult CEEInfo::canSkipMethodVerification(CORINFO_METHOD_HANDLE ftnHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -731,7 +725,6 @@ CorInfoCanSkipVerificationResult CEEInfo::canSkipVerification( CORINFO_MODULE_HANDLE moduleHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -747,7 +740,6 @@ BOOL CEEInfo::isValidToken ( mdToken metaTOK) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_ANY; @@ -780,7 +772,6 @@ BOOL CEEInfo::isValidStringRef ( mdToken metaTOK) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -895,7 +886,6 @@ size_t CEEInfo::findNameOfToken (Module* module, CorInfoHelpFunc CEEInfo::getLazyStringLiteralHelper(CORINFO_MODULE_HANDLE handle) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -951,7 +941,6 @@ static DECLSPEC_NORETURN void ThrowBadTokenException(CORINFO_RESOLVED_TOKEN * pR void CEEInfo::resolveToken(/* IN, OUT */ CORINFO_RESOLVED_TOKEN * pResolvedToken) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -1236,7 +1225,6 @@ bool isValidTokenForTryResolveToken(CEEInfo* info, CORINFO_RESOLVED_TOKEN* resol CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1286,7 +1274,6 @@ LONG TryResolveTokenFilter(struct _EXCEPTION_POINTERS* exceptionPointers, void* CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1309,7 +1296,6 @@ LONG TryResolveTokenFilter(struct _EXCEPTION_POINTERS* exceptionPointers, void* bool CEEInfo::tryResolveToken(CORINFO_RESOLVED_TOKEN* resolvedToken) { // No dynamic contract here because SEH is used - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_PREEMPTIVE; @@ -1512,7 +1498,6 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, ) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -1764,7 +1749,6 @@ void CEEInfo::getFieldInfo (CORINFO_RESOLVED_TOKEN * pResolvedToken, bool CEEInfo::isFieldStatic(CORINFO_FIELD_HANDLE fldHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -1788,7 +1772,6 @@ CEEInfo::findCallSiteSig( CORINFO_SIG_INFO * sigRet) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -1870,7 +1853,6 @@ CEEInfo::findSig( CORINFO_SIG_INFO * sigRet) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -1918,7 +1900,6 @@ CEEInfo::getClassSize( CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -1946,7 +1927,6 @@ CEEInfo::getHeapClassSize( CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -1978,7 +1958,6 @@ CEEInfo::getHeapClassSize( BOOL CEEInfo::canAllocateOnStack(CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -2009,7 +1988,6 @@ BOOL CEEInfo::canAllocateOnStack(CORINFO_CLASS_HANDLE clsHnd) unsigned CEEInfo::getClassAlignmentRequirement(CORINFO_CLASS_HANDLE type, BOOL fDoubleAlignHint) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -2103,7 +2081,6 @@ CORINFO_FIELD_HANDLE CEEInfo::getFieldInClass(CORINFO_CLASS_HANDLE clsHnd, INT num) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -2128,7 +2105,6 @@ mdMethodDef CEEInfo::getMethodDefFromMethod(CORINFO_METHOD_HANDLE hMethod) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -2160,7 +2136,6 @@ BOOL CEEInfo::checkMethodModifier(CORINFO_METHOD_HANDLE hMethod, BOOL fOptional) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -2240,7 +2215,6 @@ static unsigned ComputeGCLayout(MethodTable * pMT, BYTE* gcPtrs) unsigned CEEInfo::getClassGClayout (CORINFO_CLASS_HANDLE clsHnd, BYTE* gcPtrs) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -2333,7 +2307,6 @@ bool CEEInfo::getSystemVAmd64PassStructInRegisterDescriptor( /*OUT*/ SYSTEMV_AMD64_CORINFO_STRUCT_REG_PASSING_DESCRIPTOR* structPassInRegDescPtr) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -2428,7 +2401,6 @@ bool CEEInfo::getSystemVAmd64PassStructInRegisterDescriptor( unsigned CEEInfo::getClassNumInstanceFields (CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -2459,7 +2431,6 @@ unsigned CEEInfo::getClassNumInstanceFields (CORINFO_CLASS_HANDLE clsHnd) CorInfoType CEEInfo::asCorInfoType (CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -2481,7 +2452,6 @@ CorInfoType CEEInfo::asCorInfoType (CORINFO_CLASS_HANDLE clsHnd) CORINFO_LOOKUP_KIND CEEInfo::getLocationOfThisType(CORINFO_METHOD_HANDLE context) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -2536,7 +2506,6 @@ CORINFO_METHOD_HANDLE CEEInfo::GetDelegateCtor( DelegateCtorArgs *pCtorData) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -2577,7 +2546,6 @@ CORINFO_METHOD_HANDLE CEEInfo::GetDelegateCtor( void CEEInfo::MethodCompileComplete(CORINFO_METHOD_HANDLE methHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -2608,7 +2576,6 @@ void CEEInfo::embedGenericHandle( CORINFO_GENERICHANDLE_RESULT *pResult) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -3565,7 +3532,6 @@ NoSpecialCase: const char* CEEInfo::getClassName (CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -3603,7 +3569,6 @@ const char* CEEInfo::getClassName (CORINFO_CLASS_HANDLE clsHnd) const char* CEEInfo::getHelperName (CorInfoHelpFunc ftnNum) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -3639,7 +3604,6 @@ int CEEInfo::appendClassName(__deref_inout_ecount(*pnBufLen) WCHAR** ppBuf, BOOL fAssembly) { CONTRACTL { - SO_TOLERANT; MODE_PREEMPTIVE; THROWS; GC_TRIGGERS; @@ -3674,7 +3638,6 @@ int CEEInfo::appendClassName(__deref_inout_ecount(*pnBufLen) WCHAR** ppBuf, CORINFO_MODULE_HANDLE CEEInfo::getClassModule(CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -3697,7 +3660,6 @@ CORINFO_MODULE_HANDLE CEEInfo::getClassModule(CORINFO_CLASS_HANDLE clsHnd) CORINFO_ASSEMBLY_HANDLE CEEInfo::getModuleAssembly(CORINFO_MODULE_HANDLE modHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -3718,7 +3680,6 @@ CORINFO_ASSEMBLY_HANDLE CEEInfo::getModuleAssembly(CORINFO_MODULE_HANDLE modHnd) const char* CEEInfo::getAssemblyName(CORINFO_ASSEMBLY_HANDLE asmHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -3737,7 +3698,6 @@ const char* CEEInfo::getAssemblyName(CORINFO_ASSEMBLY_HANDLE asmHnd) void* CEEInfo::LongLifetimeMalloc(size_t sz) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -3756,7 +3716,6 @@ void* CEEInfo::LongLifetimeMalloc(size_t sz) void CEEInfo::LongLifetimeFree(void* obj) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -3771,7 +3730,6 @@ void CEEInfo::LongLifetimeFree(void* obj) size_t CEEInfo::getClassModuleIdForStatics(CORINFO_CLASS_HANDLE clsHnd, CORINFO_MODULE_HANDLE *pModuleHandle, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -3804,7 +3762,6 @@ size_t CEEInfo::getClassModuleIdForStatics(CORINFO_CLASS_HANDLE clsHnd, CORINFO_ BOOL CEEInfo::isValueClass(CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -3836,7 +3793,6 @@ BOOL CEEInfo::isValueClass(CORINFO_CLASS_HANDLE clsHnd) CorInfoInlineTypeCheck CEEInfo::canInlineTypeCheck(CORINFO_CLASS_HANDLE clsHnd, CorInfoInlineTypeCheckSource source) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -3871,7 +3827,6 @@ CorInfoInlineTypeCheck CEEInfo::canInlineTypeCheck(CORINFO_CLASS_HANDLE clsHnd, BOOL CEEInfo::canInlineTypeCheckWithObjectVTable (CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -3928,7 +3883,6 @@ BOOL CEEInfo::canInlineTypeCheckWithObjectVTable (CORINFO_CLASS_HANDLE clsHnd) DWORD CEEInfo::getClassAttribs (CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -3952,7 +3906,6 @@ DWORD CEEInfo::getClassAttribs (CORINFO_CLASS_HANDLE clsHnd) BOOL CEEInfo::isStructRequiringStackAllocRetBuf(CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4092,7 +4045,6 @@ CorInfoInitClassResult CEEInfo::initClass( BOOL speculative) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4279,7 +4231,6 @@ exit: ; void CEEInfo::classMustBeLoadedBeforeCodeIsRun (CORINFO_CLASS_HANDLE typeToLoadHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -4299,7 +4250,6 @@ void CEEInfo::classMustBeLoadedBeforeCodeIsRun (CORINFO_CLASS_HANDLE typeToLoadH void CEEInfo::methodMustBeLoadedBeforeCodeIsRun (CORINFO_METHOD_HANDLE methHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -4319,7 +4269,6 @@ void CEEInfo::methodMustBeLoadedBeforeCodeIsRun (CORINFO_METHOD_HANDLE methHnd) CORINFO_METHOD_HANDLE CEEInfo::mapMethodDeclToMethodImpl(CORINFO_METHOD_HANDLE methHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4342,7 +4291,6 @@ CORINFO_METHOD_HANDLE CEEInfo::mapMethodDeclToMethodImpl(CORINFO_METHOD_HANDLE m CORINFO_CLASS_HANDLE CEEInfo::getBuiltinClass(CorInfoClassId classId) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4395,7 +4343,6 @@ CorInfoType CEEInfo::getTypeForPrimitiveValueClass( CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4482,7 +4429,6 @@ CorInfoType CEEInfo::getTypeForPrimitiveNumericClass( CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -4543,7 +4489,6 @@ CorInfoType CEEInfo::getTypeForPrimitiveNumericClass( void CEEInfo::getGSCookie(GSCookie * pCookieVal, GSCookie ** ppCookieVal) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4573,7 +4518,6 @@ BOOL CEEInfo::canCast( CORINFO_CLASS_HANDLE parent) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4597,7 +4541,6 @@ BOOL CEEInfo::areTypesEquivalent( CORINFO_CLASS_HANDLE cls2) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4622,7 +4565,6 @@ TypeCompareState CEEInfo::compareTypesForCast( CORINFO_CLASS_HANDLE toClass) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4714,7 +4656,6 @@ TypeCompareState CEEInfo::compareTypesForEquality( CORINFO_CLASS_HANDLE cls2) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4771,7 +4712,6 @@ CORINFO_CLASS_HANDLE CEEInfo::mergeClasses( CORINFO_CLASS_HANDLE cls2) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4843,7 +4783,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getParentType( CORINFO_CLASS_HANDLE cls) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4891,7 +4830,6 @@ CorInfoType CEEInfo::getChildType ( ) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4940,7 +4878,6 @@ CorInfoType CEEInfo::getChildType ( BOOL CEEInfo::satisfiesClassConstraints(CORINFO_CLASS_HANDLE cls) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4963,7 +4900,6 @@ BOOL CEEInfo::satisfiesClassConstraints(CORINFO_CLASS_HANDLE cls) BOOL CEEInfo::isSDArray(CORINFO_CLASS_HANDLE cls) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -4995,7 +4931,6 @@ BOOL CEEInfo::isSDArray(CORINFO_CLASS_HANDLE cls) unsigned CEEInfo::getArrayRank(CORINFO_CLASS_HANDLE cls) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -5033,7 +4968,6 @@ void * CEEInfo::getArrayInitializationData( ) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -5076,7 +5010,6 @@ CorInfoIsAccessAllowedResult CEEInfo::canAccessClass( ) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -5178,7 +5111,6 @@ void CEEInfo::getCallInfo( CORINFO_CALL_INFO *pResult /*out */) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -5851,7 +5783,6 @@ BOOL CEEInfo::canAccessFamily(CORINFO_METHOD_HANDLE hCaller, void CEEInfo::ThrowExceptionForHelper(const CORINFO_HELPER_DESC * throwHelper) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -5896,7 +5827,6 @@ void CEEInfo::ThrowExceptionForHelper(const CORINFO_HELPER_DESC * throwHelper) BOOL CEEInfo::isRIDClassDomainID(CORINFO_CLASS_HANDLE cls) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -5921,7 +5851,6 @@ unsigned CEEInfo::getClassDomainID (CORINFO_CLASS_HANDLE clsHnd, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -5993,7 +5922,6 @@ bool __stdcall TrackAllocationsEnabled() CorInfoHelpFunc CEEInfo::getNewHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, CORINFO_METHOD_HANDLE callerHandle, bool * pHasSideEffects) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6132,7 +6060,6 @@ CorInfoHelpFunc CEEInfo::getNewHelperStatic(MethodTable * pMT, bool * pHasSideEf CorInfoHelpFunc CEEInfo::getNewArrHelper (CORINFO_CLASS_HANDLE arrayClsHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6220,7 +6147,6 @@ CorInfoHelpFunc CEEInfo::getNewArrHelperStatic(TypeHandle clsHnd) CorInfoHelpFunc CEEInfo::getCastingHelper(CORINFO_RESOLVED_TOKEN * pResolvedToken, bool fThrowing) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6339,7 +6265,6 @@ CorInfoHelpFunc CEEInfo::getCastingHelperStatic(TypeHandle clsHnd, bool fThrowin CorInfoHelpFunc CEEInfo::getSharedCCtorHelper(CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -6422,7 +6347,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getTypeForBox(CORINFO_CLASS_HANDLE cls) CorInfoHelpFunc CEEInfo::getBoxHelper(CORINFO_CLASS_HANDLE clsHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6459,7 +6383,6 @@ CorInfoHelpFunc CEEInfo::getBoxHelper(CORINFO_CLASS_HANDLE clsHnd) CorInfoHelpFunc CEEInfo::getSecurityPrologHelper(CORINFO_METHOD_HANDLE ftn) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6495,7 +6418,6 @@ CORINFO_VARARGS_HANDLE CEEInfo::getVarArgsHandle(CORINFO_SIG_INFO *sig, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6527,7 +6449,6 @@ bool CEEInfo::canGetVarArgsHandle(CORINFO_SIG_INFO *sig) unsigned CEEInfo::getMethodHash (CORINFO_METHOD_HANDLE ftnHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6550,7 +6471,6 @@ unsigned CEEInfo::getMethodHash (CORINFO_METHOD_HANDLE ftnHnd) const char* CEEInfo::getMethodName (CORINFO_METHOD_HANDLE ftnHnd, const char** scopeName) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6629,7 +6549,6 @@ const char* CEEInfo::getMethodName (CORINFO_METHOD_HANDLE ftnHnd, const char** s const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, const char** className, const char** namespaceName, const char **enclosingClassName) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6684,7 +6603,6 @@ const char* CEEInfo::getMethodNameFromMetadata(CORINFO_METHOD_HANDLE ftnHnd, con const char* CEEInfo::getClassNameFromMetadata(CORINFO_CLASS_HANDLE cls, const char** namespaceName) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6715,7 +6633,6 @@ const char* CEEInfo::getClassNameFromMetadata(CORINFO_CLASS_HANDLE cls, const ch CORINFO_CLASS_HANDLE CEEInfo::getTypeInstantiationArgument(CORINFO_CLASS_HANDLE cls, unsigned index) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6739,7 +6656,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getTypeInstantiationArgument(CORINFO_CLASS_HANDLE DWORD CEEInfo::getMethodAttribs (CORINFO_METHOD_HANDLE ftn) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -6879,7 +6795,6 @@ void CEEInfo::setMethodAttribs ( CorInfoMethodRuntimeFlags attribs) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -7715,7 +7630,6 @@ CEEInfo::getMethodInfo( CORINFO_METHOD_INFO * methInfo) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -7818,7 +7732,6 @@ CorInfoInline CEEInfo::canInline (CORINFO_METHOD_HANDLE hCaller, DWORD* pRestrictions) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -8065,7 +7978,6 @@ void CEEInfo::reportInliningDecision (CORINFO_METHOD_HANDLE inlinerHnd, { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; - STATIC_CONTRACT_SO_TOLERANT; JIT_TO_EE_TRANSITION(); @@ -8209,7 +8121,6 @@ void CEEInfo::initConstraintsForVerification(CORINFO_METHOD_HANDLE hMethod, BOOL *pfHasCircularMethodConstraints) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -8242,7 +8153,6 @@ CorInfoInstantiationVerification CEEInfo::isInstantiationOfVerifiedGeneric(CORINFO_METHOD_HANDLE hMethod) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -8287,7 +8197,6 @@ bool CEEInfo::canTailCall (CORINFO_METHOD_HANDLE hCaller, bool fIsTailPrefix) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -8390,7 +8299,6 @@ void CEEInfo::reportTailCallDecision (CORINFO_METHOD_HANDLE callerHnd, { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; - STATIC_CONTRACT_SO_TOLERANT; JIT_TO_EE_TRANSITION(); @@ -8543,7 +8451,6 @@ void CEEInfo::getEHinfo( CORINFO_EH_CLAUSE* clause) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -8575,7 +8482,6 @@ CEEInfo::getMethodSig( CORINFO_CLASS_HANDLE owner) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -8651,7 +8557,6 @@ CEEInfo::getMethodClass( CORINFO_METHOD_HANDLE methodHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -8693,7 +8598,6 @@ CEEInfo::getMethodClass( CORINFO_MODULE_HANDLE CEEInfo::getMethodModule (CORINFO_METHOD_HANDLE methodHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -8726,7 +8630,6 @@ CorInfoIntrinsics CEEInfo::getIntrinsicID(CORINFO_METHOD_HANDLE methodHnd, bool * pMustExpand) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -8802,7 +8705,6 @@ CorInfoIntrinsics CEEInfo::getIntrinsicID(CORINFO_METHOD_HANDLE methodHnd, bool CEEInfo::isInSIMDModule(CORINFO_CLASS_HANDLE classHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -8841,7 +8743,6 @@ void CEEInfo::getMethodVTableOffset (CORINFO_METHOD_HANDLE methodHnd, bool * isRelative) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -9030,7 +8931,6 @@ CORINFO_METHOD_HANDLE CEEInfo::resolveVirtualMethod(CORINFO_METHOD_HANDLE method CORINFO_CONTEXT_HANDLE ownerType) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9053,7 +8953,6 @@ CORINFO_METHOD_HANDLE CEEInfo::getUnboxedEntry( bool* requiresInstMethodTableArg) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9098,7 +8997,6 @@ void CEEInfo::expandRawHandleIntrinsic( CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClass(CORINFO_CLASS_HANDLE elemType) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9118,7 +9016,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClass(CORINFO_CLASS_HAND CORINFO_CLASS_HANDLE CEEInfo::getDefaultEqualityComparerClassHelper(CORINFO_CLASS_HANDLE elemType) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9202,7 +9099,6 @@ void CEEInfo::getFunctionEntryPoint(CORINFO_METHOD_HANDLE ftnHnd, CORINFO_ACCESS_FLAGS accessFlags) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9261,7 +9157,6 @@ void CEEInfo::getFunctionFixedEntryPoint(CORINFO_METHOD_HANDLE ftn, CORINFO_CONST_LOOKUP * pResult) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9292,7 +9187,6 @@ void CEEInfo::getFunctionFixedEntryPoint(CORINFO_METHOD_HANDLE ftn, const char* CEEInfo::getFieldName (CORINFO_FIELD_HANDLE fieldHnd, const char** scopeName) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9334,7 +9228,6 @@ const char* CEEInfo::getFieldName (CORINFO_FIELD_HANDLE fieldHnd, const char** s CORINFO_CLASS_HANDLE CEEInfo::getFieldClass (CORINFO_FIELD_HANDLE fieldHnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -9364,7 +9257,6 @@ CorInfoType CEEInfo::getFieldType (CORINFO_FIELD_HANDLE fieldHnd, CORINFO_CLASS_HANDLE owner) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9443,7 +9335,6 @@ CorInfoType CEEInfo::getFieldTypeInternal (CORINFO_FIELD_HANDLE fieldHnd, unsigned CEEInfo::getFieldOffset (CORINFO_FIELD_HANDLE fieldHnd) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9481,7 +9372,6 @@ unsigned CEEInfo::getFieldOffset (CORINFO_FIELD_HANDLE fieldHnd) bool CEEInfo::isWriteBarrierHelperRequired(CORINFO_FIELD_HANDLE field) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9517,7 +9407,6 @@ bool CEEInfo::isWriteBarrierHelperRequired(CORINFO_FIELD_HANDLE field) DWORD CEEInfo::getFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE fieldHnd, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9546,7 +9435,6 @@ DWORD CEEInfo::getFieldThreadLocalStoreID(CORINFO_FIELD_HANDLE fieldHnd, void ** void *CEEInfo::allocateArray(ULONG cBytes) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9566,7 +9454,6 @@ void *CEEInfo::allocateArray(ULONG cBytes) void CEEInfo::freeArray(void *array) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9584,7 +9471,6 @@ void CEEInfo::getBoundaries(CORINFO_METHOD_HANDLE ftn, ICorDebugInfo::BoundaryTypes *implicitBoundaries) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9613,7 +9499,6 @@ void CEEInfo::getVars(CORINFO_METHOD_HANDLE ftn, ULONG32 *cVars, ICorDebugInfo:: bool *extendOthers) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9643,7 +9528,6 @@ void CEEInfo::getVars(CORINFO_METHOD_HANDLE ftn, ULONG32 *cVars, ICorDebugInfo:: CORINFO_ARG_LIST_HANDLE CEEInfo::getArgNext(CORINFO_ARG_LIST_HANDLE args) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9673,7 +9557,6 @@ CorInfoTypeWithMod CEEInfo::getArgType ( ) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9770,7 +9653,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getArgClass ( ) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9816,7 +9698,6 @@ CORINFO_CLASS_HANDLE CEEInfo::getArgClass ( CorInfoType CEEInfo::getHFAType(CORINFO_CLASS_HANDLE hClass) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9841,7 +9722,6 @@ CorInfoType CEEInfo::getHFAType(CORINFO_CLASS_HANDLE hClass) CorInfoUnmanagedCallConv CEEInfo::getUnmanagedCallConv(CORINFO_METHOD_HANDLE method) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9903,7 +9783,6 @@ BOOL NDirectMethodDesc::ComputeMarshalingRequired() BOOL CEEInfo::pInvokeMarshalingRequired(CORINFO_METHOD_HANDLE method, CORINFO_SIG_INFO* callSiteSig) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -9981,7 +9860,6 @@ BOOL CEEInfo::satisfiesMethodConstraints( CORINFO_METHOD_HANDLE method) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -10017,7 +9895,6 @@ BOOL CEEInfo::isCompatibleDelegate( BOOL* pfIsOpenDelegate) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -10058,7 +9935,6 @@ void* CEEInfo::getPInvokeUnmanagedTarget(CORINFO_METHOD_HANDLE method, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -10082,7 +9958,6 @@ void* CEEInfo::getAddressOfPInvokeFixup(CORINFO_METHOD_HANDLE method, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10125,7 +10000,6 @@ CORINFO_JUST_MY_CODE_HANDLE CEEInfo::getJustMyCodeHandle( CORINFO_JUST_MY_CODE_HANDLE**ppIndirection) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10175,7 +10049,6 @@ void InlinedCallFrame::GetEEInfo(CORINFO_EE_INFO::InlinedCallFrameInfo *pInfo) void CEEInfo::getEEInfo(CORINFO_EE_INFO *pEEInfoOut) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -10242,7 +10115,6 @@ void CEEInfo::getEEInfo(CORINFO_EE_INFO *pEEInfoOut) LPCWSTR CEEInfo::getJitTimeLogFilename() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -10263,7 +10135,6 @@ LPCWSTR CEEInfo::getJitTimeLogFilename() DWORD CEEInfo::getThreadTLSIndex(void **ppIndirection) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -10280,7 +10151,6 @@ DWORD CEEInfo::getThreadTLSIndex(void **ppIndirection) const void * CEEInfo::getInlinedCallFrameVptr(void **ppIndirection) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10307,7 +10177,6 @@ const void * CEEInfo::getInlinedCallFrameVptr(void **ppIndirection) LONG * CEEInfo::getAddrOfCaptureThreadGlobal(void **ppIndirection) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10332,7 +10201,6 @@ LONG * CEEInfo::getAddrOfCaptureThreadGlobal(void **ppIndirection) HRESULT CEEInfo::GetErrorHRESULT(struct _EXCEPTION_POINTERS *pExceptionPointers) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_TRIGGERS; MODE_ANY; @@ -10363,7 +10231,6 @@ HRESULT CEEInfo::GetErrorHRESULT(struct _EXCEPTION_POINTERS *pExceptionPointers) ULONG CEEInfo::GetErrorMessage(__inout_ecount(bufferLength) LPWSTR buffer, ULONG bufferLength) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -10404,7 +10271,6 @@ ULONG CEEInfo::GetErrorMessage(__inout_ecount(bufferLength) LPWSTR buffer, ULONG LONG EEFilterException(struct _EXCEPTION_POINTERS *pExceptionPointers, void *unused) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; } CONTRACTL_END; @@ -10413,8 +10279,6 @@ LONG EEFilterException(struct _EXCEPTION_POINTERS *pExceptionPointers, void *unu JIT_TO_EE_TRANSITION_LEAF(); - VALIDATE_BACKOUT_STACK_CONSUMPTION; - unsigned code = pExceptionPointers->ExceptionRecord->ExceptionCode; #ifdef _DEBUG @@ -10499,7 +10363,6 @@ int CEEInfo::FilterException(struct _EXCEPTION_POINTERS *pExceptionPointers) void CEEInfo::HandleException(struct _EXCEPTION_POINTERS *pExceptionPointers) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; } CONTRACTL_END; @@ -10581,7 +10444,6 @@ void CEEInfo::ThrowExceptionForJitResult( HRESULT result) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -10600,7 +10462,6 @@ CORINFO_MODULE_HANDLE CEEInfo::embedModuleHandle(CORINFO_MODULE_HANDLE handle, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10622,7 +10483,6 @@ CORINFO_CLASS_HANDLE CEEInfo::embedClassHandle(CORINFO_CLASS_HANDLE handle, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10643,7 +10503,6 @@ CORINFO_FIELD_HANDLE CEEInfo::embedFieldHandle(CORINFO_FIELD_HANDLE handle, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10664,7 +10523,6 @@ CORINFO_METHOD_HANDLE CEEInfo::embedMethodHandle(CORINFO_METHOD_HANDLE handle, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10693,7 +10551,6 @@ void CEEInfo::setJitFlags(const CORJIT_FLAGS& jitFlags) DWORD CEEInfo::getJitFlags(CORJIT_FLAGS* jitFlags, DWORD sizeInBytes) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10736,7 +10593,6 @@ bool CEEInfo::runWithErrorTrap(void (*function)(void*), void* param) // No dynamic contract here because SEH is used STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_MODE_PREEMPTIVE; // NOTE: the lack of JIT/EE transition markers in this method is intentional. Any @@ -10788,7 +10644,6 @@ bool CEEInfo::runWithErrorTrap(void (*function)(void*), void* param) IEEMemoryManager* CEEInfo::getMemoryManager() { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -10808,7 +10663,6 @@ IEEMemoryManager* CEEInfo::getMemoryManager() /*********************************************************************/ int CEEInfo::doAssert(const char* szFile, int iLine, const char* szExpr) { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_PREEMPTIVE; @@ -10839,7 +10693,6 @@ int CEEInfo::doAssert(const char* szFile, int iLine, const char* szExpr) void CEEInfo::reportFatalError(CorJitResult result) { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_PREEMPTIVE; @@ -10854,7 +10707,6 @@ void CEEInfo::reportFatalError(CorJitResult result) BOOL CEEInfo::logMsg(unsigned level, const char* fmt, va_list args) { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_PREEMPTIVE; @@ -10891,7 +10743,6 @@ void* CEEJitInfo::getHelperFtn(CorInfoHelpFunc ftnNum, /* IN */ void ** ppIndirection) /* OUT */ { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -11018,7 +10869,6 @@ void CEEJitInfo::GetProfilingHandle(BOOL *pbHookFunction, BOOL *pbIndirectedHandles) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11092,7 +10942,6 @@ void CEEJitInfo::setBoundaries(CORINFO_METHOD_HANDLE ftn, ULONG32 cMap, ICorDebugInfo::OffsetMapping *pMap) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11111,7 +10960,6 @@ void CEEJitInfo::setBoundaries(CORINFO_METHOD_HANDLE ftn, ULONG32 cMap, void CEEJitInfo::setVars(CORINFO_METHOD_HANDLE ftn, ULONG32 cVars, ICorDebugInfo::NativeVarInfo *vars) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11130,7 +10978,6 @@ void CEEJitInfo::setVars(CORINFO_METHOD_HANDLE ftn, ULONG32 cVars, ICorDebugInfo void CEEJitInfo::CompressDebugInfo() { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11206,7 +11053,6 @@ void CEEJitInfo::reserveUnwindInfo(BOOL isFunclet, BOOL isColdCode, ULONG unwind { #ifdef WIN64EXCEPTIONS CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -11268,7 +11114,6 @@ void CEEJitInfo::allocUnwindInfo ( { #ifdef WIN64EXCEPTIONS CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11436,7 +11281,6 @@ void CEEJitInfo::recordRelocation(void * location, INT32 addlDelta) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11632,7 +11476,6 @@ void CEEJitInfo::recordRelocation(void * location, WORD CEEJitInfo::getRelocTypeHint(void * target) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11654,7 +11497,6 @@ WORD CEEJitInfo::getRelocTypeHint(void * target) void CEEJitInfo::getModuleNativeEntryPointRange(void** pStart, void** pEnd) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_PREEMPTIVE; @@ -11702,7 +11544,6 @@ InfoAccessType CEEJitInfo::constructStringLiteral(CORINFO_MODULE_HANDLE scopeHnd void **ppValue) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11732,7 +11573,6 @@ InfoAccessType CEEJitInfo::constructStringLiteral(CORINFO_MODULE_HANDLE scopeHnd InfoAccessType CEEJitInfo::emptyStringLiteral(void ** ppValue) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11758,7 +11598,6 @@ void* CEEJitInfo::getFieldAddress(CORINFO_FIELD_HANDLE fieldHnd, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11813,7 +11652,6 @@ CORINFO_CLASS_HANDLE CEEJitInfo::getStaticFieldCurrentClass(CORINFO_FIELD_HANDLE bool* pIsSpeculative) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11911,7 +11749,6 @@ void* CEEJitInfo::getMethodSync(CORINFO_METHOD_HANDLE ftnHnd, void **ppIndirection) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -11938,7 +11775,6 @@ HRESULT CEEJitInfo::allocBBProfileBuffer ( ) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -12005,7 +11841,6 @@ void CEEJitInfo::allocMem ( ) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -12106,7 +11941,6 @@ void CEEJitInfo::allocMem ( void * CEEJitInfo::allocGCInfo (size_t size) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -12144,7 +11978,6 @@ void CEEJitInfo::setEHcount ( unsigned cEH) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -12171,7 +12004,6 @@ void CEEJitInfo::setEHinfo ( const CORINFO_EH_CLAUSE* clause) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -12221,7 +12053,6 @@ void CEEJitInfo::getEHinfo( CORINFO_EH_CLAUSE* clause) /* OUT */ { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -12258,7 +12089,6 @@ static CorJitResult CompileMethodWithEtwWrapper(EEJitManager *jitMgr, STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_PREEMPTIVE; - STATIC_CONTRACT_SO_INTOLERANT; SString namespaceOrClassName, methodName, methodSignature; // Fire an ETW event to mark the beginning of JIT'ing @@ -12286,22 +12116,16 @@ CorJitResult invokeCompileMethodHelper(EEJitManager *jitMgr, STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_PREEMPTIVE; - STATIC_CONTRACT_SO_INTOLERANT; CorJitResult ret = CORJIT_SKIPPED; // Note that CORJIT_SKIPPED is an error exit status code - comp->setJitFlags(jitFlags); #ifdef FEATURE_STACK_SAMPLING - // SO_INTOLERANT due to init affecting global state. static ConfigDWORD s_stackSamplingEnabled; bool samplingEnabled = (s_stackSamplingEnabled.val(CLRConfig::UNSUPPORTED_StackSamplingEnabled) != 0); #endif - BEGIN_SO_TOLERANT_CODE(GetThread()); - - #if defined(ALLOW_SXS_JIT) && !defined(CROSSGEN_COMPILE) if (FAILED(ret) && jitMgr->m_alternateJit #ifdef FEATURE_STACK_SAMPLING @@ -12420,8 +12244,6 @@ CorJitResult invokeCompileMethodHelper(EEJitManager *jitMgr, } #endif - END_SO_TOLERANT_CODE; - return ret; } @@ -12716,7 +12538,6 @@ void ThrowExceptionForJit(HRESULT res) { THROWS; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -13891,7 +13712,6 @@ void* CEEInfo::getTailCallCopyArgsThunk(CORINFO_SIG_INFO *pSig, CorInfoHelperTailCallSpecialHandling flags) { CONTRACTL { - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -14003,7 +13823,6 @@ void* CEEInfo::getFieldAddress(CORINFO_FIELD_HANDLE fieldHnd, void **ppIndirection) { CONTRACTL{ - SO_TOLERANT; THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; @@ -14172,7 +13991,6 @@ void EECodeInfo::Init(PCODE codeAddress) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; Init(codeAddress, ExecutionManager::GetScanFlags()); @@ -14183,7 +14001,6 @@ void EECodeInfo::Init(PCODE codeAddress, ExecutionManager::ScanFlag scanFlag) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; m_codeAddress = codeAddress; diff --git a/src/vm/jitinterface.h b/src/vm/jitinterface.h index 82bf31b65a..c47123d324 100644 --- a/src/vm/jitinterface.h +++ b/src/vm/jitinterface.h @@ -1333,7 +1333,6 @@ public: void ResetForJitRetry() { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; } CONTRACTL_END; diff --git a/src/vm/listlock.h b/src/vm/listlock.h index db953c8b55..8b356701b7 100644 --- a/src/vm/listlock.h +++ b/src/vm/listlock.h @@ -427,7 +427,6 @@ class ListLockBase BOOL HasLock() { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return(m_Crst.OwnedByCurrentThread()); } #endif diff --git a/src/vm/loaderallocator.cpp b/src/vm/loaderallocator.cpp index 21c6f276c2..a54b0932b5 100644 --- a/src/vm/loaderallocator.cpp +++ b/src/vm/loaderallocator.cpp @@ -202,7 +202,6 @@ BOOL LoaderAllocator::CheckAddReference_Unlocked(LoaderAllocator *pOtherLA) CONTRACTL { THROWS; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -237,7 +236,6 @@ BOOL LoaderAllocator::EnsureReference(LoaderAllocator *pOtherLA) CONTRACTL { THROWS; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -263,7 +261,6 @@ BOOL LoaderAllocator::EnsureInstantiation(Module *pDefiningModule, Instantiation CONTRACTL { THROWS; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -363,7 +360,6 @@ LoaderAllocator * LoaderAllocator::GCLoaderAllocators_RemoveAssemblies(AppDomain THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_INTOLERANT; } CONTRACTL_END; // List of LoaderAllocators being deleted @@ -530,7 +526,6 @@ void LoaderAllocator::GCLoaderAllocators(LoaderAllocator* pOriginalLoaderAllocat THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_INTOLERANT; } CONTRACTL_END; @@ -877,7 +872,6 @@ OBJECTREF LoaderAllocator::GetHandleValue(LOADERHANDLE handle) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -1327,7 +1321,6 @@ void LoaderAllocator::Terminate() NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; if (m_fTerminated) @@ -1566,7 +1559,6 @@ DispatchToken LoaderAllocator::TryLookupDispatchToken(UINT32 typeId, UINT32 slot NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; #ifdef FAT_DISPATCH_TOKENS @@ -1580,14 +1572,12 @@ DispatchToken LoaderAllocator::TryLookupDispatchToken(UINT32 typeId, UINT32 slot // exceptions and just return an invalid token, since this is EX_TRY { - BEGIN_SO_INTOLERANT_CODE(GetThread()); SimpleReadLockHolder rlock(m_pFatTokenSetLock); if (m_pFatTokenSet != NULL) { DispatchTokenFat key(typeId, slotNumber); pFat = m_pFatTokenSet->Lookup(&key); } - END_SO_INTOLERANT_CODE; } EX_CATCH { @@ -1951,7 +1941,6 @@ void AssemblyLoaderAllocator::ReleaseManagedAssemblyLoadContext() THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; diff --git a/src/vm/managedmdimport.cpp b/src/vm/managedmdimport.cpp index e7802751e3..e709575257 100644 --- a/src/vm/managedmdimport.cpp +++ b/src/vm/managedmdimport.cpp @@ -92,8 +92,6 @@ MDImpl4(Object *, MetaDataImport::GetDefaultValue, mdToken tk, INT64* pDefaultVa HRESULT hr = S_OK; Object *pRetVal = NULL; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrow(kStackOverflowException)); - IMDInternalImport *_pScope = pScope; MDDefaultValue value; @@ -123,8 +121,6 @@ MDImpl4(Object *, MetaDataImport::GetDefaultValue, mdToken tk, INT64* pDefaultVa *pCorElementType = (UINT32)value.m_bType; *pLength = (INT32)value.m_cbSize; ErrExit: - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrow(kBadImageFormatException); @@ -141,12 +137,9 @@ MDImpl3(void, MetaDataImport::GetCustomAttributeProps, mdCustomAttribute cv, mdT HRESULT hr = S_OK; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); IfFailGo(_pScope->GetCustomAttributeProps(cv, ptkType)); IfFailGo(_pScope->GetCustomAttributeAsBlob(cv, (const void **)&ppBlob->m_array, (ULONG *)&ppBlob->m_count)); ErrExit: - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -249,7 +242,6 @@ MDImpl3(void, MetaDataImport::GetClassLayout, mdTypeDef td, DWORD* pdwPackSize, HRESULT hr = S_OK; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); { IMDInternalImport *_pScope = pScope; @@ -276,8 +268,6 @@ MDImpl3(void, MetaDataImport::GetClassLayout, mdTypeDef td, DWORD* pdwPackSize, } } ErrExit: - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -294,7 +284,6 @@ MDImpl3(FC_BOOL_RET, MetaDataImport::GetFieldOffset, mdTypeDef td, mdFieldDef ta MD_CLASS_LAYOUT layout; BOOL retVal = FALSE; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrow(kStackOverflowException)); IfFailGo(_pScope->GetClassLayoutInit(td, &layout)); ULONG cFieldOffset; @@ -314,8 +303,6 @@ MDImpl3(FC_BOOL_RET, MetaDataImport::GetFieldOffset, mdTypeDef td, mdFieldDef ta } } ErrExit: - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrow(kBadImageFormatException); @@ -332,10 +319,7 @@ MDImpl3(void, MetaDataImport::GetUserString, mdToken tk, LPCSTR* pszName, ULONG* IMDInternalImport *_pScope = pScope; BOOL bHasExtendedChars; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetUserString(tk, pCount, &bHasExtendedChars, (LPCWSTR *)pszName); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -350,7 +334,6 @@ MDImpl2(void, MetaDataImport::GetName, mdToken tk, LPCSTR* pszName) HRESULT hr = S_OK; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); if (TypeFromToken(tk) == mdtMethodDef) { hr = _pScope->GetNameOfMethodDef(tk, pszName); @@ -386,7 +369,6 @@ MDImpl2(void, MetaDataImport::GetName, mdToken tk, LPCSTR* pszName) { hr = E_FAIL; } - END_SO_INTOLERANT_CODE; if (FAILED(hr)) { @@ -403,9 +385,7 @@ MDImpl2(void, MetaDataImport::GetNamespace, mdToken tk, LPCSTR* pszName) IMDInternalImport *_pScope = pScope; LPCSTR szName = NULL; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetNameOfTypeDef(tk, &szName, pszName); - END_SO_INTOLERANT_CODE; if (FAILED(hr)) { @@ -422,10 +402,7 @@ MDImpl2(void, MetaDataImport::GetGenericParamProps, mdToken tk, DWORD* pAttribut HRESULT hr; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetGenericParamProps(tk, NULL, pAttributes, NULL, NULL, NULL); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -440,10 +417,7 @@ MDImpl3(void, MetaDataImport::GetEventProps, mdToken tk, LPCSTR* pszName, INT32 HRESULT hr; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetEventProps(tk, pszName, (DWORD*)pdwEventFlags, NULL); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -459,7 +433,6 @@ MDImpl4(void, MetaDataImport::GetPinvokeMap, mdToken tk, DWORD* pMappingFlags, L IMDInternalImport *_pScope = pScope; mdModule tkModule; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetPinvokeMap(tk, pMappingFlags, pszImportName, &tkModule); if (FAILED(hr)) { @@ -472,7 +445,6 @@ MDImpl4(void, MetaDataImport::GetPinvokeMap, mdToken tk, DWORD* pMappingFlags, L { hr = _pScope->GetModuleRefProps(tkModule, pszImportDll); } - END_SO_INTOLERANT_CODE; if (FAILED(hr)) { @@ -489,8 +461,6 @@ MDImpl3(void, MetaDataImport::GetParamDefProps, mdToken tk, INT32* pSequence, IN IMDInternalImport *_pScope = pScope; USHORT usSequence = 0; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); - // Is this a valid token? if (_pScope->IsValidToken((mdParamDef)tk)) { @@ -503,7 +473,6 @@ MDImpl3(void, MetaDataImport::GetParamDefProps, mdToken tk, INT32* pSequence, IN hr = COR_E_BADIMAGEFORMAT; } *pSequence = (INT32) usSequence; - END_SO_INTOLERANT_CODE; if (FAILED(hr)) { @@ -519,10 +488,7 @@ MDImpl2(void, MetaDataImport::GetFieldDefProps, mdToken tk, INT32 *pdwFieldFlags HRESULT hr; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetFieldDefProps(tk, (DWORD *)pdwFieldFlags); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -537,10 +503,7 @@ MDImpl4(void, MetaDataImport::GetPropertyProps, mdToken tk, LPCSTR* pszName, INT HRESULT hr; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetPropertyProps(tk, pszName, (DWORD*)pdwPropertyFlags, (PCCOR_SIGNATURE*)&ppValue->m_array, (ULONG*)&ppValue->m_count); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -555,7 +518,6 @@ MDImpl2(void, MetaDataImport::GetFieldMarshal, mdToken tk, ConstArray* ppValue) HRESULT hr; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetFieldMarshal(tk, (PCCOR_SIGNATURE *)&ppValue->m_array, (ULONG *)&ppValue->m_count); if (hr == CLDB_E_RECORD_NOTFOUND) { @@ -563,7 +525,6 @@ MDImpl2(void, MetaDataImport::GetFieldMarshal, mdToken tk, ConstArray* ppValue) ppValue->m_count = 0; hr = S_OK; } - END_SO_INTOLERANT_CODE; if (FAILED(hr)) { @@ -579,10 +540,7 @@ MDImpl2(void, MetaDataImport::GetSigOfMethodDef, mdToken tk, ConstArray* ppValue HRESULT hr; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE(GetThread()) hr = _pScope->GetSigOfMethodDef(tk, (ULONG*)&ppValue->m_count, (PCCOR_SIGNATURE *)&ppValue->m_array); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -597,10 +555,7 @@ MDImpl2(void, MetaDataImport::GetSignatureFromToken, mdToken tk, ConstArray* ppV HRESULT hr; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetSigFromToken(tk, (ULONG*)&ppValue->m_count, (PCCOR_SIGNATURE *)&(ppValue->m_array)); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -615,10 +570,7 @@ MDImpl2(void, MetaDataImport::GetSigOfFieldDef, mdToken tk, ConstArray* ppValue) HRESULT hr; IMDInternalImport *_pScope = pScope; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetSigOfFieldDef(tk, (ULONG*)&ppValue->m_count, (PCCOR_SIGNATURE *)&ppValue->m_array); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -632,8 +584,6 @@ MDImpl2(void, MetaDataImport::GetParentToken, mdToken tk, mdToken* ptk) HRESULT hr; IMDInternalImport *_pScope = pScope; - - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); switch (TypeFromToken(tk)) { @@ -666,8 +616,6 @@ MDImpl2(void, MetaDataImport::GetParentToken, mdToken tk, mdToken* ptk) break; } - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -682,11 +630,8 @@ MDImpl1(void, MetaDataImport::GetScopeProps, GUID* pmvid) HRESULT hr; LPCSTR szName; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); IMDInternalImport *_pScope = pScope; hr = _pScope->GetScopeProps(&szName, pmvid); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); @@ -705,10 +650,7 @@ MDImpl2(void, MetaDataImport::GetMemberRefProps, IMDInternalImport *_pScope = pScope; LPCSTR szName_Ignore; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrowVoid(kStackOverflowException)); hr = _pScope->GetNameAndSigOfMemberRef(mr, (PCCOR_SIGNATURE*)&ppvSigBlob->m_array, (ULONG*)&ppvSigBlob->m_count, &szName_Ignore); - END_SO_INTOLERANT_CODE; - if (FAILED(hr)) { FCThrowVoid(kBadImageFormatException); diff --git a/src/vm/marshalnative.cpp b/src/vm/marshalnative.cpp index 95ff46001a..6e71c085d4 100644 --- a/src/vm/marshalnative.cpp +++ b/src/vm/marshalnative.cpp @@ -771,7 +771,6 @@ FCIMPL1(int, MarshalNative::GetHRForException, Object* eUNSAFE) NOTHROW; // Used by reverse COM IL stubs, so we must not throw exceptions back to COM DISABLED(GC_TRIGGERS); // FCALLS with HELPER frames have issues with GC_TRIGGERS MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; int retVal = 0; @@ -791,7 +790,6 @@ FCIMPL1(int, MarshalNative::GetHRForException_WinRT, Object* eUNSAFE) NOTHROW; // Used by reverse COM IL stubs, so we must not throw exceptions back to COM DISABLED(GC_TRIGGERS); // FCALLS with HELPER frames have issues with GC_TRIGGERS MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; int retVal = 0; diff --git a/src/vm/mda.h b/src/vm/mda.h index c711e8ae7f..d473cb6c20 100644 --- a/src/vm/mda.h +++ b/src/vm/mda.h @@ -1185,7 +1185,7 @@ private: // Assistant Definitions private: // <xs:*> void DefineSchema() { WRAPPER_NO_CONTRACT; m_tos = m_schemaRootFactory.Create(); } - void DefineSchemaEnd() { CONTRACTL {NOTHROW; GC_NOTRIGGER; SO_TOLERANT; MODE_ANY; PRECONDITION(m_stack.GetDepth() == 0); } CONTRACTL_END; } + void DefineSchemaEnd() { CONTRACTL {NOTHROW; GC_NOTRIGGER; MODE_ANY; PRECONDITION(m_stack.GetDepth() == 0); } CONTRACTL_END; } void AddElement(MdaElemDeclDef name) { WRAPPER_NO_CONTRACT; Push(CreateDeclDef(name, &m_elementFactory)); Push(m_complexTypeFactory.Create()); } void AddElementRefType(MdaElemDeclDef name, MdaElemDeclDef type) { WRAPPER_NO_CONTRACT; AddTerminal(CreateDeclDef(name, &m_elementRefTypeFactory)->InitRef(GetDef(type))); } void AddElementAny(MdaElemDeclDef name) { WRAPPER_NO_CONTRACT; AddTerminal(CreateDeclDef(name, &m_elementAnyFactory)); } diff --git a/src/vm/mdaassistants.cpp b/src/vm/mdaassistants.cpp index eb9a448a3a..4b9a7a9d4d 100644 --- a/src/vm/mdaassistants.cpp +++ b/src/vm/mdaassistants.cpp @@ -32,9 +32,6 @@ //// -// Why is ANYTHING in here marked SO_TOLERANT?? Presumably some of them are called from managed code???? - - // // MdaFramework // @@ -45,7 +42,6 @@ void MdaFramework::DumpDiagnostics() THROWS; GC_TRIGGERS; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -83,7 +79,6 @@ void MdaFramework::Initialize(MdaXmlElement* pXmlInput) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -129,12 +124,9 @@ void TriggerGCForMDAInternal() NOTHROW; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), return); - EX_TRY { GCHeapUtilities::GetGCHeap()->GarbageCollect(); @@ -158,8 +150,6 @@ void TriggerGCForMDAInternal() // Caller cannot take exceptions. } EX_END_CATCH(SwallowAllExceptions); - - END_SO_INTOLERANT_CODE; } // @@ -187,7 +177,6 @@ void MdaCallbackOnCollectedDelegate::ReportViolation(MethodDesc* pMD) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -212,7 +201,6 @@ void MdaCallbackOnCollectedDelegate::AddToList(UMEntryThunk* pEntryThunk) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; PRECONDITION(CheckPointer(pEntryThunk)); } CONTRACTL_END; @@ -242,7 +230,6 @@ void MdaCallbackOnCollectedDelegate::ReplaceEntry(int index, UMEntryThunk* pET) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; PRECONDITION((index >= 0) && (index < m_size)); PRECONDITION(CheckPointer(m_pList)); } @@ -272,7 +259,6 @@ void MdaInvalidMemberDeclaration::ReportViolation(ComCallMethodDesc *pCMD, OBJEC NOTHROW; GC_TRIGGERS; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; @@ -333,7 +319,6 @@ void MdaExceptionSwallowedOnCallFromCom::ReportViolation(MethodDesc *pMD, OBJECT NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -377,7 +362,6 @@ void MdaInvalidVariant::ReportViolation() THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -398,7 +382,6 @@ void MdaInvalidIUnknown::ReportViolation() THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -419,7 +402,6 @@ void MdaContextSwitchDeadlock::ReportDeadlock(LPVOID Origin, LPVOID Destination) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -451,7 +433,6 @@ void MdaRaceOnRCWCleanup::ReportViolation() THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -472,7 +453,6 @@ void MdaFailedQI::ReportAdditionalInfo(HRESULT hr, RCW* pRCW, GUID iid, MethodTa THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -545,7 +525,6 @@ HRESULT MdaFailedQIAssistantCallback(LPVOID pData) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pData)); } CONTRACTL_END; @@ -583,7 +562,6 @@ void MdaDisconnectedContext::ReportViolationDisconnected(LPVOID context, HRESULT THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -606,7 +584,6 @@ void MdaDisconnectedContext::ReportViolationCleanup(LPVOID context1, LPVOID cont NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -641,7 +618,6 @@ void MdaInvalidApartmentStateChange::ReportViolation(Thread* pThread, Thread::Ap NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -692,18 +668,13 @@ void MdaDllMainReturnsFalse::ReportError() THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), return); - MdaXmlElement* pXml; MdaXmlMessage msg(this->AsMdaAssistant(), TRUE, &pXml); msg.SendMessagef(MDARC_DLLMAIN_RETURNS_FALSE); - - END_SO_INTOLERANT_CODE; } // @@ -716,7 +687,6 @@ void MdaOverlappedFreeError::ReportError(LPVOID pOverlapped) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -749,7 +719,6 @@ Return Flags Mda_##Name Args { \ THROWS; \ GC_TRIGGERS; \ - SO_TOLERANT; \ MODE_ANY; \ } \ CONTRACTL_END; \ @@ -779,8 +748,6 @@ void MdaInvalidOverlappedToPinvoke::Initialize(MdaXmlElement* pXmlInput) } CONTRACTL_END; -// TODO: CONTRACT_VIOLATION(SOToleranceViolation); - m_entries = PInvokeTable; m_entryCount = sizeof(PInvokeTable) / sizeof(pinvoke_entry); m_bJustMyCode = pXmlInput->GetAttributeValueAsBool(MdaAttrDecl(JustMyCode)); @@ -793,7 +760,6 @@ BOOL MdaInvalidOverlappedToPinvoke::InitializeModuleFunctions(HINSTANCE hmod) THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -802,8 +768,6 @@ BOOL MdaInvalidOverlappedToPinvoke::InitializeModuleFunctions(HINSTANCE hmod) BOOL bFoundSomething = FALSE; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), return FALSE); - SString moduleNameFullPath, moduleName; ClrGetModuleFileNameNoThrow(hmod,moduleNameFullPath); // Strip any path info @@ -829,8 +793,6 @@ BOOL MdaInvalidOverlappedToPinvoke::InitializeModuleFunctions(HINSTANCE hmod) } } - END_SO_INTOLERANT_CODE; - return bFoundSomething; } @@ -841,7 +803,6 @@ LPVOID MdaInvalidOverlappedToPinvoke::CheckOverlappedPointer(UINT index, LPVOID THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -858,10 +819,6 @@ LPVOID MdaInvalidOverlappedToPinvoke::CheckOverlappedPointer(UINT index, LPVOID // Is the overlapped pointer in the gc heap? if (pOverlapped != NULL) { - // If a stack overflow occurs, we would just want to continue and - // return the function pointer as expected. - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), return pEntry->m_realFunction); - BOOL fHeapPointer; { @@ -881,8 +838,6 @@ LPVOID MdaInvalidOverlappedToPinvoke::CheckOverlappedPointer(UINT index, LPVOID pEntry->m_functionName, pEntry->m_moduleName); } - - END_SO_INTOLERANT_CODE; } return pEntry->m_realFunction; @@ -904,7 +859,6 @@ LPVOID MdaInvalidOverlappedToPinvoke::Register(HINSTANCE hmod,LPVOID pvTarget) THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -956,7 +910,6 @@ BOOL MdaPInvokeLog::Filter(SString& sszDllName) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -984,7 +937,6 @@ void MdaPInvokeLog::LogPInvoke(NDirectMethodDesc* pMD, HINSTANCE hMod) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1040,7 +992,6 @@ void MdaPInvokeStackImbalance::CheckStack(StackImbalanceCookie *pSICookie, DWORD THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -1099,8 +1050,6 @@ void MdaPInvokeStackImbalance::CheckStack(StackImbalanceCookie *pSICookie, DWORD if (!bStackImbalance) return; - BEGIN_SO_INTOLERANT_CODE(GetThread()); - MdaXmlElement* pXml; MdaXmlMessage msg(this->AsMdaAssistant(), TRUE, &pXml); MdaXmlElement* pMethod = pXml->AddChild(MdaElemDecl(Method)); @@ -1108,8 +1057,6 @@ void MdaPInvokeStackImbalance::CheckStack(StackImbalanceCookie *pSICookie, DWORD StackSString sszMethodName; msg.SendMessagef(MDARC_PINVOKE_SIGNATURE_MISMATCH, AsMdaAssistant()->ToString(sszMethodName, pSICookie->m_pMD).GetUnicode()); - - END_SO_INTOLERANT_CODE; } #endif @@ -1124,7 +1071,6 @@ void MdaJitCompilationStart::Initialize(MdaXmlElement* pXmlInput) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1146,7 +1092,6 @@ void MdaJitCompilationStart::NowCompiling(MethodDesc* pMD) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1172,7 +1117,6 @@ void MdaLoadFromContext::NowLoading(IAssembly** ppIAssembly, StackCrawlMark *pCa THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1234,7 +1178,6 @@ void MdaBindingFailure::BindFailed(AssemblySpec *pSpec, OBJECTREF *pExceptionObj THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1339,7 +1282,6 @@ void MdaMemberInfoCacheCreation::MemberInfoCacheCreation() THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1435,7 +1377,6 @@ void MdaInvalidGCHandleCookie::ReportError(LPVOID cookie) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1452,7 +1393,6 @@ void MdaStreamWriterBufferedDataLost::ReportError(SString text) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1473,7 +1413,6 @@ void MdaNotMarshalable::ReportViolation() THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1494,7 +1433,6 @@ void MdaMarshalCleanupError::ReportErrorThreadCulture(OBJECTREF *pExceptionObj) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1522,7 +1460,6 @@ void MdaMarshalCleanupError::ReportErrorSafeHandleRelease(OBJECTREF *pExceptionO NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1550,7 +1487,6 @@ void MdaMarshalCleanupError::ReportErrorSafeHandleProp(OBJECTREF *pExceptionObj) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1578,7 +1514,6 @@ void MdaMarshalCleanupError::ReportErrorCustomMarshalerCleanup(TypeHandle typeCu NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1614,7 +1549,6 @@ void MdaMarshaling::Initialize(MdaXmlElement* pXmlInput) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1637,7 +1571,6 @@ void MdaMarshaling::ReportFieldMarshal(FieldMarshaler* pFM) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; PRECONDITION(CheckPointer(pFM)); } CONTRACTL_END; @@ -1671,7 +1604,6 @@ void MdaMarshaling::GetManagedSideForField(SString& strManagedMarshalType, Field THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1718,7 +1650,6 @@ void MdaMarshaling::GetUnmanagedSideForField(SString& strUnmanagedMarshalType, F THROWS; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1733,7 +1664,6 @@ void MdaMarshaling::GetManagedSideForMethod(SString& strManagedMarshalType, Modu THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1768,7 +1698,6 @@ void MdaMarshaling::GetUnmanagedSideForMethod(SString& strNativeMarshalType, Mar THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1782,7 +1711,6 @@ BOOL MdaMarshaling::CheckForPrimitiveType(CorElementType elemType, SString& strP THROWS; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; INJECT_FAULT(COMPlusThrowOM()); } CONTRACTL_END; @@ -1854,13 +1782,9 @@ void MdaLoaderLock::ReportViolation(HINSTANCE hInst) NOTHROW; GC_TRIGGERS; MODE_ANY; - // Called from SO_TOLERANT CODE - SO_TOLERANT; } CONTRACTL_END; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), return); - EX_TRY { MdaXmlElement* pXml; @@ -1887,8 +1811,6 @@ void MdaLoaderLock::ReportViolation(HINSTANCE hInst) // Caller cannot take exceptions. } EX_END_CATCH(SwallowAllExceptions); - - END_SO_INTOLERANT_CODE; } @@ -1902,12 +1824,9 @@ void MdaReentrancy::ReportViolation() NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), return); - EX_TRY { MdaXmlElement* pXml; @@ -1920,8 +1839,6 @@ void MdaReentrancy::ReportViolation() // Caller cannot take exceptions. } EX_END_CATCH(SwallowAllExceptions); - - END_SO_INTOLERANT_CODE; } // @@ -1934,7 +1851,6 @@ void MdaAsynchronousThreadAbort::ReportViolation(Thread *pCallingThread, Thread NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1966,7 +1882,6 @@ void MdaDangerousThreadingAPI::ReportViolation(__in_z WCHAR *apiName) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -1988,7 +1903,6 @@ void MdaReportAvOnComRelease::ReportHandledException(RCW* pRCW) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2024,7 +1938,6 @@ void MdaInvalidFunctionPointerInDelegate::ReportViolation(LPVOID pFunc) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2045,7 +1958,6 @@ void MdaDirtyCastAndCallOnInterface::ReportViolation(IUnknown* pUnk) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2065,7 +1977,6 @@ void MdaFatalExecutionEngineError::ReportFEEE(TADDR addrOfError, HRESULT hrError NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2096,7 +2007,6 @@ void MdaInvalidCERCall::ReportViolation(MethodDesc* pCallerMD, MethodDesc *pCall THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2122,7 +2032,6 @@ void MdaVirtualCERCall::ReportViolation(MethodDesc* pCallerMD, MethodDesc *pCall THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2148,7 +2057,6 @@ void MdaOpenGenericCERCall::ReportViolation(MethodDesc* pMD) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2172,7 +2080,6 @@ void MdaIllegalPrepareConstrainedRegion::ReportViolation(MethodDesc* pMD, DWORD THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2196,7 +2103,6 @@ void MdaReleaseHandleFailed::ReportViolation(TypeHandle th, LPVOID lpvHandle) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2226,7 +2132,6 @@ void MdaNonComVisibleBaseClass::ReportViolation(MethodTable *pMT, BOOL fForIDisp THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -2270,7 +2175,6 @@ void MdaXmlValidationError::ReportError(MdaSchema::ValidationResult* pValidation GC_TRIGGERS; MODE_ANY; DEBUG_ONLY; - SO_NOT_MAINLINE; } CONTRACTL_END; PRECONDITION(CheckPointer(pValidationResult->m_pViolatingElement)); @@ -2298,7 +2202,6 @@ void MdaInvalidConfigFile::ReportError(MdaElemDeclDef configFile) GC_TRIGGERS; MODE_ANY; DEBUG_ONLY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2322,7 +2225,6 @@ void MdaDateTimeInvalidLocalFormat::ReportError() GC_TRIGGERS; MODE_ANY; DEBUG_ONLY; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/memberload.cpp b/src/vm/memberload.cpp index da026b1c5b..03081e3f03 100644 --- a/src/vm/memberload.cpp +++ b/src/vm/memberload.cpp @@ -37,7 +37,6 @@ #include "dllimportcallback.h" #include "listlock.h" #include "methodimpl.h" -#include "stackprobe.h" #include "encee.h" #include "comsynchronizable.h" #include "customattribute.h" diff --git a/src/vm/method.cpp b/src/vm/method.cpp index 00df9d2d28..69849f3a9f 100644 --- a/src/vm/method.cpp +++ b/src/vm/method.cpp @@ -214,7 +214,6 @@ BaseDomain *MethodDesc::GetDomain() GC_NOTRIGGER; FORBID_FAULT; SUPPORTS_DAC; - SO_TOLERANT; } CONTRACTL_END @@ -257,7 +256,6 @@ LPCUTF8 MethodDesc::GetName() if (FORBIDGC_LOADER_USE_ENABLED()) NOTHROW; else THROWS; // MethodImpl::FindMethodDesc can throw. GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; }CONTRACTL_END; @@ -277,17 +275,12 @@ LPCUTF8 MethodDesc::GetName() { // Get the metadata string name for this method LPCUTF8 result = NULL; - - // This probes only if we have a thread, in which case it is OK to throw the SO. - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(COMPlusThrowSO()); - + if (FAILED(GetMDImport()->GetNameOfMethodDef(GetMemberDef(), &result))) { result = NULL; } - - END_SO_INTOLERANT_CODE; - + return(result); } } @@ -435,7 +428,6 @@ void MethodDesc::GetSig(PCCOR_SIGNATURE *ppSig, DWORD *pcSig) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -479,7 +471,6 @@ void MethodDesc::GetSigFromMetadata(IMDInternalImport * importer, NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -530,7 +521,6 @@ PCODE MethodDesc::GetMethodEntryPoint() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -562,7 +552,6 @@ TADDR MethodDesc::GetAddrOfSlot() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -724,7 +713,6 @@ DWORD MethodDesc::GetNumGenericMethodArgs() NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; CANNOT_TAKE_LOCK; SUPPORTS_DAC; } @@ -747,7 +735,6 @@ MethodTable * MethodDesc::GetExactDeclaringType(MethodTable * ownerOrSubType) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1129,7 +1116,6 @@ ULONG MethodDesc::GetRVA() NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -1239,7 +1225,6 @@ MetaSig::RETURNTYPE MethodDesc::ReturnsObject( if (FORBIDGC_LOADER_USE_ENABLED()) NOTHROW; else THROWS; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END @@ -1389,7 +1374,6 @@ DWORD MethodDesc::GetAttrs() const NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END @@ -1437,7 +1421,6 @@ Module* MethodDesc::GetZapModule() NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -1496,7 +1479,6 @@ Module *MethodDesc::GetModule() const STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; SUPPORTS_DAC; g_IBCLogger.LogMethodDescAccess(this); @@ -1511,7 +1493,6 @@ Module *MethodDesc::GetModule_NoLogging() const STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; SUPPORTS_DAC; MethodTable* pMT = GetMethodDescChunk()->GetMethodTable(); @@ -1792,7 +1773,6 @@ MethodDesc* MethodDesc::StripMethodInstantiation() NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; POSTCONDITION(CheckPointer(RETVAL)); } CONTRACT_END @@ -2295,7 +2275,6 @@ BOOL MethodDesc::IsPointingToPrestub() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -4028,7 +4007,6 @@ MethodDesc* MethodDesc::GetMethodDescFromStubAddr(PCODE addr, BOOL fSpeculative { GC_NOTRIGGER; NOTHROW; - SO_TOLERANT; } CONTRACT_END; @@ -4074,7 +4052,6 @@ TADDR MethodDesc::GetFixupList() //******************************************************************************* BOOL MethodDesc::IsRestored_NoLogging() { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; @@ -4105,7 +4082,6 @@ BOOL MethodDesc::IsRestored_NoLogging() BOOL MethodDesc::IsRestored() { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; @@ -4621,7 +4597,6 @@ PCODE MethodDesc::GetTemporaryEntryPoint() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -5606,7 +5581,6 @@ void MethodDesc::WalkValueTypeParameters(MethodTable *pMT, WalkValueTypeParamete { THROWS; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; @@ -5672,7 +5646,6 @@ static void CheckForEquivalenceAndLoadType(Module *pModule, mdToken token, Modul { THROWS; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; diff --git a/src/vm/method.hpp b/src/vm/method.hpp index 92a91c8305..35261eb6bb 100644 --- a/src/vm/method.hpp +++ b/src/vm/method.hpp @@ -833,7 +833,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3693,7 +3692,6 @@ inline BOOL MethodDesc::SanityCheck() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } diff --git a/src/vm/method.inl b/src/vm/method.inl index f72d42f4c8..6b0d8d3557 100644 --- a/src/vm/method.inl +++ b/src/vm/method.inl @@ -69,7 +69,6 @@ inline PTR_LCGMethodResolver DynamicMethodDesc::GetLCGMethodResolver() GC_NOTRIGGER; NOTHROW; PRECONDITION(IsLCGMethod()); - SO_TOLERANT; } CONTRACTL_END; @@ -84,7 +83,6 @@ inline PTR_ILStubResolver DynamicMethodDesc::GetILStubResolver() GC_NOTRIGGER; NOTHROW; PRECONDITION(IsILStub()); - SO_TOLERANT; } CONTRACTL_END; @@ -99,7 +97,6 @@ inline PTR_DynamicMethodDesc MethodDesc::AsDynamicMethodDesc() GC_NOTRIGGER; NOTHROW; PRECONDITION(IsDynamicMethod()); - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; diff --git a/src/vm/methodtable.cpp b/src/vm/methodtable.cpp index ab42626de2..e354dfdfc3 100644 --- a/src/vm/methodtable.cpp +++ b/src/vm/methodtable.cpp @@ -38,7 +38,6 @@ #include "listlock.h" #include "methodimpl.h" #include "guidfromname.h" -#include "stackprobe.h" #include "encee.h" #include "encee.h" #include "comsynchronizable.h" @@ -1335,7 +1334,6 @@ BOOL MethodTable::IsEquivalentTo_Worker(MethodTable *pOtherMT COMMA_INDEBUG(Type THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; // we are called from MethodTable::CanCastToClass } CONTRACTL_END; @@ -1364,13 +1362,7 @@ BOOL MethodTable::IsEquivalentTo_Worker(MethodTable *pOtherMT COMMA_INDEBUG(Type return (GetApproxArrayElementTypeHandle().IsEquivalentTo(pOtherMT->GetApproxArrayElementTypeHandle() COMMA_INDEBUG(&newVisited))); } - BOOL bResult = FALSE; - - BEGIN_SO_INTOLERANT_CODE(GetThread()); - bResult = IsEquivalentTo_WorkerInner(pOtherMT COMMA_INDEBUG(&newVisited)); - END_SO_INTOLERANT_CODE; - - return bResult; + return IsEquivalentTo_WorkerInner(pOtherMT COMMA_INDEBUG(&newVisited)); } //========================================================================================== @@ -1382,7 +1374,6 @@ BOOL MethodTable::IsEquivalentTo_WorkerInner(MethodTable *pOtherMT COMMA_INDEBUG THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; LOADS_TYPE(CLASS_DEPENDENCIES_LOADED); } CONTRACTL_END; @@ -1666,7 +1657,6 @@ BOOL MethodTable::CanCastToNonVariantInterface(MethodTable *pTargetMT) GC_NOTRIGGER; MODE_ANY; INSTANCE_CHECK; - SO_TOLERANT; PRECONDITION(CheckPointer(pTargetMT)); PRECONDITION(pTargetMT->IsInterface()); PRECONDITION(!pTargetMT->HasVariance()); @@ -1691,7 +1681,6 @@ TypeHandle::CastResult MethodTable::CanCastToInterfaceNoGC(MethodTable *pTargetM GC_NOTRIGGER; MODE_ANY; INSTANCE_CHECK; - SO_TOLERANT; PRECONDITION(CheckPointer(pTargetMT)); PRECONDITION(pTargetMT->IsInterface()); PRECONDITION(IsRestored_NoLogging()); @@ -1718,7 +1707,6 @@ TypeHandle::CastResult MethodTable::CanCastToClassNoGC(MethodTable *pTargetMT) GC_NOTRIGGER; MODE_ANY; INSTANCE_CHECK; - SO_TOLERANT; PRECONDITION(CheckPointer(pTargetMT)); PRECONDITION(!pTargetMT->IsArray()); PRECONDITION(!pTargetMT->IsInterface()); @@ -1762,7 +1750,6 @@ MethodTable::IsExternallyVisible() THROWS; MODE_ANY; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; @@ -2023,7 +2010,6 @@ BOOL MethodTable::ImplementsEquivalentInterface(MethodTable *pInterface) { THROWS; GC_TRIGGERS; - SO_TOLERANT; PRECONDITION(pInterface->IsInterface()); // class we are looking up should be an interface } CONTRACTL_END; @@ -2285,7 +2271,6 @@ bool MethodTable::ClassifyEightBytesWithManagedLayout(SystemVStructRegisterPassi { THROWS; GC_TRIGGERS; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -2568,7 +2553,6 @@ bool MethodTable::ClassifyEightBytesWithNativeLayout(SystemVStructRegisterPassin { THROWS; GC_TRIGGERS; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3377,7 +3361,6 @@ void MethodTable::DoRunClassInitThrowing() THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -3391,7 +3374,6 @@ void MethodTable::DoRunClassInitThrowing() Thread *pThread; pThread = GetThread(); _ASSERTE(pThread); - INTERIOR_STACK_PROBE_FOR(pThread, 8); AppDomain *pDomain = GetAppDomain(); @@ -3667,7 +3649,6 @@ void MethodTable::DoRunClassInitThrowing() g_IBCLogger.LogMethodTableAccess(this); Exit: ; - END_INTERIOR_STACK_PROBE; } //========================================================================================== @@ -3677,14 +3658,12 @@ void MethodTable::CheckRunClassInitThrowing() { THROWS; GC_TRIGGERS; - SO_TOLERANT; INJECT_FAULT(COMPlusThrowOM()); PRECONDITION(IsFullyLoaded()); } CONTRACTL_END; { // Debug-only code causes SO volation, so add exception. - CONTRACT_VIOLATION(SOToleranceViolation); CONSISTENCY_CHECK(CheckActivated()); } @@ -3718,7 +3697,6 @@ void MethodTable::CheckRunClassInitAsIfConstructingThrowing() { THROWS; GC_TRIGGERS; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3816,7 +3794,6 @@ static void FastCallFinalize(Object *obj, PCODE funcPtr, BOOL fCriticalCall) STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_INTOLERANT; BEGIN_CALL_TO_MANAGEDEX(fCriticalCall ? EEToManagedCriticalCall : EEToManagedDefault); @@ -5408,7 +5385,6 @@ static void CheckForEquivalenceAndFullyLoadType(Module *pModule, mdToken token, { THROWS; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; @@ -5594,7 +5570,6 @@ void MethodTable::DoFullyLoad(Generics::RecursionGraph * const pVisited, const } - BEGIN_SO_INTOLERANT_CODE(GetThread()); // First ensure that we're loaded to just below CLASS_DEPENDENCIES_LOADED ClassLoader::EnsureLoaded(this, (ClassLoadLevel) (level-1)); @@ -6008,9 +5983,6 @@ void MethodTable::DoFullyLoad(Generics::RecursionGraph * const pVisited, const _ASSERTE(th.IsTypeDesc() && th.IsArray()); _ASSERTE(!(level == CLASS_LOADED && !th.IsFullyLoaded())); } - - END_SO_INTOLERANT_CODE; - #endif //!DACCESS_COMPILE } //MethodTable::DoFullyLoad @@ -7366,7 +7338,6 @@ BOOL MethodTable::FindDefaultInterfaceImplementation( DispatchSlot MethodTable::FindDispatchSlot(UINT32 typeID, UINT32 slotNumber, BOOL throwOnConflict) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; DispatchSlot implSlot(NULL); FindDispatchImpl(typeID, slotNumber, &implSlot, throwOnConflict); return implSlot; @@ -7379,7 +7350,6 @@ DispatchSlot MethodTable::FindDispatchSlot(DispatchToken tok, BOOL throwOnConfli { THROWS; GC_TRIGGERS; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -7463,7 +7433,6 @@ UINT32 MethodTable::LookupTypeID() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -7592,7 +7561,6 @@ MethodDesc * MethodTable::GetIntroducingMethodDesc(DWORD slotNumber) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -7958,7 +7926,6 @@ MethodDesc* MethodTable::GetMethodDescForSlotAddress(PCODE addr, BOOL fSpeculati { GC_NOTRIGGER; NOTHROW; - SO_TOLERANT; POSTCONDITION(CheckPointer(RETVAL, NULL_NOT_OK)); POSTCONDITION(RETVAL->m_pDebugMethodTable.IsNull() || // We must be in BuildMethdTableThrowing() RETVAL->SanityCheck()); @@ -8018,7 +7985,6 @@ BOOL MethodTable::ComputeContainsGenericVariables(Instantiation inst) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -8123,7 +8089,6 @@ MethodDesc * MethodTable::GetClassConstructor() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -8254,7 +8219,6 @@ MethodTable * MethodTable::GetMethodTableMatchingParentClass(MethodTable * pWhic { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(CheckPointer(pWhichParent)); PRECONDITION(IsRestored_NoLogging()); PRECONDITION(pWhichParent->IsRestored_NoLogging()); @@ -8311,7 +8275,6 @@ Instantiation MethodTable::GetInstantiationOfParentClass(MethodTable *pWhichPare CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(CheckPointer(pWhichParent)); PRECONDITION(IsRestored_NoLogging()); PRECONDITION(pWhichParent->IsRestored_NoLogging()); @@ -8891,7 +8854,6 @@ void MethodTable::CheckInitMethodDataCache() CONTRACTL { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; if (s_pMethodDataCache == NULL) { @@ -9425,9 +9387,6 @@ VOID MethodTable::EnsureInstanceActive() if (HasInstantiation()) { - // This is going to go recursive, so we need to use an interior stack probe - - INTERIOR_STACK_PROBE(GetThread()); { Instantiation inst = GetInstantiation(); for (DWORD i = 0; i < inst.GetNumArgs(); i++) @@ -9439,7 +9398,6 @@ VOID MethodTable::EnsureInstanceActive() } } } - END_INTERIOR_STACK_PROBE; } } @@ -9648,7 +9606,6 @@ PCODE MethodTable::GetRestoredSlot(DWORD slotNumber) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -9689,7 +9646,6 @@ MethodTable * MethodTable::GetRestoredSlotMT(DWORD slotNumber) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -9730,7 +9686,6 @@ MethodDesc * MethodTable::GetParallelMethodDesc(MethodDesc * pDefMD) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/methodtable.h b/src/vm/methodtable.h index 20fc5e0003..5842b53e8d 100644 --- a/src/vm/methodtable.h +++ b/src/vm/methodtable.h @@ -1394,7 +1394,6 @@ public: PCODE GetSlot(UINT32 slotNumber) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; CONSISTENCY_CHECK(slotNumber < GetNumVtableSlots()); TADDR pSlot = GetSlotPtrRaw(slotNumber); @@ -1428,7 +1427,6 @@ public: TADDR GetSlotPtrRaw(UINT32 slotNum) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; CONSISTENCY_CHECK(slotNum < GetNumVtableSlots()); if (slotNum < GetNumVirtuals()) @@ -1458,7 +1456,6 @@ public: TADDR GetSlotPtr(UINT32 slotNum) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; // Slots in NGened images are relative pointers CONSISTENCY_CHECK(!IsZapped()); @@ -1968,7 +1965,6 @@ public: // See JIT_IsInstanceOfInterface inline BOOL InstanceRequiresNonTrivialInterfaceCast() { - STATIC_CONTRACT_SO_TOLERANT; LIMITED_METHOD_CONTRACT; return GetFlag(enum_flag_NonTrivialInterfaceCast); @@ -4069,7 +4065,6 @@ public: inline DPTR(TYPE) GETTER() \ { \ LIMITED_METHOD_CONTRACT; \ - STATIC_CONTRACT_SO_TOLERANT; \ _ASSERTE(Has##NAME()); \ return dac_cast<DPTR(TYPE)>(dac_cast<TADDR>(this) + GetOffsetOfOptionalMember(OptionalMember_##NAME)); \ } diff --git a/src/vm/methodtable.inl b/src/vm/methodtable.inl index 70b31c0761..ef302525fc 100644 --- a/src/vm/methodtable.inl +++ b/src/vm/methodtable.inl @@ -598,7 +598,6 @@ inline MethodDesc* MethodTable::GetMethodDescForSlot(DWORD slot) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1545,7 +1544,6 @@ inline BOOL MethodTable::UnBoxInto(void *dest, OBJECTREF src) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -1571,7 +1569,6 @@ inline BOOL MethodTable::UnBoxIntoArg(ArgDestination *argDest, OBJECTREF src) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -1597,7 +1594,6 @@ inline void MethodTable::UnBoxIntoUnchecked(void *dest, OBJECTREF src) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -1624,7 +1620,6 @@ __forceinline TypeHandle::CastResult MethodTable::CanCastToClassOrInterfaceNoGC( GC_NOTRIGGER; MODE_ANY; INSTANCE_CHECK; - SO_TOLERANT; PRECONDITION(CheckPointer(pTargetMT)); PRECONDITION(!pTargetMT->IsArray()); } @@ -1665,7 +1660,6 @@ FORCEINLINE PTR_Module MethodTable::GetGenericsStaticsModuleAndID(DWORD * pID) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -1741,7 +1735,6 @@ FORCEINLINE BOOL MethodTable::ImplementsInterfaceInline(MethodTable *pInterface) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(pInterface->IsInterface()); // class we are looking up should be an interface } CONTRACTL_END; diff --git a/src/vm/methodtablebuilder.cpp b/src/vm/methodtablebuilder.cpp index f9a28fb9a4..ab9e1c55d1 100644 --- a/src/vm/methodtablebuilder.cpp +++ b/src/vm/methodtablebuilder.cpp @@ -502,8 +502,6 @@ MethodTableBuilder::ExpandApproxInheritedInterfaces( { STANDARD_VM_CONTRACT; - INTERIOR_STACK_PROBE(GetThread()); - // Expand interfaces in superclasses first. Interfaces inherited from parents // must have identical indexes as in the parent. bmtRTType * pParentOfParent = pParentType->GetParentType(); @@ -550,8 +548,6 @@ MethodTableBuilder::ExpandApproxInheritedInterfaces( // Restore parent's substitution pParentType->SetSubstitution(parentSubstitution); - - END_INTERIOR_STACK_PROBE; } // MethodTableBuilder::ExpandApproxInheritedInterfaces //******************************************************************************* @@ -1324,10 +1320,6 @@ MethodTableBuilder::BuildMethodTableThrowing( bmtInternal->pType = new (GetStackingAllocator()) bmtMDType(pParent, pModule, cl, bmtGenericsInfo->typeContext); - // put the interior stack probe after all the stack-allocted goop above. We check compare our this pointer to the SP on - // the dtor to determine if we are being called on an EH path or not. - INTERIOR_STACK_PROBE_FOR(GetThread(), 8); - // If not NULL, it means there are some by-value fields, and this contains an entry for each inst #ifdef _DEBUG @@ -2101,8 +2093,6 @@ MethodTableBuilder::BuildMethodTableThrowing( _ASSERTE(pComputedPZM == Module::GetPreferredZapModuleForMethodTable(pMT)); #endif // FEATURE_PREJIT - END_INTERIOR_STACK_PROBE; - return GetHalfBakedMethodTable(); } // MethodTableBuilder::BuildMethodTableThrowing #ifdef _PREFAST_ @@ -11885,7 +11875,6 @@ ClassLoader::CreateTypeHandleForTypeDefThrowing( MethodTable * pMT = NULL; Thread * pThread = GetThread(); - BEGIN_SO_INTOLERANT_CODE_FOR(pThread, DefaultEntryProbeAmount() * 2) MethodTable * pParentMethodTable = NULL; SigPointer parentInst; @@ -12205,6 +12194,5 @@ ClassLoader::CreateTypeHandleForTypeDefThrowing( parentInst, (WORD)cInterfaces); - END_SO_INTOLERANT_CODE; RETURN(TypeHandle(pMT)); } // ClassLoader::CreateTypeHandleForTypeDefThrowing diff --git a/src/vm/mlinfo.cpp b/src/vm/mlinfo.cpp index 32f77cdbb5..e007891aa8 100644 --- a/src/vm/mlinfo.cpp +++ b/src/vm/mlinfo.cpp @@ -3058,7 +3058,6 @@ ILMarshaler* CreateILMarshaler(MarshalInfo::MarshalType mtype, NDirectStubLinker { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/nativeoverlapped.h b/src/vm/nativeoverlapped.h index e1ffb886b6..e1bfd089d9 100644 --- a/src/vm/nativeoverlapped.h +++ b/src/vm/nativeoverlapped.h @@ -44,8 +44,7 @@ public: static OverlappedDataObject* GetOverlapped(LPOVERLAPPED nativeOverlapped) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; - + _ASSERTE (nativeOverlapped != NULL); return (OverlappedDataObject*)OBJECTREFToObject(ObjectFromHandle(((NATIVEOVERLAPPED_AND_HANDLE*)nativeOverlapped)->m_handle)); } @@ -54,7 +53,6 @@ public: static OverlappedDataObject* GetOverlappedForTracing(LPOVERLAPPED nativeOverlapped) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE(nativeOverlapped != NULL); return *(OverlappedDataObject**)(((NATIVEOVERLAPPED_AND_HANDLE*)nativeOverlapped)->m_handle); diff --git a/src/vm/notifyexternals.cpp b/src/vm/notifyexternals.cpp index df1cce4e5b..b6e7fbb8ac 100644 --- a/src/vm/notifyexternals.cpp +++ b/src/vm/notifyexternals.cpp @@ -26,7 +26,6 @@ BOOL ShouldCheckLoaderLock(BOOL fForMDA /*= TRUE*/) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/object.cpp b/src/vm/object.cpp index 87a0cf9890..e008486de0 100644 --- a/src/vm/object.cpp +++ b/src/vm/object.cpp @@ -53,7 +53,6 @@ INT32 Object::GetHashCodeEx() MODE_COOPERATIVE; THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END @@ -146,7 +145,6 @@ TypeHandle Object::GetTrueTypeHandle() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -308,7 +306,6 @@ void Object::DEBUG_SetAppDomain(AppDomain *pDomain) } CONTRACTL_END; - /*_ASSERTE(GetThread()->IsSOTolerant());*/ SetAppDomain(pDomain); } #endif @@ -319,7 +316,6 @@ void Object::SetAppDomain(AppDomain *pDomain) { THROWS; GC_NOTRIGGER; - SO_INTOLERANT; INJECT_FAULT(COMPlusThrowOM();); PRECONDITION(CheckPointer(pDomain)); } @@ -351,7 +347,6 @@ BOOL Object::SetAppDomainNoThrow() { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; } CONTRACTL_END; @@ -377,7 +372,6 @@ AppDomain *Object::GetAppDomain() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -451,7 +445,6 @@ void Object::SetOffsetObjectRef(DWORD dwOffset, size_t dwValue) STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_TOLERANT; OBJECTREF* location; OBJECTREF o; @@ -1062,7 +1055,6 @@ BOOL StringObject::CaseInsensitiveCompHelper(__in_ecount(aLength) WCHAR *strACha PRECONDITION(CheckPointer(strAChars)); PRECONDITION(CheckPointer(strBChars)); PRECONDITION(CheckPointer(result)); - SO_TOLERANT; } CONTRACTL_END; WCHAR *strAStart = strAChars; @@ -1213,7 +1205,6 @@ BOOL StringObject::ValidateHighChars() ==============================================================================*/ BOOL StringObject::HasTrailByte() { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; SyncBlock * pSyncBlock = PassiveGetSyncBlock(); if(pSyncBlock != NULL) @@ -1238,7 +1229,6 @@ BOOL StringObject::GetTrailByte(BYTE *bTrailByte) { { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1282,8 +1272,6 @@ OBJECTREF::OBJECTREF() STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_VIOLATION(SOToleranceViolation); - m_asObj = (Object*)POISONC; Thread::ObjectRefNew(this); } @@ -1298,8 +1286,6 @@ OBJECTREF::OBJECTREF(const OBJECTREF & objref) STATIC_CONTRACT_MODE_COOPERATIVE; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_VIOLATION(SOToleranceViolation); - VALIDATEOBJECT(objref.m_asObj); // !!! If this assert is fired, there are two possibilities: @@ -1333,8 +1319,6 @@ OBJECTREF::OBJECTREF(TADDR nul) STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_VIOLATION(SOToleranceViolation); - //_ASSERTE(nul == 0); m_asObj = (Object*)nul; if( m_asObj != NULL) @@ -1587,7 +1571,6 @@ void* __cdecl GCSafeMemCpy(void * dest, const void * src, size_t len) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; if (!(((*(BYTE**)&dest) < g_lowest_address ) || ((*(BYTE**)&dest) >= g_highest_address))) @@ -1821,7 +1804,6 @@ BOOL Nullable::IsNullableForTypeHelper(MethodTable* nullableMT, MethodTable* par { THROWS; GC_TRIGGERS; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1908,7 +1890,6 @@ BOOL Nullable::UnBox(void* destPtr, OBJECTREF boxedVal, MethodTable* destMT) THROWS; GC_TRIGGERS; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; Nullable* dest = (Nullable*) destPtr; @@ -1966,7 +1947,6 @@ BOOL Nullable::UnBoxNoGC(void* destPtr, OBJECTREF boxedVal, MethodTable* destMT) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; Nullable* dest = (Nullable*) destPtr; @@ -2015,7 +1995,6 @@ BOOL Nullable::UnBoxIntoArgNoGC(ArgDestination *argDest, OBJECTREF boxedVal, Met NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -2072,7 +2051,6 @@ void Nullable::UnBoxNoCheck(void* destPtr, OBJECTREF boxedVal, MethodTable* dest NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; Nullable* dest = (Nullable*) destPtr; @@ -2175,7 +2153,6 @@ void ExceptionObject::SetStackTrace(StackTraceArray const & stackTrace, PTRARRAY GC_NOTRIGGER; NOTHROW; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -2196,7 +2173,6 @@ void ExceptionObject::SetNullStackTrace() GC_NOTRIGGER; NOTHROW; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -2221,7 +2197,6 @@ void ExceptionObject::GetStackTrace(StackTraceArray & stackTrace, PTRARRAYREF * GC_NOTRIGGER; NOTHROW; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/object.h b/src/vm/object.h index dd943ee1be..54ccd4c650 100644 --- a/src/vm/object.h +++ b/src/vm/object.h @@ -785,7 +785,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -1141,7 +1140,6 @@ protected: NOTHROW; MODE_COOPERATIVE; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -1161,7 +1159,6 @@ public: NOTHROW; MODE_COOPERATIVE; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -1176,7 +1173,6 @@ public: NOTHROW; MODE_COOPERATIVE; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -1190,7 +1186,6 @@ public: NOTHROW; MODE_COOPERATIVE; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -2262,7 +2257,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; diff --git a/src/vm/object.inl b/src/vm/object.inl index c9b7abd9b0..9652909250 100644 --- a/src/vm/object.inl +++ b/src/vm/object.inl @@ -119,7 +119,6 @@ inline void Object::EnumMemoryRegions(void) FORCEINLINE bool Object::TryEnterObjMonitorSpinHelper() { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -162,7 +161,6 @@ inline /* static */ TypeHandle ArrayBase::GetTypeHandle(MethodTable * pMT) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -182,9 +180,6 @@ inline /* static */ TypeHandle ArrayBase::GetTypeHandle(MethodTable * pMT) // if we have allocated an array object of type T then the ArrayTypeDesc // for T[] is available and restored - // @todo This should be turned into a probe with a hard SO when we have one - // See also: ArrayBase::SetArrayMethodTable, ArrayBase::SetArrayMethodTableForLargeObject and MethodTable::DoFullyLoad - CONTRACT_VIOLATION(SOToleranceViolation); // == FailIfNotLoadedOrNotRestored TypeHandle arrayType = ClassLoader::LoadArrayTypeThrowing(pMT->GetApproxArrayElementTypeHandle(), kind, rank, ClassLoader::DontLoadTypes); CONSISTENCY_CHECK(!arrayType.IsNull()); @@ -275,7 +270,6 @@ inline /* static */ unsigned ArrayBase::GetLowerBoundsOffset(MethodTable* pMT) // type is stored in the array or not inline TypeHandle ArrayBase::GetArrayElementTypeHandle() const { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; @@ -329,7 +323,6 @@ inline TypeHandle Object::GetTypeHandle() NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -348,7 +341,6 @@ inline TypeHandle Object::GetGCSafeTypeHandle() const { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/olecontexthelpers.cpp b/src/vm/olecontexthelpers.cpp index 43dc318d78..3e40528770 100644 --- a/src/vm/olecontexthelpers.cpp +++ b/src/vm/olecontexthelpers.cpp @@ -83,7 +83,6 @@ LPVOID GetCurrentCtxCookie() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); } CONTRACT_END; @@ -113,7 +112,6 @@ HRESULT GetCurrentThreadTypeNT5(THDTYPE* pType) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(pType)); } CONTRACTL_END; diff --git a/src/vm/olevariant.cpp b/src/vm/olevariant.cpp index c1b047c586..887d4520b6 100644 --- a/src/vm/olevariant.cpp +++ b/src/vm/olevariant.cpp @@ -1112,12 +1112,9 @@ void VariantData::NewVariant(VariantData * const& dest, const CVTypes type, INT6 void SafeVariantClearHelper(_Inout_ VARIANT* pVar) { - STATIC_CONTRACT_SO_INTOLERANT; WRAPPER_NO_CONTRACT; - BEGIN_SO_TOLERANT_CODE(GetThread()); VariantClear(pVar); - END_SO_TOLERANT_CODE; } class OutOfMemoryException; diff --git a/src/vm/packedfields.inl b/src/vm/packedfields.inl index 1c1a043bae..5ceb5522bd 100644 --- a/src/vm/packedfields.inl +++ b/src/vm/packedfields.inl @@ -99,7 +99,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -196,7 +195,6 @@ public: GC_NOTRIGGER; MODE_ANY; SUPPORTS_DAC; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/pefile.cpp b/src/vm/pefile.cpp index cd18037047..9f3c358e16 100644 --- a/src/vm/pefile.cpp +++ b/src/vm/pefile.cpp @@ -553,7 +553,6 @@ CHECK PEFile::CheckLoaded(BOOL bAllowNativeSkip/*=TRUE*/) INSTANCE_CHECK; NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACT_CHECK_END; @@ -791,7 +790,6 @@ void PEFile::ConvertMetadataToRWForEnC() { THROWS; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1099,7 +1097,6 @@ LPCWSTR CorCompileGetRuntimeDllName(CorCompileRuntimeDlls id) THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; INJECT_FAULT(COMPlusThrowOM();); } CONTRACTL_END; @@ -1124,7 +1121,6 @@ extern HMODULE CorCompileGetRuntimeDll(CorCompileRuntimeDlls id) THROWS; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; INJECT_FAULT(COMPlusThrowOM();); } CONTRACTL_END; diff --git a/src/vm/pefile.inl b/src/vm/pefile.inl index 38b155ffac..75f87931ab 100644 --- a/src/vm/pefile.inl +++ b/src/vm/pefile.inl @@ -198,7 +198,6 @@ inline const SString &PEFile::GetPath() NOTHROW; CANNOT_TAKE_LOCK; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -404,7 +403,6 @@ inline IMDInternalImport *PEFile::GetMDImportWithRef() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_INTOLERANT; } CONTRACT_END; */ @@ -421,7 +419,6 @@ inline IMDInternalImport *PEFile::GetMDImportWithRef() WRAPPER(GC_TRIGGERS); MODE_ANY; CAN_TAKE_LOCK; - SO_INTOLERANT; } CONTRACTL_END; @@ -664,7 +661,6 @@ inline void PEFile::MarkNativeImageInvalidIfOwned() inline BOOL PEFile::IsILOnly() { - STATIC_CONTRACT_SO_TOLERANT; WRAPPER_NO_CONTRACT; SUPPORTS_DAC; @@ -685,8 +681,6 @@ inline BOOL PEFile::IsILOnly() { BOOL retVal = FALSE; - BEGIN_SO_INTOLERANT_CODE(GetThread()); - //don't want to touch the IL image unless we already have ReleaseHolder<PEImage> pNativeImage = GetNativeImageWithRef(); if (pNativeImage) @@ -694,8 +688,6 @@ inline BOOL PEFile::IsILOnly() retVal = pNativeImage->IsNativeILILOnly(); } - END_SO_INTOLERANT_CODE; - return retVal; } #endif // DACCESS_COMPILE @@ -1079,7 +1071,6 @@ inline BOOL PEFile::IsPtrInILImage(PTR_CVOID data) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -1117,7 +1108,6 @@ inline BOOL PEFile::HasNativeImage() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; CANNOT_TAKE_LOCK; SUPPORTS_DAC; } @@ -1138,7 +1128,6 @@ inline BOOL PEFile::HasNativeOrReadyToRunImage() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; CANNOT_TAKE_LOCK; SUPPORTS_DAC; } @@ -1170,7 +1159,6 @@ inline BOOL PEFile::IsLoaded(BOOL bAllowNative/*=TRUE*/) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1201,7 +1189,6 @@ inline PTR_PEImageLayout PEFile::GetLoadedNative() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } @@ -1230,7 +1217,6 @@ inline PEImage *PEFile::GetPersistentNativeImage() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; CANNOT_TAKE_LOCK; SUPPORTS_DAC; } @@ -1267,7 +1253,6 @@ inline BOOL PEFile::HasNativeImageMetadata() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACT_END; diff --git a/src/vm/peimage.cpp b/src/vm/peimage.cpp index 838540844e..7d08e46581 100644 --- a/src/vm/peimage.cpp +++ b/src/vm/peimage.cpp @@ -41,7 +41,6 @@ void PEImage::Startup() THROWS; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; POSTCONDITION(CheckStartup()); INJECT_FAULT(COMPlusThrowOM();); } @@ -50,8 +49,6 @@ void PEImage::Startup() if (CheckStartup()) RETURN; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(COMPlusThrowSO()); - s_hashLock.Init(CrstPEImage, (CrstFlags)(CRST_REENTRANCY|CRST_TAKEN_DURING_SHUTDOWN)); LockOwner lock = { &s_hashLock, IsOwnerOfCrst }; s_Images = ::new PtrHashMap; @@ -68,7 +65,6 @@ void PEImage::Startup() #else // FEATURE_USE_LCID g_lcid = NULL; // invariant #endif //FEATURE_USE_LCID - END_SO_INTOLERANT_CODE; RETURN; } @@ -994,7 +990,6 @@ PTR_PEImageLayout PEImage::GetLayout(DWORD imageLayoutMask,DWORD flags) PTR_PEImageLayout pRetVal; #ifndef DACCESS_COMPILE - BEGIN_SO_INTOLERANT_CODE(GetThread()); // First attempt to find an existing layout matching imageLayoutMask. If that fails, // and the caller has asked us to create layouts if needed, then try again passing // the create flag to GetLayoutInternal. We need this to be synchronized, but the common @@ -1010,8 +1005,7 @@ PTR_PEImageLayout PEImage::GetLayout(DWORD imageLayoutMask,DWORD flags) SimpleWriteLockHolder lock(m_pLayoutLock); pRetVal = GetLayoutInternal(imageLayoutMask,flags); } - END_SO_INTOLERANT_CODE; - + return pRetVal; #else @@ -1475,7 +1469,6 @@ BOOL PEImage::IsPtrInImage(PTR_CVOID data) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; diff --git a/src/vm/peimage.inl b/src/vm/peimage.inl index 2e7fd73f07..156dae67d6 100644 --- a/src/vm/peimage.inl +++ b/src/vm/peimage.inl @@ -29,7 +29,6 @@ inline ULONG PEImage::AddRef() inline const SString &PEImage::GetPath() { LIMITED_METHOD_DAC_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return m_path; } @@ -37,7 +36,6 @@ inline const SString &PEImage::GetPath() inline void PEImage::SetModuleFileNameHintForDAC() { LIMITED_METHOD_DAC_CONTRACT; - STATIC_CONTRACT_SO_INTOLERANT; // Grab module name only for triage dumps where full paths are excluded // because may contain PII data. diff --git a/src/vm/peimagelayout.inl b/src/vm/peimagelayout.inl index f9a5215e31..5153d14715 100644 --- a/src/vm/peimagelayout.inl +++ b/src/vm/peimagelayout.inl @@ -106,7 +106,6 @@ inline BOOL PEImageLayout::CompareBase(UPTR base, UPTR mapping) { PRECONDITION(CheckPointer((PEImageLayout *)mapping)); PRECONDITION(CheckPointer((PEImageLayout *)(base<<1),NULL_OK)); - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_ANY; diff --git a/src/vm/precode.cpp b/src/vm/precode.cpp index 649fd1dd7f..f0e005adb5 100644 --- a/src/vm/precode.cpp +++ b/src/vm/precode.cpp @@ -110,7 +110,6 @@ MethodDesc* Precode::GetMethodDesc(BOOL fSpeculative /*= FALSE*/) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -167,7 +166,6 @@ BOOL Precode::IsCorrectMethodDesc(MethodDesc * pMD) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -198,7 +196,6 @@ BOOL Precode::IsPointingToPrestub(PCODE target) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -234,7 +231,6 @@ PCODE Precode::TryToSkipFixupPrecode(PCODE addr) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; PCODE pTarget = NULL; diff --git a/src/vm/prestub.cpp b/src/vm/prestub.cpp index 5c08becafa..f1d4851ca2 100644 --- a/src/vm/prestub.cpp +++ b/src/vm/prestub.cpp @@ -280,7 +280,6 @@ void DACNotifyCompilationFinished(MethodDesc *methodDesc, PCODE pCode) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_PREEMPTIVE; } CONTRACTL_END; diff --git a/src/vm/profattach.cpp b/src/vm/profattach.cpp index 52c8caff8f..9064fd9933 100644 --- a/src/vm/profattach.cpp +++ b/src/vm/profattach.cpp @@ -62,7 +62,6 @@ HRESULT ProfilingAPIAttachDetach::OverlappedResultHolder::Initialize() { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1161,7 +1160,6 @@ HRESULT CLRProfilingImpl::AttachProfiler(DWORD dwProfileeProcessID, GC_TRIGGERS; MODE_PREEMPTIVE; CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/profattachclient.cpp b/src/vm/profattachclient.cpp index a389ec3152..45370176ee 100644 --- a/src/vm/profattachclient.cpp +++ b/src/vm/profattachclient.cpp @@ -62,10 +62,6 @@ extern "C" HRESULT STDMETHODCALLTYPE AttachProfiler( GC_TRIGGERS; MODE_PREEMPTIVE; CAN_TAKE_LOCK; - - // This is the entrypoint into the EE by a trigger process. As such, this - // is profiling-specific and not considered mainline EE code. - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/profilingenumerators.cpp b/src/vm/profilingenumerators.cpp index 14305bdd5d..0b41bff568 100644 --- a/src/vm/profilingenumerators.cpp +++ b/src/vm/profilingenumerators.cpp @@ -45,7 +45,6 @@ BOOL ProfilerFunctionEnum::Init(BOOL fWithReJITIDs) // reader lock to prevent things from changing while reading... CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; EEJitManager::CodeHeapIterator heapIterator; @@ -166,8 +165,6 @@ HRESULT IterateAppDomains(CallbackObject * callbackObj, MODE_ANY; CAN_TAKE_LOCK; // (See comments in code:ProfToEEInterfaceImpl::EnumModules for info about contracts.) - - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -475,7 +472,6 @@ HRESULT ProfilerModuleEnum::Init() CAN_TAKE_LOCK; // (See comments in code:ProfToEEInterfaceImpl::EnumModules for info about contracts.) - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -533,7 +529,6 @@ HRESULT IterateAppDomainContainingModule::AddAppDomainContainingModule(AppDomain GC_TRIGGERS; MODE_ANY; CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -571,7 +566,6 @@ HRESULT IterateAppDomainContainingModule::PopulateArray() GC_TRIGGERS; MODE_ANY; CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -600,7 +594,6 @@ HRESULT ProfilerThreadEnum::Init() GC_NOTRIGGER; MODE_ANY; CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/profilingenumerators.h b/src/vm/profilingenumerators.h index 479345c8ab..e10d5e686a 100644 --- a/src/vm/profilingenumerators.h +++ b/src/vm/profilingenumerators.h @@ -318,7 +318,6 @@ ProfilerEnum< EnumInterface, Element >::GetCount(ULONG* count) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -363,7 +362,6 @@ ProfilerEnum< EnumInterface, Element >::Skip(ULONG count) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -403,7 +401,6 @@ ProfilerEnum< EnumInterface, Element >::Reset() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -436,7 +433,6 @@ ProfilerEnum< EnumInterface, Element >::Clone(EnumInterface** pInterface) GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/profilinghelper.cpp b/src/vm/profilinghelper.cpp index 8452eb8d65..ba410b1a70 100644 --- a/src/vm/profilinghelper.cpp +++ b/src/vm/profilinghelper.cpp @@ -165,7 +165,6 @@ BOOL CORProfilerBypassSecurityChecks() NOTHROW; GC_NOTRIGGER; CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/profilinghelper.inl b/src/vm/profilinghelper.inl index b195a3165e..5fda04cb44 100644 --- a/src/vm/profilinghelper.inl +++ b/src/vm/profilinghelper.inl @@ -38,7 +38,6 @@ FORCEINLINE SetCallbackStateFlagsHolder::~SetCallbackStateFlagsHolder() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -112,7 +111,6 @@ inline void ProfilingAPIUtility::LogNoInterfaceError(REFIID iidRequested, LPCWST { THROWS; GC_TRIGGERS; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -236,7 +234,6 @@ FORCEINLINE void ProfilingAPIUtility::IncEvacuationCounter(Thread * pThread) FORBID_FAULT; MODE_ANY; CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -263,7 +260,6 @@ FORCEINLINE void ProfilingAPIUtility::DecEvacuationCounter(Thread * pThread) FORBID_FAULT; MODE_ANY; CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/proftoeeinterfaceimpl.cpp b/src/vm/proftoeeinterfaceimpl.cpp index 0438bd08f0..f1cf224c1e 100644 --- a/src/vm/proftoeeinterfaceimpl.cpp +++ b/src/vm/proftoeeinterfaceimpl.cpp @@ -45,7 +45,6 @@ // GC_NOTRIGGER // MODE_ANY // CANNOT_TAKE_LOCK -// SO_NOT_MAINLINE // (EE_THREAD_(NOT)_REQUIRED are unenforced and are thus optional. If you wish // to specify these, EE_THREAD_NOT_REQUIRED is preferred.) // Note that the preferred contracts in this file are DIFFERENT than the preferred @@ -331,7 +330,6 @@ static ClassID NonGenericTypeHandleToClassID(TypeHandle th) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; MODE_ANY; @@ -510,7 +508,6 @@ void * STDMETHODCALLTYPE ModuleILHeap::Alloc(ULONG cb) // Yay! MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1106,7 +1103,6 @@ bool HeapWalkHelper(Object * pBO, void * pvContext) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1273,7 +1269,6 @@ void ScanRootsHelper(Object* pObj, Object ** ppRoot, ScanContext *pSC, uint32_t { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1467,7 +1462,6 @@ HRESULT ProfToEEInterfaceImpl::SetEventMask(DWORD dwEventMask) CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1500,7 +1494,6 @@ HRESULT ProfToEEInterfaceImpl::SetEventMask2(DWORD dwEventsLow, DWORD dwEventsHi CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1535,7 +1528,6 @@ HRESULT ProfToEEInterfaceImpl::GetHandleFromThread(ThreadID threadId, HANDLE *ph // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1582,7 +1574,6 @@ HRESULT ProfToEEInterfaceImpl::GetObjectSize(ObjectID objectId, ULONG *pcSize) // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1647,7 +1638,6 @@ HRESULT ProfToEEInterfaceImpl::GetObjectSize2(ObjectID objectId, SIZE_T *pcSize) // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1710,7 +1700,6 @@ HRESULT ProfToEEInterfaceImpl::IsArrayClass( // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1833,7 +1822,6 @@ HRESULT ProfToEEInterfaceImpl::GetThreadInfo(ThreadID threadId, DWORD *pdwWin32T // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1875,7 +1863,6 @@ HRESULT ProfToEEInterfaceImpl::GetCurrentThreadID(ThreadID *pThreadId) // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -1927,7 +1914,6 @@ HRESULT GetFunctionInfoInternal(LPCBYTE ip, EECodeInfo * pCodeInfo) CAN_TAKE_LOCK; CANNOT_RETAKE_LOCK; - SO_NOT_MAINLINE; // If this is called asynchronously (from a hijacked thread, as with F1), it must not re-enter the // host (SQL). Corners will be cut to ensure this is the case @@ -1976,7 +1962,6 @@ HRESULT GetFunctionFromIPInternal(LPCBYTE ip, EECodeInfo * pCodeInfo, BOOL failO MODE_ANY; EE_THREAD_NOT_REQUIRED; CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2027,7 +2012,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionFromIP(LPCBYTE ip, FunctionID * pFunct // this function was called. CANNOT_RETAKE_LOCK; - SO_NOT_MAINLINE; // If this is called asynchronously (from a hijacked thread, as with F1), it must not re-enter the // host (SQL). Corners will be cut to ensure this is the case @@ -2089,7 +2073,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionFromIP2(LPCBYTE ip, FunctionID * pFunc // Grabbing the rejitid requires entering the rejit manager's hash table & lock, CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2154,7 +2137,6 @@ HRESULT ProfToEEInterfaceImpl::GetTokenAndMetaDataFromFunction( // PEFile::GetRWImporter and GetReadablePublicMetaDataInterface take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2256,7 +2238,6 @@ HRESULT GetCodeInfoFromCodeStart( // appropriate jit manager. CAN_TAKE_LOCK; - SO_NOT_MAINLINE; // If this is called asynchronously (from a hijacked thread, as with F1), it must not re-enter the // host (SQL). Corners will be cut to ensure this is the case @@ -2415,7 +2396,6 @@ HRESULT ProfToEEInterfaceImpl::GetCodeInfo(FunctionID functionId, LPCBYTE * pSta // (See locking contract comment in GetCodeInfoHelper.) CANNOT_RETAKE_LOCK; - SO_NOT_MAINLINE; // If this is called asynchronously (from a hijacked thread, as with F1), it must not re-enter the // host (SQL). Corners will be cut to ensure this is the case @@ -2502,7 +2482,6 @@ HRESULT ProfToEEInterfaceImpl::GetCodeInfo2(FunctionID functionId, // (See locking contract comment in GetCodeInfoHelper.) CANNOT_RETAKE_LOCK; - SO_NOT_MAINLINE; // If this is called asynchronously (from a hijacked thread, as with F1), it must not re-enter the // host (SQL). Corners will be cut to ensure this is the case @@ -2570,7 +2549,6 @@ HRESULT ProfToEEInterfaceImpl::GetCodeInfo3(FunctionID functionId, // We need to access the rejitmanager, which means taking locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pcCodeInfos, NULL_OK)); PRECONDITION(CheckPointer(codeInfos, NULL_OK)); @@ -2645,7 +2623,6 @@ HRESULT ProfToEEInterfaceImpl::GetEventMask(DWORD * pdwEvents) // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2683,7 +2660,6 @@ HRESULT ProfToEEInterfaceImpl::GetEventMask2(DWORD *pdwEventsLow, DWORD *pdwEven // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2710,7 +2686,6 @@ void ProfToEEInterfaceImpl::MethodTableCallback(void* context, void* objectUNSAF { NOTHROW; GC_NOTRIGGER; - SO_NOT_MAINLINE; MODE_ANY; } CONTRACTL_END; @@ -2749,7 +2724,6 @@ HRESULT ProfToEEInterfaceImpl::EnumModuleFrozenObjects(ModuleID moduleID, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2812,7 +2786,6 @@ HRESULT ProfToEEInterfaceImpl::GetArrayObjectInfo(ObjectID objectId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2877,7 +2850,6 @@ HRESULT ProfToEEInterfaceImpl::GetArrayObjectInfoHelper(Object * pObj, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -2940,7 +2912,6 @@ HRESULT ProfToEEInterfaceImpl::GetBoxClassLayout(ClassID classId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3002,7 +2973,6 @@ HRESULT ProfToEEInterfaceImpl::GetThreadAppDomain(ThreadID threadId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3078,7 +3048,6 @@ HRESULT ProfToEEInterfaceImpl::GetRVAStaticAddress(ClassID classId, // FieldDesc::GetStaticAddress takes a lock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3204,7 +3173,6 @@ HRESULT ProfToEEInterfaceImpl::GetAppDomainStaticAddress(ClassID classId, // FieldDesc::GetStaticAddress & FieldDesc::GetBaseInDomain take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3351,7 +3319,6 @@ HRESULT ProfToEEInterfaceImpl::GetThreadStaticAddress(ClassID classId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3428,7 +3395,6 @@ HRESULT ProfToEEInterfaceImpl::GetThreadStaticAddress2(ClassID classId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3559,7 +3525,6 @@ HRESULT ProfToEEInterfaceImpl::GetContextStaticAddress(ClassID classId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3614,7 +3579,6 @@ HRESULT ProfToEEInterfaceImpl::GetAppDomainsContainingModule(ModuleID moduleId, // (See comment above GC_TRIGGERS.) CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3694,7 +3658,6 @@ HRESULT ProfToEEInterfaceImpl::GetStaticFieldInfo(ClassID classId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -3801,7 +3764,6 @@ HRESULT ProfToEEInterfaceImpl::GetClassIDInfo2(ClassID classId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pParentClassId, NULL_OK)); PRECONDITION(CheckPointer(pModuleId, NULL_OK)); @@ -3972,7 +3934,6 @@ HRESULT ProfToEEInterfaceImpl::GetModuleInfo(ModuleID moduleId, // Yay! EE_THREAD_NOT_REQUIRED; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer((Module *)moduleId, NULL_OK)); PRECONDITION(CheckPointer(ppBaseLoadAddress, NULL_OK)); @@ -4119,7 +4080,6 @@ HRESULT ProfToEEInterfaceImpl::GetModuleInfo2(ModuleID moduleId, // Yay! EE_THREAD_NOT_REQUIRED; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer((Module *)moduleId, NULL_OK)); PRECONDITION(CheckPointer(ppBaseLoadAddress, NULL_OK)); @@ -4278,7 +4238,6 @@ HRESULT ProfToEEInterfaceImpl::GetModuleMetaData(ModuleID moduleId, // GetReadablePublicMetaDataInterface take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4368,7 +4327,6 @@ HRESULT ProfToEEInterfaceImpl::GetILFunctionBody(ModuleID moduleId, // PEFile::CheckLoaded & Module::GetDynamicIL both take a lock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4498,7 +4456,6 @@ HRESULT ProfToEEInterfaceImpl::GetILFunctionBodyAllocator(ModuleID modul // (see GC_TRIGGERS comment) CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4553,7 +4510,6 @@ HRESULT ProfToEEInterfaceImpl::SetILFunctionBody(ModuleID moduleId, // Module::SetDynamicIL & PEFile::CheckLoaded & PEFile::GetEmitter take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4624,7 +4580,6 @@ HRESULT ProfToEEInterfaceImpl::SetILInstrumentedCodeMap(FunctionID functionId, // Debugger::SetILInstrumentedCodeMap takes a lock when it calls Debugger::GetOrCreateMethodInfo CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4698,7 +4653,6 @@ HRESULT ProfToEEInterfaceImpl::ForceGC() // mother of all locks: the thread store lock. CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4790,7 +4744,6 @@ HRESULT ProfToEEInterfaceImpl::GetThreadContext(ThreadID threadId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4844,7 +4797,6 @@ HRESULT ProfToEEInterfaceImpl::GetClassIDInfo(ClassID classId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -4944,7 +4896,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionInfo(FunctionID functionId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5025,7 +4976,6 @@ HRESULT ProfToEEInterfaceImpl::GetILToNativeMapping(FunctionID functionId, // Debugger::AcquireDebuggerLock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5062,7 +5012,6 @@ HRESULT ProfToEEInterfaceImpl::GetILToNativeMapping2(FunctionID functionId, // Debugger::AcquireDebuggerLock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5152,7 +5101,6 @@ HRESULT ProfToEEInterfaceImpl::GetClassFromObject(ObjectID objectId, // Object::GetTypeHandle takes a lock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5207,7 +5155,6 @@ HRESULT ProfToEEInterfaceImpl::GetClassFromToken(ModuleID moduleId, // ClassLoader::LoadTypeDefOrRefThrowing takes a lock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5304,7 +5251,6 @@ HRESULT ProfToEEInterfaceImpl::GetClassFromTokenAndTypeArgs(ModuleID moduleID, // ClassLoader::LoadGenericInstantiationThrowing takes a lock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5443,7 +5389,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionFromToken(ModuleID moduleId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5535,7 +5480,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionFromTokenAndTypeArgs(ModuleID moduleID // MethodDesc::FindOrCreateAssociatedMethodDesc enters a Crst CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5649,7 +5593,6 @@ HRESULT ProfToEEInterfaceImpl::GetAppDomainInfo(AppDomainID appDomainId, // AppDomain::GetFriendlyNameForDebugger takes a lock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5762,7 +5705,6 @@ HRESULT ProfToEEInterfaceImpl::GetAssemblyInfo(AssemblyID assemblyId, // PEAssembly::GetSimpleName() enters a lock via use of the metadata interface CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5865,7 +5807,6 @@ HRESULT ProfToEEInterfaceImpl::SetEnterLeaveFunctionHooks(FunctionEnter * pFuncE CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5902,7 +5843,6 @@ HRESULT ProfToEEInterfaceImpl::SetEnterLeaveFunctionHooks2(FunctionEnter2 * pFun CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5940,7 +5880,6 @@ HRESULT ProfToEEInterfaceImpl::SetEnterLeaveFunctionHooks3(FunctionEnter3 * pFun CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -5981,7 +5920,6 @@ HRESULT ProfToEEInterfaceImpl::SetEnterLeaveFunctionHooks3WithInfo(FunctionEnter CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6020,7 +5958,6 @@ HRESULT ProfToEEInterfaceImpl::SetFunctionIDMapper(FunctionIDMapper *pFunc) // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6053,7 +5990,6 @@ HRESULT ProfToEEInterfaceImpl::SetFunctionIDMapper2(FunctionIDMapper2 *pFunc, vo // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6122,7 +6058,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionInfo2(FunctionID funcId, // this function was called. CANNOT_RETAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pClassId, NULL_OK)); PRECONDITION(CheckPointer(pModuleId, NULL_OK)); @@ -6342,7 +6277,6 @@ HRESULT ProfToEEInterfaceImpl::IsFunctionDynamic(FunctionID functionId, BOOL *is // this function was called. CANNOT_RETAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(isDynamic, NULL_OK)); } @@ -6418,7 +6352,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionFromIP3(LPCBYTE ip, FunctionID * pFunc // Grabbing the rejitid requires entering the rejit manager's hash table & lock, CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6500,7 +6433,6 @@ HRESULT ProfToEEInterfaceImpl::GetDynamicFunctionInfo(FunctionID functionId, // this function was called. CANNOT_RETAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pModuleId, NULL_OK)); PRECONDITION(CheckPointer(ppvSig, NULL_OK)); @@ -6628,7 +6560,6 @@ HRESULT ProfToEEInterfaceImpl::GetNativeCodeStartAddresses(FunctionID functionID EE_THREAD_NOT_REQUIRED; CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pcCodeStartAddresses, NULL_OK)); PRECONDITION(CheckPointer(codeStartAddresses, NULL_OK)); @@ -6730,7 +6661,6 @@ HRESULT ProfToEEInterfaceImpl::GetILToNativeMapping3(UINT_PTR pNativeCodeStartAd MODE_ANY; CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pcMap, NULL_OK)); PRECONDITION(CheckPointer(map, NULL_OK)); @@ -6796,7 +6726,6 @@ HRESULT ProfToEEInterfaceImpl::GetCodeInfo4(UINT_PTR pNativeCodeStartAddress, EE_THREAD_NOT_REQUIRED; CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pcCodeInfos, NULL_OK)); PRECONDITION(CheckPointer(codeInfos, NULL_OK)); @@ -6855,7 +6784,6 @@ HRESULT ProfToEEInterfaceImpl::GetStringLayout(ULONG *pBufferLengthOffset, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pBufferLengthOffset, NULL_OK)); PRECONDITION(CheckPointer(pStringLengthOffset, NULL_OK)); @@ -6903,7 +6831,6 @@ HRESULT ProfToEEInterfaceImpl::GetStringLayout2(ULONG *pStringLengthOffset, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pStringLengthOffset, NULL_OK)); PRECONDITION(CheckPointer(pBufferOffset, NULL_OK)); @@ -6953,7 +6880,6 @@ HRESULT ProfToEEInterfaceImpl::GetStringLayoutHelper(ULONG *pBufferLengthOffset, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pBufferLengthOffset, NULL_OK)); PRECONDITION(CheckPointer(pStringLengthOffset, NULL_OK)); @@ -7023,7 +6949,6 @@ HRESULT ProfToEEInterfaceImpl::GetClassLayout(ClassID classID, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(rFieldOffset, NULL_OK)); PRECONDITION(CheckPointer(pcFieldOffset)); @@ -7176,7 +7101,6 @@ StackWalkAction ProfilerStackWalkCallback(CrawlFrame *pCf, PROFILER_STACK_WALK_D { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; // throw is RIGHT out... the throw at minimum allocates the thrown object which we *must* not do GC_NOTRIGGER; // the stack is not necessarily crawlable at this state !!!) we must not induce a GC } @@ -7723,7 +7647,6 @@ HRESULT ProfToEEInterfaceImpl::DoStackSnapshot(ThreadID thread, // this function was called. CANNOT_RETAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -8265,7 +8188,6 @@ HRESULT ProfToEEInterfaceImpl::GetGenerationBounds(ULONG cObjectRanges, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pcObjectRanges)); PRECONDITION(cObjectRanges <= 0 || ranges != NULL); @@ -8322,7 +8244,6 @@ HRESULT ProfToEEInterfaceImpl::GetNotifiedExceptionClauseInfo(COR_PRF_EX_CLAUSE_ // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pinfo)); } @@ -8396,7 +8317,6 @@ HRESULT ProfToEEInterfaceImpl::GetObjectGeneration(ObjectID objectId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(objectId != NULL); PRECONDITION(CheckPointer(range)); @@ -8464,7 +8384,6 @@ HRESULT ProfToEEInterfaceImpl::GetReJITIDs( // The rejit tables use a lock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(pcReJitIds, NULL_OK)); PRECONDITION(CheckPointer(reJitIds, NULL_OK)); @@ -8512,7 +8431,6 @@ HRESULT ProfToEEInterfaceImpl::RequestReJIT(ULONG cFunctions, // in // We need to suspend the runtime, this takes a lot of locks! CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(moduleIds, NULL_OK)); PRECONDITION(CheckPointer(methodIds, NULL_OK)); @@ -8568,7 +8486,6 @@ HRESULT ProfToEEInterfaceImpl::RequestRevert(ULONG cFunctions, // in // The rejit manager requires a lock to iterate through methods to revert CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(moduleIds, NULL_OK)); PRECONDITION(CheckPointer(methodIds, NULL_OK)); @@ -8625,7 +8542,6 @@ HRESULT ProfToEEInterfaceImpl::EnumJITedFunctions(ICorProfilerFunctionEnum ** pp // the JIT data structures. CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(ppEnum, NULL_OK)); @@ -8680,7 +8596,6 @@ HRESULT ProfToEEInterfaceImpl::EnumJITedFunctions2(ICorProfilerFunctionEnum ** p // Gathering RejitIDs also takes a lock. CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(ppEnum, NULL_OK)); @@ -8738,7 +8653,6 @@ HRESULT ProfToEEInterfaceImpl::EnumModules(ICorProfilerModuleEnum ** ppEnum) // (See comment above GC_TRIGGERS.) CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(ppEnum, NULL_OK)); @@ -8812,7 +8726,6 @@ HRESULT ProfToEEInterfaceImpl::GetRuntimeInformation(USHORT * pClrInstanceId, // Yay! CANNOT_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -8875,8 +8788,6 @@ HRESULT ProfToEEInterfaceImpl::RequestProfilerDetach(DWORD dwExpectedCompletionM // Crst is used in ProfilingAPIDetach::RequestProfilerDetach CAN_TAKE_LOCK; - - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -8951,7 +8862,6 @@ HRESULT ProfilingGetFunctionEnter3Info(FunctionID functionId, // ProfileArgIterator::ProfileArgIterator may take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9093,7 +9003,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionEnter3Info(FunctionID functionId, // ProfilingGetFunctionEnter3Info may take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9148,7 +9057,6 @@ HRESULT ProfilingGetFunctionLeave3Info(FunctionID functionId, // ProfileArgIterator::ProfileArgIterator may take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9253,7 +9161,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionLeave3Info(FunctionID functionId, // ProfilingGetFunctionLeave3Info may take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9306,7 +9213,6 @@ HRESULT ProfilingGetFunctionTailcall3Info(FunctionID functionId, // ProfileArgIterator::ProfileArgIterator may take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9387,7 +9293,6 @@ HRESULT ProfToEEInterfaceImpl::GetFunctionTailcall3Info(FunctionID functionId, // ProfilingGetFunctionTailcall3Info may take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9424,7 +9329,6 @@ HRESULT ProfToEEInterfaceImpl::EnumThreads( // Need to acquire the thread store lock CAN_TAKE_LOCK; - SO_NOT_MAINLINE; PRECONDITION(CheckPointer(ppEnum, NULL_OK)); @@ -9486,7 +9390,6 @@ HRESULT ProfToEEInterfaceImpl::InitializeCurrentThread() // May take thread store lock and OS APIs may also take locks CAN_TAKE_LOCK; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9531,7 +9434,6 @@ HRESULT ProfToEEInterfaceImpl::EnumNgenModuleMethodsInliningThisMethod( NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_NOT_MAINLINE; CAN_TAKE_LOCK; PRECONDITION(CheckPointer(ppEnum)); } @@ -9619,7 +9521,6 @@ HRESULT ProfToEEInterfaceImpl::GetInMemorySymbolsLength( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9688,7 +9589,6 @@ HRESULT ProfToEEInterfaceImpl::ReadInMemorySymbols( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9763,7 +9663,6 @@ HRESULT ProfToEEInterfaceImpl::ApplyMetaData( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -9810,7 +9709,6 @@ void __stdcall ProfilerManagedToUnmanagedTransitionMD(MethodDesc *pMD, NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -9846,7 +9744,6 @@ void __stdcall ProfilerUnmanagedToManagedTransitionMD(MethodDesc *pMD, NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -10100,7 +9997,6 @@ HCIMPL2(EXTERN_C void, ProfileEnter, UINT_PTR clientData, void * platformSpecifi { FunctionIDOrClientID functionIDOrClientID; functionIDOrClientID.clientID = clientData; - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetEnter3WithInfoHook()( functionIDOrClientID, (COR_PRF_ELT_INFO)&eltInfo); @@ -10130,7 +10026,6 @@ HCIMPL2(EXTERN_C void, ProfileEnter, UINT_PTR clientData, void * platformSpecifi // if (CORProfilerELT2FastPathEnterEnabled()) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetEnter2Hook()( functionId, clientData, @@ -10187,7 +10082,6 @@ HCIMPL2(EXTERN_C void, ProfileEnter, UINT_PTR clientData, void * platformSpecifi HRESULT hr = ProfilingGetFunctionEnter3Info(functionId, (COR_PRF_ELT_INFO)&eltInfo, &frameInfo, &ulArgInfoSize, pArgumentInfo); _ASSERTE(hr == S_OK); - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetEnter2Hook()(functionId, clientData, frameInfo, pArgumentInfo); goto LExit; @@ -10212,7 +10106,6 @@ HCIMPL2(EXTERN_C void, ProfileEnter, UINT_PTR clientData, void * platformSpecifi // Everett ELT // { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetEnterHook()((FunctionID)clientData); } @@ -10276,7 +10169,6 @@ HCIMPL2(EXTERN_C void, ProfileLeave, UINT_PTR clientData, void * platformSpecifi { FunctionIDOrClientID functionIDOrClientID; functionIDOrClientID.clientID = clientData; - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetLeave3WithInfoHook()( functionIDOrClientID, (COR_PRF_ELT_INFO)&eltInfo); @@ -10306,7 +10198,6 @@ HCIMPL2(EXTERN_C void, ProfileLeave, UINT_PTR clientData, void * platformSpecifi // if (CORProfilerELT2FastPathLeaveEnabled()) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetLeave2Hook()( functionId, clientData, @@ -10324,7 +10215,6 @@ HCIMPL2(EXTERN_C void, ProfileLeave, UINT_PTR clientData, void * platformSpecifi HRESULT hr = ProfilingGetFunctionLeave3Info(functionId, (COR_PRF_ELT_INFO)&eltInfo, &frameInfo, &argumentRange); _ASSERTE(hr == S_OK); - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetLeave2Hook()(functionId, clientData, frameInfo, &argumentRange); goto LExit; } @@ -10347,7 +10237,6 @@ HCIMPL2(EXTERN_C void, ProfileLeave, UINT_PTR clientData, void * platformSpecifi // Everett ELT // { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetLeaveHook()((FunctionID)clientData); } @@ -10412,7 +10301,6 @@ HCIMPL2(EXTERN_C void, ProfileTailcall, UINT_PTR clientData, void * platformSpec { FunctionIDOrClientID functionIDOrClientID; functionIDOrClientID.clientID = clientData; - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetTailcall3WithInfoHook()( functionIDOrClientID, (COR_PRF_ELT_INFO)&eltInfo); @@ -10442,7 +10330,6 @@ HCIMPL2(EXTERN_C void, ProfileTailcall, UINT_PTR clientData, void * platformSpec // if (CORProfilerELT2FastPathTailcallEnabled()) { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetTailcall2Hook()( functionId, clientData, @@ -10458,7 +10345,6 @@ HCIMPL2(EXTERN_C void, ProfileTailcall, UINT_PTR clientData, void * platformSpec HRESULT hr = ProfilingGetFunctionTailcall3Info(functionId, (COR_PRF_ELT_INFO)&eltInfo, &frameInfo); _ASSERTE(hr == S_OK); - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; g_profControlBlock.pProfInterface->GetTailcall2Hook()(functionId, clientData, frameInfo); goto LExit; } @@ -10480,10 +10366,7 @@ HCIMPL2(EXTERN_C void, ProfileTailcall, UINT_PTR clientData, void * platformSpec // // Everett ELT // - { - REMOVE_STACK_GUARD_FOR_PROFILER_CALL; - g_profControlBlock.pProfInterface->GetTailcallHook()((FunctionID)clientData); - } + g_profControlBlock.pProfInterface->GetTailcallHook()((FunctionID)clientData); LExit: diff --git a/src/vm/proftoeeinterfaceimpl.inl b/src/vm/proftoeeinterfaceimpl.inl index a2334a2a95..376fad2304 100644 --- a/src/vm/proftoeeinterfaceimpl.inl +++ b/src/vm/proftoeeinterfaceimpl.inl @@ -50,7 +50,6 @@ inline BOOL AreCallbackStateFlagsSet(DWORD dwFlags) MODE_ANY; CANNOT_TAKE_LOCK; EE_THREAD_NOT_REQUIRED; - SO_NOT_MAINLINE; } CONTRACTL_END; diff --git a/src/vm/qcall.h b/src/vm/qcall.h index ccf4c06997..3ad328a2e1 100644 --- a/src/vm/qcall.h +++ b/src/vm/qcall.h @@ -82,7 +82,7 @@ // // BOOL QCALLTYPE FooNative::Bar(int flags, LPCWSTR wszString, QCall::StringHandleOnStack retString) // { -// // All QCalls should have QCALL_CONTRACT. It is alias for THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; SO_TOLERANT. +// // All QCalls should have QCALL_CONTRACT. It is alias for THROWS; GC_TRIGGERS; MODE_PREEMPTIVE. // QCALL_CONTRACT; // // // Optionally, use QCALL_CHECK instead and the expanded form of the contract if you want to specify preconditions: @@ -132,20 +132,10 @@ UNINSTALL_UNWIND_AND_CONTINUE_HANDLER \ UNINSTALL_MANAGED_EXCEPTION_DISPATCHER -#define BEGIN_QCALL_SO_TOLERANT \ - INSTALL_MANAGED_EXCEPTION_DISPATCHER \ - INSTALL_UNWIND_AND_CONTINUE_HANDLER_NO_PROBE - -#define END_QCALL_SO_TOLERANT \ - UNINSTALL_UNWIND_AND_CONTINUE_HANDLER_NO_PROBE \ - UNINSTALL_MANAGED_EXCEPTION_DISPATCHER - - #define QCALL_CHECK \ THROWS; \ GC_TRIGGERS; \ MODE_PREEMPTIVE; \ - SO_TOLERANT; \ #define QCALL_CONTRACT CONTRACTL { QCALL_CHECK; } CONTRACTL_END; @@ -185,7 +175,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/readytoruninfo.cpp b/src/vm/readytoruninfo.cpp index 7c110c630e..378ce2a3f2 100644 --- a/src/vm/readytoruninfo.cpp +++ b/src/vm/readytoruninfo.cpp @@ -25,7 +25,6 @@ IMAGE_DATA_DIRECTORY * ReadyToRunInfo::FindSection(DWORD type) { GC_NOTRIGGER; NOTHROW; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -49,7 +48,6 @@ MethodDesc * ReadyToRunInfo::GetMethodDescForEntryPoint(PCODE entryPoint) { GC_NOTRIGGER; NOTHROW; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -73,7 +71,6 @@ BOOL ReadyToRunInfo::HasHashtableOfTypes() { GC_NOTRIGGER; NOTHROW; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -87,7 +84,6 @@ BOOL ReadyToRunInfo::TryLookupTypeTokenFromName(NameHandle *pName, mdToken * pFo { GC_NOTRIGGER; NOTHROW; - SO_INTOLERANT; SUPPORTS_DAC; PRECONDITION(!m_availableTypesHashtable.IsNull()); } @@ -223,7 +219,6 @@ BOOL ReadyToRunInfo::GetTypeNameFromToken(IMDInternalImport * pImport, mdToken m { GC_NOTRIGGER; NOTHROW; - SO_TOLERANT; SUPPORTS_DAC; PRECONDITION(TypeFromToken(mdType) == mdtTypeDef || TypeFromToken(mdType) == mdtTypeRef || TypeFromToken(mdType) == mdtExportedType); } @@ -248,7 +243,6 @@ BOOL ReadyToRunInfo::GetEnclosingToken(IMDInternalImport * pImport, mdToken mdTy { GC_NOTRIGGER; NOTHROW; - SO_TOLERANT; SUPPORTS_DAC; PRECONDITION(TypeFromToken(mdType) == mdtTypeDef || TypeFromToken(mdType) == mdtTypeRef || TypeFromToken(mdType) == mdtExportedType); } @@ -277,7 +271,6 @@ BOOL ReadyToRunInfo::CompareTypeNameOfTokens(mdToken mdToken1, IMDInternalImport { GC_NOTRIGGER; NOTHROW; - SO_TOLERANT; SUPPORTS_DAC; PRECONDITION(TypeFromToken(mdToken1) == mdtTypeDef || TypeFromToken(mdToken1) == mdtTypeRef || TypeFromToken(mdToken1) == mdtExportedType); PRECONDITION(TypeFromToken(mdToken2) == mdtTypeDef || TypeFromToken(mdToken2) == mdtExportedType); diff --git a/src/vm/reflectioninvocation.cpp b/src/vm/reflectioninvocation.cpp index 7ff6ea6cb9..7f3ad70787 100644 --- a/src/vm/reflectioninvocation.cpp +++ b/src/vm/reflectioninvocation.cpp @@ -37,7 +37,6 @@ static TypeHandle NullableTypeOfByref(TypeHandle th) { { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -527,6 +526,7 @@ FCIMPL6(Object*, RuntimeTypeHandle::CreateInstance, ReflectClassBaseObject* refT } } DoneCreateInstance: + ; HELPER_METHOD_FRAME_END(); return OBJECTREFToObject(rv); } @@ -1040,10 +1040,6 @@ FCIMPL5(Object*, RuntimeMethodHandle::InvokeMethod, Thread * pThread = GET_THREAD(); - // Make sure we have enough room on the stack for this. Note that we will need the stack amount twice - once to build the stack - // and second time to actually make the call. - INTERIOR_STACK_PROBE_FOR(pThread, 1 + static_cast<UINT>((2 * nAllocaSize) / GetOsPageSize()) + static_cast<UINT>(HOLDER_CODE_NORMAL_STACK_LIMIT)); - LPBYTE pAlloc = (LPBYTE)_alloca(nAllocaSize); LPBYTE pTransitionBlock = pAlloc + TransitionBlock::GetNegSpaceSize(); @@ -1394,10 +1390,10 @@ FCIMPL5(Object*, RuntimeMethodHandle::InvokeMethod, if (pProtectValueClassFrame != NULL) pProtectValueClassFrame->Pop(pThread); - END_INTERIOR_STACK_PROBE; } Done: + ; HELPER_METHOD_FRAME_END(); return OBJECTREFToObject(gc.retVal); @@ -2189,14 +2185,9 @@ void ExecuteCodeWithGuaranteedCleanupHelper (ECWGC_GC *gc) } PAL_ENDTRY; -#ifdef FEATURE_STACK_PROBE - if (param.fStackOverflow) - COMPlusThrowSO(); -#else //This will not be set as clr to managed transition code will terminate the //process if there is an SO before SODetectionFilter() is called. _ASSERTE(!param.fStackOverflow); -#endif } // diff --git a/src/vm/runtimecallablewrapper.cpp b/src/vm/runtimecallablewrapper.cpp index 6280c2c10f..83f246e6ca 100644 --- a/src/vm/runtimecallablewrapper.cpp +++ b/src/vm/runtimecallablewrapper.cpp @@ -4548,7 +4548,6 @@ TypeHandle::CastResult RCW::SupportsWinRTInteropInterfaceNoGC(MethodTable *pItfM NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/runtimecallablewrapper.h b/src/vm/runtimecallablewrapper.h index c88230d80c..6154a328c9 100644 --- a/src/vm/runtimecallablewrapper.h +++ b/src/vm/runtimecallablewrapper.h @@ -752,7 +752,6 @@ struct RCW NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; POSTCONDITION(CheckPointer(RETVAL)); } CONTRACT_END; @@ -1357,7 +1356,6 @@ public : { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACT_END; diff --git a/src/vm/runtimehandles.cpp b/src/vm/runtimehandles.cpp index b41026facd..dda5d1d139 100644 --- a/src/vm/runtimehandles.cpp +++ b/src/vm/runtimehandles.cpp @@ -19,7 +19,6 @@ #include "codeman.h" #include "corhlpr.h" #include "jitinterface.h" -#include "stackprobe.h" #include "eeconfig.h" #include "eehash.h" #include "interoputil.h" @@ -517,12 +516,8 @@ FCIMPL1(ReflectModuleBaseObject*, RuntimeTypeHandle::GetModule, ReflectClassBase if (refType == NULL) FCThrowRes(kArgumentNullException, W("Arg_InvalidHandle")); - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrow(kStackOverflowException)); - result = refType->GetType().GetModule(); - END_SO_INTOLERANT_CODE; - FC_RETURN_MODULE_OBJECT(result, refType); } FCIMPLEND @@ -1239,7 +1234,6 @@ FCIMPL1(ReflectClassBaseObject*, RuntimeTypeHandle::GetDeclaringType, ReflectCla MethodTable* pMT = NULL; mdTypeDef tkTypeDef = mdTokenNil; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrow(kStackOverflowException)); if (typeHandle.IsTypeDesc()) { if (typeHandle.IsGenericVariable()) { @@ -1323,8 +1317,6 @@ FCIMPL1(ReflectClassBaseObject*, RuntimeTypeHandle::GetDeclaringType, ReflectCla } Exit: - END_SO_INTOLERANT_CODE; - if (fThrowException) { FCThrowRes(reKind, argName); @@ -1785,11 +1777,7 @@ FCIMPL1(INT32, RuntimeMethodHandle::GetAttributes, MethodDesc *pMethod) { if (!pMethod) FCThrowRes(kArgumentNullException, W("Arg_InvalidHandle")); - INT32 retVal = 0; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrow(kStackOverflowException)); - retVal = (INT32)pMethod->GetAttrs(); - END_SO_INTOLERANT_CODE; - return retVal; + return (INT32)pMethod->GetAttrs(); } FCIMPLEND @@ -1808,13 +1796,7 @@ FCIMPL1(INT32, RuntimeMethodHandle::GetImplAttributes, ReflectMethodObject *pMet if (IsNilToken(pMethod->GetMemberDef())) return attributes; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrow(kStackOverflowException)); - { - attributes = (INT32)pMethod->GetImplAttrs(); - } - END_SO_INTOLERANT_CODE; - - return attributes; + return (INT32)pMethod->GetImplAttrs(); } FCIMPLEND @@ -2576,10 +2558,7 @@ FCIMPL1(FC_BOOL_RET, RuntimeMethodHandle::IsConstructor, MethodDesc *pMethod) } CONTRACTL_END; - BOOL ret = FALSE; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrow(kStackOverflowException)); - ret = (BOOL)pMethod->IsClassConstructorOrCtor(); - END_SO_INTOLERANT_CODE; + BOOL ret = (BOOL)pMethod->IsClassConstructorOrCtor(); FC_RETURN_BOOL(ret); } FCIMPLEND @@ -2667,11 +2646,7 @@ FCIMPL1(INT32, RuntimeFieldHandle::GetAttributes, FieldDesc *pField) { if (!pField) FCThrowRes(kArgumentNullException, W("Arg_InvalidHandle")); - INT32 ret = 0; - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), FCThrow(kStackOverflowException)); - ret = (INT32)pField->GetAttributes(); - END_SO_INTOLERANT_CODE; - return ret; + return (INT32)pField->GetAttributes(); } FCIMPLEND diff --git a/src/vm/safehandle.cpp b/src/vm/safehandle.cpp index 369fbb9863..59d622aed1 100644 --- a/src/vm/safehandle.cpp +++ b/src/vm/safehandle.cpp @@ -247,7 +247,6 @@ void SafeHandle::SetHandle(LPVOID handle) THROWS; MODE_COOPERATIVE; INSTANCE_CHECK; - SO_TOLERANT; } CONTRACTL_END; _ASSERTE(IsFullyInitialized()); diff --git a/src/vm/sha1.cpp b/src/vm/sha1.cpp index 96517b559a..6d0784e89a 100644 --- a/src/vm/sha1.cpp +++ b/src/vm/sha1.cpp @@ -201,7 +201,6 @@ void SHA1Hash::SHA1Init(SHA1_CTX *ctx) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; ctx->nbit_total[0] = ctx->nbit_total[1] = 0; @@ -235,7 +234,6 @@ void SHA1Hash::SHA1Update( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; const BYTE *fresh_data = msg; @@ -323,7 +321,6 @@ void SHA1Hash::SHA1Final( NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; DWORDC nbit0 = ctx->nbit_total[0]; @@ -368,7 +365,6 @@ SHA1Hash::SHA1Hash() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; m_fFinalized = FALSE; @@ -381,7 +377,6 @@ void SHA1Hash::AddData(BYTE *pbData, DWORD cbData) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; if (m_fFinalized) @@ -397,7 +392,6 @@ BYTE *SHA1Hash::GetHash() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; if (m_fFinalized) diff --git a/src/vm/siginfo.cpp b/src/vm/siginfo.cpp index 0a9599edc9..736e0c7ae6 100644 --- a/src/vm/siginfo.cpp +++ b/src/vm/siginfo.cpp @@ -1090,9 +1090,6 @@ TypeHandle SigPointer::GetTypeHandleThrowing( } else { - // This function is recursive, so it must have an interior probe - INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(10, NO_FORBIDGC_LOADER_USE_ThrowSO();); - #ifdef _DEBUG_IMPL // This verifies that we won't try and load a type // if FORBIDGC_LOADER_USE_ENABLED is true. @@ -1351,10 +1348,6 @@ TypeHandle SigPointer::GetTypeHandleThrowing( if (!ClrSafeInt<DWORD>::multiply(ntypars, sizeof(TypeHandle), dwAllocaSize)) ThrowHR(COR_E_OVERFLOW); - if ((dwAllocaSize/GetOsPageSize()+1) >= 2) - { - DO_INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD((10+dwAllocaSize/GetOsPageSize()+1), NO_FORBIDGC_LOADER_USE_ThrowSO();); - } TypeHandle *thisinst = (TypeHandle*) _alloca(dwAllocaSize); // Finally we gather up the type arguments themselves, loading at the level specified for generic arguments @@ -1631,11 +1624,6 @@ TypeHandle SigPointer::GetTypeHandleThrowing( { ThrowHR(COR_E_OVERFLOW); } - - if ((cAllocaSize/GetOsPageSize()+1) >= 2) - { - DO_INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD((10+cAllocaSize/GetOsPageSize()+1), NO_FORBIDGC_LOADER_USE_ThrowSO();); - } TypeHandle *retAndArgTypes = (TypeHandle*) _alloca(cAllocaSize); bool fReturnTypeOrParameterNotLoaded = false; @@ -1711,7 +1699,6 @@ TypeHandle SigPointer::GetTypeHandleThrowing( THROW_BAD_FORMAT(BFA_BAD_COMPLUS_SIG, pOrigModule); } - END_INTERIOR_STACK_PROBE; } RETURN thRet; @@ -2389,7 +2376,6 @@ CorElementType SigPointer::PeekElemTypeNormalized(Module* pModule, const SigType if (FORBIDGC_LOADER_USE_ENABLED()) GC_NOTRIGGER; else GC_TRIGGERS; if (FORBIDGC_LOADER_USE_ENABLED()) FORBID_FAULT; else { INJECT_FAULT(COMPlusThrowOM()); } MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -2399,7 +2385,6 @@ CorElementType SigPointer::PeekElemTypeNormalized(Module* pModule, const SigType if (type == ELEMENT_TYPE_VALUETYPE) { - BEGIN_SO_INTOLERANT_CODE(GetThread()); { // Everett C++ compiler can generate a TypeRef with RS=0 // without respective TypeDef for unmanaged valuetypes, @@ -2416,7 +2401,6 @@ CorElementType SigPointer::PeekElemTypeNormalized(Module* pModule, const SigType if (pthValueType != NULL) *pthValueType = th; } - END_SO_INTOLERANT_CODE; } return(type); @@ -2436,7 +2420,6 @@ SigPointer::PeekElemTypeClosed( GC_NOTRIGGER; FORBID_FAULT; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END @@ -2522,7 +2505,6 @@ mdTypeRef SigPointer::PeekValueTypeTokenClosed(Module *pModule, const SigTypeCon PRECONDITION(PeekElemTypeClosed(NULL, pTypeContext) == ELEMENT_TYPE_VALUETYPE); FORBID_FAULT; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END @@ -3063,7 +3045,6 @@ BOOL IsTypeDefExternallyVisible(mdToken tk, Module *pModule, DWORD dwAttrClass) NOTHROW; MODE_ANY; GC_NOTRIGGER; - SO_INTOLERANT; } CONTRACTL_END; diff --git a/src/vm/sourceline.cpp b/src/vm/sourceline.cpp index 63d2177625..e38b2c434a 100644 --- a/src/vm/sourceline.cpp +++ b/src/vm/sourceline.cpp @@ -40,20 +40,16 @@ public: THROWS; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; - BEGIN_SO_INTOLERANT_CODE(GetThread()); if ( (--m_nRefCount) == 0 ) delete this; - END_SO_INTOLERANT_CODE; - + return m_nRefCount; } HRESULT STDMETHODCALLTYPE QueryInterface( REFIID rid, void **ppUnk ) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; if ( ppUnk == NULL ) { return E_INVALIDARG; } @@ -80,7 +76,6 @@ public: BYTE data[]) // really a const struct _IMAGE_DEBUG_DIRECTORY * { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; return S_OK; } diff --git a/src/vm/spinlock.cpp b/src/vm/spinlock.cpp index 26bfddfb8a..c41cd296a4 100644 --- a/src/vm/spinlock.cpp +++ b/src/vm/spinlock.cpp @@ -139,7 +139,6 @@ void SpinLock::GetLock(Thread* pThread) DISABLED(THROWS); // need to rewrite spin locks to no-throw. GC_NOTRIGGER; CAN_TAKE_LOCK; - SO_TOLERANT; } CONTRACTL_END; @@ -177,7 +176,6 @@ BOOL SpinLock::GetLockNoWait() NOTHROW; GC_NOTRIGGER; CAN_TAKE_LOCK; - SO_TOLERANT; } CONTRACTL_END; @@ -201,7 +199,6 @@ void SpinLock::FreeLock(Thread* pThread) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -237,7 +234,6 @@ SpinLock::SpinToAcquire() NOTHROW; GC_NOTRIGGER; CAN_TAKE_LOCK; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/stackingallocator.cpp b/src/vm/stackingallocator.cpp index 2a7c293a53..266105b2d3 100644 --- a/src/vm/stackingallocator.cpp +++ b/src/vm/stackingallocator.cpp @@ -74,7 +74,6 @@ StackingAllocator::~StackingAllocator() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -104,7 +103,6 @@ void *StackingAllocator::GetCheckpoint() CONTRACTL { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; #ifdef _DEBUG @@ -223,7 +221,6 @@ void* StackingAllocator::UnsafeAllocSafeThrow(UINT32 Size) THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; INJECT_FAULT(ThrowOutOfMemory()); PRECONDITION(m_CheckpointDepth > 0); POSTCONDITION(CheckPointer(RETVAL)); @@ -246,7 +243,6 @@ void *StackingAllocator::UnsafeAlloc(UINT32 Size) THROWS; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; INJECT_FAULT(ThrowOutOfMemory()); PRECONDITION(m_CheckpointDepth > 0); POSTCONDITION(CheckPointer(RETVAL)); @@ -311,7 +307,6 @@ void * __cdecl operator new(size_t n, StackingAllocator * alloc) { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_FAULT; - STATIC_CONTRACT_SO_TOLERANT; #ifdef _WIN64 // size_t's too big on 64-bit platforms so we check for overflow @@ -327,7 +322,6 @@ void * __cdecl operator new[](size_t n, StackingAllocator * alloc) { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_FAULT; - STATIC_CONTRACT_SO_TOLERANT; #ifdef _WIN64 // size_t's too big on 64-bit platforms so we check for overflow @@ -347,7 +341,6 @@ void * __cdecl operator new(size_t n, StackingAllocator * alloc, const NoThrow&) { STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_FAULT; - STATIC_CONTRACT_SO_TOLERANT; #ifdef _WIN64 // size_t's too big on 64-bit platforms so we check for overflow @@ -361,7 +354,6 @@ void * __cdecl operator new[](size_t n, StackingAllocator * alloc, const NoThrow { STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_FAULT; - STATIC_CONTRACT_SO_TOLERANT; #ifdef _WIN64 // size_t's too big on 64-bit platforms so we check for overflow diff --git a/src/vm/stackingallocator.h b/src/vm/stackingallocator.h index dcb1c5c4e0..6d1b603a5a 100644 --- a/src/vm/stackingallocator.h +++ b/src/vm/stackingallocator.h @@ -116,7 +116,6 @@ public: NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; INJECT_FAULT(CONTRACT_RETURN NULL;); PRECONDITION(m_CheckpointDepth > 0); POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); @@ -147,13 +146,7 @@ public: // Is the request too large for the current block? if (n > m_BytesLeft) { - bool allocatedNewBlock = false; - - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), RETURN NULL); - allocatedNewBlock = AllocNewBlockForBytes(n); - END_SO_INTOLERANT_CODE; - - if (!allocatedNewBlock) + if (!AllocNewBlockForBytes(n)) { RETURN NULL; } diff --git a/src/vm/stackprobe.cpp b/src/vm/stackprobe.cpp deleted file mode 100644 index 7e40ca8738..0000000000 --- a/src/vm/stackprobe.cpp +++ /dev/null @@ -1,1765 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. -// - -// -//----------------------------------------------------------------------------- -// StackProbe.cpp -//----------------------------------------------------------------------------- - - -#include "common.h" -#include "stackprobe.h" - - -#ifdef FEATURE_STACK_PROBE - - -// SOTolerantBoundaryFilter is called when an exception in SO-tolerant code arrives -// at the boundary back into SO-intolerant code. -// -// If we are running in an environment where we must be hardened to SO, then we must -// catch the exception if there is not enough space to run our backout code (the stuff in the -// EX_CATCH clauses). We also cannot let a hard SO propogate into SO-intolerant code, because -// we rip the process if that happens (we have no way to tell that the SO is ok.) -int SOTolerantBoundaryFilter(EXCEPTION_POINTERS *pExceptionInfo, DWORD * pdwSOTolerantFlags) -{ - Thread *pThread = GetThread(); - _ASSERTE(pThread); - _ASSERTE(pdwSOTolerantFlags != NULL); - _ASSERTE(!((*pdwSOTolerantFlags) & BSTC_TRIGGERING_UNWIND_FOR_SO)); - - SaveCurrentExceptionInfo(pExceptionInfo->ExceptionRecord, pExceptionInfo->ContextRecord); - - NTSTATUS exceptionCode = pExceptionInfo->ExceptionRecord->ExceptionCode; - - // We must always handle a hard SO - if (IsSOExceptionCode(exceptionCode)) - { - if (exceptionCode == EXCEPTION_SOFTSO) - { - *pdwSOTolerantFlags |= BSTC_IS_SOFT_SO; - } - *pdwSOTolerantFlags |= BSTC_IS_SO; - - if (!CLRHosted() || pThread == NULL || GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) != eRudeUnloadAppDomain) - { - // For security reason, it is not safe to continue execution if stack overflow happens - // unless a host tells us to do something different. - EEPolicy::HandleFatalStackOverflow(pExceptionInfo); - } - - /* If there is a SO_INTOLERANT region above this */ - /* we should have processed it already in SOIntolerantTransitionHandler */ - EEPolicy::HandleStackOverflow(SOD_SOTolerantTransitor, FRAME_TOP); - - *pdwSOTolerantFlags |= BSTC_TRIGGERING_UNWIND_FOR_SO; - - return EXCEPTION_EXECUTE_HANDLER; - } - - // Make sure we have enough stack to run our backout code. If not, - // catch the exception. - if (! pThread->IsStackSpaceAvailable(ADJUST_PROBE(BACKOUT_CODE_STACK_LIMIT))) - { - *pdwSOTolerantFlags |= BSTC_TRIGGERING_UNWIND_FOR_SO; - return EXCEPTION_EXECUTE_HANDLER; - } - - - return EXCEPTION_CONTINUE_SEARCH; -} - -void SOTolerantCode_RecoverStack(DWORD dwFlags) -{ - CONTRACTL - { - THROWS; - GC_TRIGGERS; - MODE_ANY; - SO_TOLERANT; - } - CONTRACTL_END; - - Thread * pThread = GetThread(); - if (!(dwFlags & BSTC_IS_SOFT_SO)) - { - pThread->RestoreGuardPage(); - } - if (dwFlags & BSTC_IS_SO) - { - if (!pThread->PreemptiveGCDisabled()) - { - pThread->DisablePreemptiveGC(); - } - } - COMPlusThrowSO(); -} - -void SOTolerantCode_ExceptBody(DWORD * pdwFlags, Frame * pSafeForSOFrame) -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - MODE_ANY; - SO_TOLERANT; - } - CONTRACTL_END; - - // do nothing here. Get our stack back post-catch and then throw a new exception - *pdwFlags |= BSTC_RECOVER_STACK; - if (*pdwFlags & BSTC_IS_SO) - { - // If this assertion fires, then it means that we have not unwound the frame chain - Thread * pThread = GetThread(); - _ASSERTE(pSafeForSOFrame == pThread->GetFrame()); - pThread->ClearExceptionStateAfterSO(pSafeForSOFrame); - } -} - -// -// ReportStackOverflow is called when our probe infrastructure detects that there -// is insufficient stack to perform the operation. -// - -void ReportStackOverflow() -{ - WRAPPER_NO_CONTRACT; - - _ASSERTE(IsStackProbingEnabled()); - - Thread *pThread = GetThread(); - - if (pThread != NULL) - { - // We don't want an SO to happen while we are trying to throw this one. So check if there - // is enough space left to handle an exception (this translates to check that we have stack - // space left equivalent to the soft guard region). If not, then remove the guard page by - // forcing a hard SO. This effectively turns the SO into a boundary SO. - - // We should only ever get in this situation on a probe from managed code. From within the EE, - // we will never let our probe point get this close. Either way, we'd rip the process if a hard - // SO occurred. - - UINT_PTR stackGuarantee = pThread->GetStackGuarantee(); - - // We expect the stackGuarantee to be a multiple of the page size for - // the call to IsStackSpaceAvailable. - _ASSERTE(stackGuarantee%GetOsPageSize() == 0); - if (pThread->IsStackSpaceAvailable(static_cast<float>(stackGuarantee)/GetOsPageSize())) - { - COMPlusThrowSO(); - } - - // If there isn't much stack left to attempt to report a soft stack overflow, let's trigger a hard - // SO, so we clear the guard page and give us at least another page of stack to work with. - - if (!pThread->IsStackSpaceAvailable(ADJUST_PROBE(1))) - { - DontCallDirectlyForceStackOverflow(); - } - } - - RaiseException(EXCEPTION_SOFTSO, 0, 0, NULL); -} - -void CheckForSOInSOIntolerantCode() -{ - Thread *pThread = GetThreadNULLOk(); - if (pThread == NULL) - { - return; - } - // We use the location of frames to decide SO mode. But during exception, - // we may not unwind some frames, for example: TPMethodFrame, therefore - // it is not safe to apply this check. - //_ASSERTE(!pThread->IsSOTolerant(FRAME_TOP)); - if (! pThread->IsSPBeyondLimit()) - { - return; - } - EEPolicy::HandleStackOverflow(SOD_SOIntolerantTransitor, FRAME_TOP); - _ASSERTE (!"Can not reach here"); -} - -//--------------------------------------------------------------------------------------- -// -// SetSOIntolerantTransitionMarker: Use the current frame as our marker for intolerant transition. -// -// Arguments: -// None. -// -// Return Value: -// None. -// -// Note: -// SO mode is determined by what is on stack. If we see our intolerant transtion first, we are in SO. -// Because compiler lays object in a function at random stack location, the address of our intolerant -// transition object SOIntolerantTransitionHandler may be before the HelperMethodFrame. Therefore, we -// can not use the address of the handlers. Instead we use the current top frame. -// -void SetSOIntolerantTransitionMarker() -{ - LIMITED_METHOD_CONTRACT; - - Thread *pThread = GetThreadNULLOk(); - if (pThread == NULL) - { - return; - } - Frame *pFrame = pThread->GetFrame(); - - // - // Check to see if the Frame chain is corrupt - // This can happen when unmanaged code calls back to managed code - // - if (pFrame != FRAME_TOP) - { - // SafeGetGCCookiePtr examines the value of the vtable pointer - // and makes sure that it is a legal Frame subtype. - // It returns NULL when we have an illegal (i.e. corrupt) vtable value. - // - if (!Frame::HasValidVTablePtr(pFrame)) - DoJITFailFast(); - } - - // We use pFrame - 1 as our marker so that IntolerantTransitionHandler is seen before - // a transition frame. - ClrFlsSetValue(TlsIdx_SOIntolerantTransitionHandler, (void*)(((size_t)pFrame)-1)); - - _ASSERTE(!pThread->IsSOTolerant(FRAME_TOP)); -} - -BOOL RetailStackProbeNoThrowNoThread(unsigned int n) -{ - STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - STATIC_CONTRACT_MODE_ANY; - - BEGIN_GETTHREAD_ALLOWED; - Thread *pThread = GetThread(); - - if (!pThread) - { - // we only probe on managed threads - return TRUE; - } - return RetailStackProbeNoThrow(n, pThread); - END_GETTHREAD_ALLOWED; -} - -// This functions are used by the stack probe infrastucture that is outside the VM -// tree. It needs to call into the VM code in order to probe properly. -void InitStackProbesRetail() -{ - LIMITED_METHOD_CONTRACT; - g_fpCheckForSOInSOIntolerantCode = CheckForSOInSOIntolerantCode; - g_fpSetSOIntolerantTransitionMarker = SetSOIntolerantTransitionMarker; - g_fpDoProbe = RetailStackProbeNoThrowNoThread; - g_fpHandleSoftStackOverflow = EEPolicy::HandleSoftStackOverflow; - - g_StackProbingEnabled = g_pConfig->ProbeForStackOverflow() != 0; -} - -// Shared by both the nothrow and throwing version. FORCEINLINE into both to avoid the call overhead. -FORCEINLINE BOOL RetailStackProbeHelper(unsigned int n, Thread *pThread) -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - SO_TOLERANT; - MODE_ANY; - } - CONTRACTL_END; - - UINT_PTR probeLimit; - - // @TODO - Need to devise a probe that doesn't require the thread object - if (pThread == NULL) - { - UINT_PTR stackLimit = (UINT_PTR)Thread::GetStackLowerBound(); - probeLimit = Thread::GetLastNormalStackAddress(stackLimit); - } - else - { - probeLimit = pThread->GetProbeLimit(); - } - UINT_PTR probeAddress = (UINT_PTR)(&pThread) - (n * GetOsPageSize()); - - // If the address we want to probe to is beyond the precalculated limit we fail - // Note that we don't check for stack probing being disabled. This is encoded in - // the value returned from GetProbeLimit, which will be 0 if probing is disabled. - if (probeAddress < probeLimit) - { -#if 0 - // @todo : remove this when iexplore, W3WP.EXE and friends allocate 512K instead - // of 256K for their stack. - if (((char *)(pThread->GetCachedStackBase()) - (char *)(pThread->GetCachedStackLimit())) < 0x41000) - { - return true; - } -#endif - return FALSE; - } - - return TRUE; -} - -BOOL RetailStackProbeNoThrowWorker(unsigned int n, Thread *pThread) -{ - WRAPPER_NO_CONTRACT; - return RetailStackProbeHelper(n, pThread); -} - -void RetailStackProbeWorker(unsigned int n, Thread *pThread) -{ - STATIC_CONTRACT_THROWS; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - - if (RetailStackProbeHelper(n, pThread)) - { - return; - } - ReportStackOverflow(); -} - -void DefaultRetailStackProbeWorker(Thread *pThread) -{ - STATIC_CONTRACT_THROWS; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - - if (RetailStackProbeHelper(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), pThread)) - { - return; - } - ReportStackOverflow(); -} - -#endif // FEATURE_STACK_PROBE - -#ifdef STACK_GUARDS_DEBUG - -DWORD g_InteriorProbeAmount = DEFAULT_INTERIOR_PROBE_AMOUNT; - -DWORD g_CurrentStackGuardTlsIdx = (DWORD) -1; -DWORD g_UniqueId = 0; - -// If this has a non-zero value, we'll mark only those pages whose probe line number matches. This allows us -// to turn protection on only for a specific probe so that can find multiple w/o having to rebuild. Otherwise -// can never get past that first AV in the debugger. -unsigned int g_ProtectStackPagesInDebuggerForProbeAtLine = 0; - -// These two are used to the amount probed for at a particular line number -unsigned int g_UpdateProbeAtLine = 0; -SString* g_pUpdateProbeAtLineInFile = NULL; -unsigned int g_UpdateProbeAtLineAmount = 0; - -// If this is TRUE, we'll break in the debugger if we try to probe during the handling of a -// probe-induced stack overflow. -BOOL g_BreakOnProbeDuringSO = FALSE; - -// If this is TRUE, probe cookie validation via assertion is enabled -// disable assertions on debug build. The stack consumption is different enough -// that we'll always be getting spurious failures. -BOOL g_probeAssertOnOverrun = FALSE; - -// SO logging pollutes the EH logging space and vice-versa. The SOLogger class -// allows us to turn SO logging on separately and only produce SO logging, or -// to allow both. -#undef LOG -#define LOG(x) s_SOLogger.LogSpew x - -class SOLogger { - - enum SOLogStyle { - SO_LOGGING_NONE, // No SO logging - SO_LOGGING_SEPARATE_LOG, // Log SO to separate file - SO_LOGGING_STANDARD_LOG // Log SO to standard log - }; - - SOLogStyle m_SOLogStyle; - FILE *m_SOLoggerFile; - -public: - SOLogger(); - ~SOLogger(); - - void Initialize(); - - void LogSpew(DWORD facility, DWORD level, const char *fmt, ... ); -}; - -static SOLogger s_SOLogger; - -SOLogger::SOLogger() - : m_SOLogStyle(SO_LOGGING_NONE), m_SOLoggerFile(NULL) -{ -} - -void SOLogger::Initialize() -{ - WRAPPER_NO_CONTRACT; - - DWORD SOLogger = REGUTIL::GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_SOLogger, SO_LOGGING_NONE); - if (SOLogger == SO_LOGGING_SEPARATE_LOG) - { - m_SOLogStyle = SO_LOGGING_SEPARATE_LOG; - int ec = fopen_s(&m_SOLoggerFile, "SOLogSpewFile.log", "w"); - _ASSERTE(SUCCEEDED(ec)); - } - else if (SOLogger == SO_LOGGING_STANDARD_LOG) - { - m_SOLogStyle = SO_LOGGING_STANDARD_LOG; - } - else if (SOLogger == SO_LOGGING_NONE) - { - m_SOLogStyle = SO_LOGGING_NONE; - } - else - { - _ASSERTE(!"Invalid SOLogger value"); - } -} - -SOLogger::~SOLogger() -{ - LIMITED_METHOD_CONTRACT; - if (m_SOLoggerFile != NULL) - { - fclose(m_SOLoggerFile); - } -} - -void SOLogger::LogSpew(DWORD facility, DWORD level, const char *fmt, ... ) -{ - STATIC_CONTRACT_WRAPPER; - - if (m_SOLogStyle == SO_LOGGING_NONE) - { - return; - } - - va_list args; - va_start(args, fmt); - if (m_SOLogStyle == SO_LOGGING_SEPARATE_LOG) - { - vfprintf(m_SOLoggerFile, fmt, args); - } - else if (LoggingEnabled()) - { - LogSpewValist (facility, level, fmt, args); - } - va_end(args); -} - -#define MORE_INFO_STRING \ - "\nPlease open a bug against the feature owner.\n" \ - "\nFor details about this feature, see, in a CLR enlistment, src\\ndp\\clr\\doc\\OtherDevDocs\\untriaged\\clrdev_web\\SO Guide for CLR Developers.doc\n" - - -// The following are used to support the SO-injection framework -HMODULE BaseStackGuard::m_hProbeCallBack = 0; -BaseStackGuard::ProbeCallbackType BaseStackGuard::m_pfnProbeCallback = NULL; - -// -// ShouldValidateSOToleranceOnThisThread determines if we should check for SO_Tolerance on this -// thread. -// -// If it is a thread we care about, then we will assert if it calls an SO-intolerant function -// outside of a probe -// -BOOL ShouldValidateSOToleranceOnThisThread() -{ - LIMITED_METHOD_CONTRACT; - - if (g_StackProbingEnabled == false || g_fEEShutDown == TRUE) - { - return FALSE; - } - - BEGIN_GETTHREAD_ALLOWED; - Thread *pThread = GetThread(); - if (pThread == NULL || ShouldProbeOnThisThread() == FALSE) - { - return FALSE; - } - - // We only want to probe on managed threads that have IL on the stack behind them. But - // there's not an easy way to check for that, so we use whether or not we own the thread and - // whether or not a stack guard is in place. - // - // If we don't own the thread, then just make sure that we didn't get here by leaving the EE and coming - // back in. (In which case we would have installed a probe and the GetCurrentStackGuard is non-NULL). - // We are only probing on managed threads, but we want to avoid asserting for cases where an unmanaged - // app starts the EE (thereby creating a managed thread), and runs completely unmanaged, but uses some of the CLR's - // infrastructure, such as Crsts. - if (pThread->DoWeOwn() == FALSE && pThread->GetCurrentStackGuard() == NULL) - { - return FALSE; - } - - if (! IsHandleNullUnchecked(pThread->GetThrowableAsHandle())) - { - return FALSE; - } - - return TRUE; - END_GETTHREAD_ALLOWED; -} - - -BOOL BaseStackGuard_RequiresNStackPages(BaseStackGuardGeneric *pGuard, unsigned int n, BOOL fThrowOnSO) -{ - return ((BaseStackGuard*)pGuard)->RequiresNStackPages(n, fThrowOnSO); -} - -void BaseStackGuard_CheckStack(BaseStackGuardGeneric *pGuard) -{ - WRAPPER_NO_CONTRACT; - ((BaseStackGuard*)pGuard)->CheckStack(); -} - -BOOL CheckNStackPagesAvailable(unsigned int n) -{ - STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - STATIC_CONTRACT_MODE_ANY; - - BEGIN_GETTHREAD_ALLOWED; - Thread *pThread = GetThread(); - - // If we don't have a managed thread object, we assume that we have the requested - // number of pages available. - if (!pThread) - return TRUE; - - _ASSERTE(FitsIn<float>(n)); - return pThread->IsStackSpaceAvailable(static_cast<float>(n)); - END_GETTHREAD_ALLOWED; -} - -void InitStackProbes() -{ - WRAPPER_NO_CONTRACT; - - g_CurrentStackGuardTlsIdx = TlsIdx_StackProbe; - - s_SOLogger.Initialize(); - - // If we're in a debugger, and if the config word below is set, then we'll go ahead and protect stack pages - // when we're run under a debugger. - //if (IsDebuggerPresent()) - //{ - if (CLRConfig::GetConfigValue(CLRConfig::INTERNAL_SOEnableStackProtectionInDebugger) == 1) - { - g_ProtectStackPagesInDebugger = TRUE; - } - g_ProtectStackPagesInDebuggerForProbeAtLine = - CLRConfig::GetConfigValue(CLRConfig::INTERNAL_SOEnableStackProtectionInDebuggerForProbeAtLine); - - g_UpdateProbeAtLine = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_SOUpdateProbeAtLine); - g_UpdateProbeAtLineAmount = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_SOUpdateProbeAtLineAmount); - LPWSTR wszUpdateProbeAtLineInFile = CLRConfig::GetConfigValue(CLRConfig::INTERNAL_SOUpdateProbeAtLineInFile); - g_pUpdateProbeAtLineInFile = new SString(wszUpdateProbeAtLineInFile); - g_pUpdateProbeAtLineInFile->Normalize(); - - if (CLRConfig::GetConfigValue(CLRConfig::INTERNAL_SOBreakOnProbeDuringSO) == 1) - { - g_BreakOnProbeDuringSO = TRUE; - } - //} - - // Never let g_EntryPointProbeAmount get set to an invalid value of <= 0 to avoid races in places that might be - // about to probe as we set it. - BOOL entryPointProbeAmount = REGUTIL::GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_SOEntryPointProbe, g_EntryPointProbeAmount); - if (entryPointProbeAmount > 0) - { - g_EntryPointProbeAmount = entryPointProbeAmount; - } - - BOOL interiorProbeAmount = REGUTIL::GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_SOInteriorProbe, g_InteriorProbeAmount); - if (interiorProbeAmount > 0) - { - g_InteriorProbeAmount = interiorProbeAmount; - } - - BOOL enableBackoutStackValidation = REGUTIL::GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_SOEnableBackoutStackValidation, FALSE); - - g_EnableDefaultRWValidation = 1; - - BOOL enableDefaultRWValidation = REGUTIL::GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_SOEnableDefaultRWValidation, g_EnableDefaultRWValidation); - - - - // put this first because it will cause probe validation via contract otherwise - g_probeAssertOnOverrun = REGUTIL::GetConfigDWORD_DontUse_(CLRConfig::INTERNAL_SOProbeAssertOnOverrun, g_probeAssertOnOverrun); - - BaseStackGuard::InitProbeReportingToFaultInjectionFramework(); - - g_EnableBackoutStackValidation = enableBackoutStackValidation; - - g_EnableDefaultRWValidation = enableDefaultRWValidation; - - g_fpShouldValidateSOToleranceOnThisThread = ShouldValidateSOToleranceOnThisThread; - - g_fpRestoreCurrentStackGuard = BaseStackGuard::RestoreCurrentGuard; - g_fpHandleStackOverflowAfterCatch = EEPolicy::HandleStackOverflowAfterCatch; - - - g_fp_BaseStackGuard_RequiresNStackPages = BaseStackGuard_RequiresNStackPages; - g_fp_BaseStackGuard_CheckStack = BaseStackGuard_CheckStack; - - g_fpCheckNStackPagesAvailable = CheckNStackPagesAvailable; - - InitStackProbesRetail(); - -} - -void CloseSOTolerantViolationFile(); - -// -// This function is called when the EE is shutting down and we want to stop -// doing stack probing. Don't clear the g_CurrentStackGuardTlsIdx field though, -// because there may still be other threads in the process of probing and -// they'll AV if we pull the g_CurrentStackGuardTlsIdx out from under them. -void TerminateStackProbes() -{ - WRAPPER_NO_CONTRACT; - - - CloseSOTolerantViolationFile(); - - // Don't actually shut down the SO infrastructure. We've got multiple threads - // racing around in the runtime, and they can be left in an inconsisent state - // if we flip this off. - - return; -#if 0 - // Yank the stack guard on this thread - StackGuardDisabler __guardDisable; - __guardDisable.NeverRestoreGuard(); - - // Clear out the current guard in case we terminate and its cleanup code - // does not get to run. - BaseStackGuard::SetCurrentGuard(NULL); - - g_StackProbingEnabled = false; - g_EnableBackoutStackValidation = FALSE; - g_fpShouldValidateSOToleranceOnThisThread = NULL; -#endif -} - -//----------------------------------------------------------------------------- -// Error handling when we go past a stack guard. -// We have different messages to more aggressively diagnose the problem -//----------------------------------------------------------------------------- - -// Called by Check_Stack when we overwrite the cookie -void BaseStackGuard::HandleOverwrittenThisStackGuard(__in_z char *stackID) -{ - LIMITED_METHOD_CONTRACT; - - if (! g_probeAssertOnOverrun) - { - return; - } - - ClrDebugState *pState = GetClrDebugState(); - _ASSERTE(pState); - if (pState->IsSONotMainline()) - { - return; - } - - // This prevents infinite loops in this function if we call something that probes. - // Must do it after the check for pState->IsSONotMainline() to give the first invocation - // a chance to run. - SO_NOT_MAINLINE_FUNCTION; - - // This fires at a closing Check_Stack. - // The cookie set by Requires_?K_stack was overwritten. We detected that at - // the closing call to check_stack. - - // To fix, increase the guard size at the specified ip. - // - // A debugging trick: If you can set a breakpoint at the opening Requires_?K_Stack - // macro for this instance, you can step in and see where the cookie is actually - // placed. Then, place a breakpoint that triggers when (DWORD*) 0xYYYYYYYY changes. - // Continue execution. The breakpoint will fire exactly when the cookie is over-written. - char buff[1024]; - buff[0] = '\0'; - - sprintf_s(buff, COUNTOF(buff), - "STACK GUARD VIOLATION\n" - "The%s stack guard installed in %s at \"%s\" @ %d requested %d pages of stack.\n" - "\nIf this is easily reproduced, please rerun the test under the debugger with the\n" - "DWORD environment variable COMPlus_SOEnableStackProtectionInDebugger\n" - "set to 1. This will cause an AV at the point of overrun.\n" - "Attach the stack trace at that point to the bug in addition to this assert." - MORE_INFO_STRING, stackID ? stackID : "", - m_szFunction, m_szFile, m_lineNum, m_numPages); - - LOG((LF_EH, LL_INFO100000, "%s", buff)); - - DbgAssertDialog((char *)m_szFile, m_lineNum, buff); - -} - -void BaseStackGuard::HandleOverwrittenPreviousStackGuard(int probeShortFall, __in_z char *stackID) -{ - LIMITED_METHOD_CONTRACT; - - if (! g_probeAssertOnOverrun) - { - return; - } - - ClrDebugState *pState = GetClrDebugState(); - _ASSERTE(pState); - if (pState->IsSONotMainline()) - { - return; - } - - // This prevents infinite loops in this function if we call something that probes. - // Must do it after the check for pState->IsSONotMainline() to give the first invocation - // a chance to run. - SO_NOT_MAINLINE_FUNCTION; - - // This fires at an opening Requires_?K_Stack - // We detected that we were already passed our parent's stack guard. So this guard is - // ok, but our parent's guard is too small. Note that if this test was removed, - // the failure would be detected by our parent's closing Check_Stack. But if we detect it - // here, we have more information. - // - // We can see how many bytes short our parent is and adjust it properly. - char buff[2048]; - buff[0] = '\0'; - - // We don't come in here unless we have a previous guard. - _ASSERTE(m_pPrevGuard != NULL); - - sprintf_s(buff, COUNTOF(buff), - "STACK GUARD VIOLATION\n" - " The%s stack guard being installed in %s at \"%s\" @ %d is already in violation of the previous stack guard.\n" - " The previous guard was installed in %s at \"%s\" @ %d and requested %d pages of stack.\n" - "The stack requested by the previous guard is at least %d pages (%d bytes) short.\n" - MORE_INFO_STRING, stackID ? stackID : "", m_szFunction, m_szFile, m_lineNum, - m_pPrevGuard->m_szFunction, m_pPrevGuard->m_szFile, m_pPrevGuard->m_lineNum, m_pPrevGuard->m_numPages, - probeShortFall/GetOsPageSize() + (probeShortFall%GetOsPageSize() ? 1 : 0), probeShortFall); - - LOG((LF_EH, LL_INFO100000, "%s", buff)); - - DbgAssertDialog((char *)m_szFile, m_lineNum, buff); -} - -void BaseStackGuard::HandleOverwrittenCurrentStackGuard(void *pGuard, int shortFall, __in_z char *stackID) -{ - ( (BaseStackGuard *)pGuard)->HandleOverwrittenCurrentStackGuard(shortFall, stackID); -} - -void BaseStackGuard::HandleOverwrittenCurrentStackGuard(int probeShortFall, __in_z char *stackID) -{ - DEBUG_ONLY_FUNCTION; - - if (! g_probeAssertOnOverrun) - { - return; - } - - // This fires during probe invariant validation. - // We detected that our current stack was already past the current probe depth. Note that if this - // test were removed, the failure should be detected the current guard's closing Check_Stack. - // But if we detect it here, we have more information. - // - // We can see how many bytes short the guard is and adjust it properly. - char buff[2048]; - buff[0] = '\0'; - - sprintf_s(buff, COUNTOF(buff), - "STACK GUARD VIOLATION\n\n" - "The%s stack guard installed in %s at \"%s\" @ %d has been violated\n\n" - "The guard requested %d pages of stack and is at least %d pages (%d bytes) short.\n" - MORE_INFO_STRING, stackID ? stackID : "", m_szFunction, m_szFile, m_lineNum, m_numPages, - probeShortFall/GetOsPageSize() + (probeShortFall%GetOsPageSize() ? 1 : 0), probeShortFall); - - LOG((LF_EH, LL_INFO100000, buff)); - - DbgAssertDialog((char *)m_szFile, m_lineNum, buff); -} - -//----------------------------------------------------------------------------- -// Function to do the actual touching of memory during probing, so we can have -// a good approximation of the address we should be overflowing at. -//----------------------------------------------------------------------------- -static __declspec(noinline) void PlaceMarker(UINT_PTR *pMarker) -{ - LIMITED_METHOD_CONTRACT; - *pMarker = STACK_COOKIE_VALUE; -} - - -StackGuardDisabler::StackGuardDisabler() -{ - LIMITED_METHOD_CONTRACT; - BaseStackGuard *pGuard = BaseStackGuard::GetCurrentGuard(); - - if (pGuard == NULL || !BaseStackGuard::IsProbeGuard(pGuard) || !pGuard->Enabled()) - { - // If there's no guard or its a boundary guard, there's nothing to do - m_fDisabledGuard = FALSE; - return; - } - - // If the guard is currently enabled, then we'll need to change the page protection - pGuard->UndoPageProtectionInDebugger(); - pGuard->DisableGuard(); - m_fDisabledGuard = TRUE; -}// StackGuardDisabler - -void StackGuardDisabler::NeverRestoreGuard() -{ - m_fDisabledGuard = FALSE; -} - -StackGuardDisabler::~StackGuardDisabler() -{ - WRAPPER_NO_CONTRACT; - if (m_fDisabledGuard) - { - BaseStackGuard::RestoreCurrentGuard(TRUE); - } -}// ~StackProbeDisabler - -//----------------------------------------------------------------------------- -// BaseStackGuard::RestoreCurrentGuard -// -// Function to restore the current marker's cookie after an EH. -// -// During an exception, we cannot restore stack guard cookies as we unwind our stack guards -// because the stack has not been unwound and we might corrupt it. So we just pop off our -// guards as we go and deal with restoring the cookie after the exception. -// There are two cases: -// -// 1) the exception is caught outside the EE -// 2) the exception is caught in the EE -// -// Case 1: If we catch the exception outside the EE, then the boundary guard that we installed before -// leaving the EE will still be intact, so we have no work to do. -// -// Case 2: If we caught the exception in the EE, then on EX_END_CATCH, after we have unwound the stack, we need to -// restore the cookie for the topmost stack guard. That is what RestoreCurrentGuard does. -// -//----------------------------------------------------------------------------- -void BaseStackGuard::RestoreCurrentGuard(BOOL fWasDisabled) -{ - if (!IsStackProbingEnabled()) - { - // nothing to do - return; - } - - LPVOID pSP = (LPVOID)GetCurrentSP(); - BaseStackGuard *pGuard = GetCurrentGuard(); - - if (pGuard == NULL || !IsProbeGuard(pGuard)) - { - // If there's no guard or its a boundary guard, there's nothing to do - // Just set state to SO-tolerant and quit. - GetClrDebugState()->SetSOTolerance(); - return; - } - - if (reinterpret_cast<LPVOID>(pGuard->m_pMarker) > pSP) - { - // We have caught an exception while processing an exception. So can't restore the marker and must - // wait until the catcher of the original exception handles it. - if (!IsBackoutCalledForEH((BYTE *)(pGuard), static_cast<BYTE *>(pSP))) - { - // verfiy that really are processing an exception. We could have some false positives here, but in - // general this is a good check. - _ASSERTE(!"After an exception was caught, we couldn't restore the marker because it is greater than the SP\n" - "This should only happen if we caught a nested exception when already processing an exception, but" - " the distance between the SP and the probe does not indicate an exception is in flight."); - } - return; - } - - // Reset the SO-tolerance state - - // We should never get here with a guard beyond the current SP - _ASSERTE(reinterpret_cast<LPVOID>(pGuard) > pSP); - - LOG((LF_EH, LL_INFO100000, "BSG::RSG: G: %p D: %d \n", pGuard, pGuard->m_depth)); - - // If we have EX_TRY {EX_TRY {...}EX_CATCH{...}EX_END_CATCH}EX_CATCH{...}EX_END_CATCH, - // the inner EX_END_CATCH will mark the current guard protected. When we reach the - // outer EX_END_CATCH, we will AV when placing marker. - pGuard->UndoPageProtectionInDebugger(); - if (fWasDisabled) - pGuard->EnableGuard(); - // Replace the marker for the current guard - PlaceMarker(pGuard->m_pMarker); - - // Protect marker page in debugger if we need it - pGuard->ProtectMarkerPageInDebugger(); - GetClrDebugState()->ResetSOTolerance(); - pGuard->m_fEHInProgress = FALSE; -} - -//----------------------------------------------------------------------------- -// This places a marker outside the bounds of a probe. We don't want to use -// PlaceMarker because that is how we detect if a proper SO was triggered (via -// StackProbeContainsIP -//----------------------------------------------------------------------------- -static __declspec(noinline) void PlaceMarkerBeyondProbe(UINT_PTR *pMarker) -{ - *pMarker = STACK_COOKIE_VALUE; -} - -//--------------------------------------------------------------------------------------------- -// Determine if we should check integrity of previous cookie. Only check if the previous was a probe guard. -//--------------------------------------------------------------------------------------------- -inline BOOL BaseStackGuard::ShouldCheckPreviousCookieIntegrity() -{ - WRAPPER_NO_CONTRACT; - if (m_pPrevGuard == NULL || - IsBoundaryGuard(m_pPrevGuard) || - m_pPrevGuard->m_pMarker==NULL || - m_pPrevGuard->m_fEHInProgress || - !m_pPrevGuard->Enabled()) - { - return FALSE; - } - return TRUE; -} - -//--------------------------------------------------------------------------------------------- -// Determine if we should check integrity of this cookie. -//--------------------------------------------------------------------------------------------- -inline BOOL BaseStackGuard::ShouldCheckThisCookieIntegrity() -{ - WRAPPER_NO_CONTRACT; - // We only need to check if this is a probe guard and it has a non-null marker. - // Anything else, we don't care about. - return IsProbeGuard(this) && m_pMarker != NULL && Enabled(); -} - -BOOL BaseStackGuard::RequiresNStackPages(unsigned int n, BOOL fThrowsOnSO) -{ - WRAPPER_NO_CONTRACT; - - return RequiresNStackPagesInternal(n, fThrowsOnSO); -} - -BOOL BaseStackGuard::RequiresNStackPagesThrowing(unsigned int n) -{ -// STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_THROWS; - STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; - STATIC_CONTRACT_GC_NOTRIGGER; - - return RequiresNStackPagesInternal(n, TRUE); -} - -BOOL BaseStackGuard::RequiresNStackPagesNoThrow(unsigned int n) -{ - STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; - STATIC_CONTRACT_GC_NOTRIGGER; - - return RequiresNStackPagesInternal(n, FALSE); -} - -//----------------------------------------------------------------------------- -// Place guard in stack. -//----------------------------------------------------------------------------- -BOOL BaseStackGuard::RequiresNStackPagesInternal(unsigned int n, BOOL fThrowOnSO) -{ - CONTRACTL - { - DISABLED(THROWS); - GC_NOTRIGGER; - MODE_ANY; - SO_TOLERANT; - } - CONTRACTL_END; - - BOOL fRet; - - // Temporarily initialize the exception occurred flag - m_exceptionOccurred = FALSE; - - // Code below checks if there's a Thread, and exits immediately if not. - // So the rest of the function rightly assumes there is a Thread - BEGIN_GETTHREAD_ALLOWED; - - // only probe on managed threads. No thread, no probe. - if (! IsStackProbingEnabled() || GetThread() == NULL) - { - return TRUE; - } - - // Don't try to probe if we are checking backout and there are active backout markers on - // the stack to avoid collision - if (g_EnableBackoutStackValidation) - { - if ((!(GetClrDebugState()->GetStackMarkerStack().IsEmpty())) - && (!(GetClrDebugState()->GetStackMarkerStack().IsDisabled()))) - { - return TRUE; - } - } - - if (n <= 1) - { - // Our calculation below doesn't handle 1-page probes. - _ASSERTE(!"RequiresNStackPages called with a probe amount less than 2"); - } - - // Retrieve the current stack pointer which will be used to calculate the marker. - LPVOID pStack = (LPVOID)GetCurrentSP(); - - // Setup some helpful debugging information. Get our caller's ip. This is useful for debugging (so we can see - // when the previous guard was set). - m_UniqueId = g_UniqueId++; - m_numPages = n; - - // Get the address of the last few bytes on the penultimate page we probed for. This is slightly early than the probe point, - // but gives us more conservatism in our overrun checking. ("Last" here means the bytes with the smallest address.) - m_pMarker = ((UINT_PTR*)pStack) - (GetOsPageSize() / sizeof(UINT_PTR) * (n-1)); - m_pMarker = (UINT_PTR*)((UINT_PTR)m_pMarker & ~(GetOsPageSize() - 1)); - - // Grab the previous guard, if any, and update our depth. - m_pPrevGuard = GetCurrentGuard(); - - if (m_pPrevGuard == NULL) - { - m_depth = 0; - } - else - { - // If we've already got a probe in place that exceeds the reach of this one, then - // don't install this one. This avoids problems where we've installed an entry point - // probe and then called into a function that happens to do an interior probe. If we - // install the interior probe, then we effectively lose our deep entry point probe - // and end up with probe overrun violations. Check for it being a probe guard - // because boundary guards will always have 0 markers and we'd never probe - // after a boundary guard otherwise. - if (IsProbeGuard(m_pPrevGuard) && m_pPrevGuard->m_pMarker < m_pMarker) - { - return TRUE; - } - m_depth = m_pPrevGuard->m_depth + 1; - - // We need to undo the page protection that we setup when we put the previous guard in place so we don't - // trip over it with this guard. Also, track that we came next. - if (IsProbeGuard(m_pPrevGuard) && m_pPrevGuard->m_pMarker != NULL) - { - m_pPrevGuard->UndoPageProtectionInDebugger(); - m_pPrevGuard->m_szNextFunction = m_szFunction; - m_pPrevGuard->m_szNextFile = m_szFile; - m_pPrevGuard->m_nextLineNum = m_lineNum; - } - } - - if (ShouldCheckPreviousCookieIntegrity()) - { - UINT_PTR *approxSP = (UINT_PTR*)GetCurrentSP(); - if (approxSP <= m_pPrevGuard->m_pMarker) - { - UINT_PTR uProbeShortFall = (char*)m_pPrevGuard->m_pMarker - (char*)approxSP; - _ASSERTE(FitsIn<int>(uProbeShortFall)); - HandleOverwrittenPreviousStackGuard(static_cast<int>(uProbeShortFall), NULL); - } - } - - m_eInitialized = cPartialInit; - - fRet = DoProbe(m_numPages, fThrowOnSO); - END_GETTHREAD_ALLOWED; - return fRet; -} - -BOOL BaseStackGuard::DoProbe(unsigned int n, BOOL fThrowOnSO) -{ - CONTRACTL - { - DISABLED(THROWS); - MODE_ANY; - WRAPPER(GC_TRIGGERS); - SO_TOLERANT; - } - CONTRACTL_END; - - if (! IsStackProbingEnabled() || m_eInitialized != cPartialInit) - { - return TRUE; - } - - LOG((LF_EH, LL_INFO100000, "BSG::DP: %d pages, depth %d, probe 0x%p, fcn %s, prev 0x%p\n", - m_numPages, m_depth, this, this->m_szFunction, m_pPrevGuard)); - - // For cases where have a separate call to DoProbe, make sure the probe amounts match. - _ASSERTE(n == m_numPages); - - // We'll probe for 12 pages + 4 for cleanup.... we'll just put our marker at the 12 page point. - unsigned int nPagesToProbe = n + static_cast<unsigned int>(ADJUST_PROBE(BACKOUT_CODE_STACK_LIMIT)); - - Thread *pThread = GetThread(); - - // We already checked in RequiresNPagesStack that we've got a thread. But ASSERT just to - // be sure. - _ASSERTE(pThread); - - // Check if we have enough space left in the stack - if (fThrowOnSO) - { - RetailStackProbe(nPagesToProbe, pThread); - } - else if (! RetailStackProbeNoThrow(nPagesToProbe, pThread)) - { - return FALSE; - } - - // The fault injection framework will tell us when it want to inject - // an SO. If it returns TRUE, then inject an SO depending on the fThrowOnSO flag - if (ReportProbeToFaultInjectionFramework() == TRUE) - { - if (fThrowOnSO) - { - COMPlusThrowSO(); - } - // return probe failure (ie SO) if not in a throwing probe - return FALSE; - } - - LOG((LF_EH, LL_INFO100000, "BSG::DP: pushing to 0x%p\n", m_pMarker)); - - // See if we're able to get a TLS slot to mark our guard page - HRESULT hr = PrepGuard(); - - // Since we can be here only with a valid managed thread object, - // it will already have its TLS setup. Thus, accessing TLS in PrepGuard - // call above shouldn't fail. - _ASSERTE(SUCCEEDED(hr)); - - // make sure the guard page is beyond the marker page, otherwise we could AV or when the guard - // page moves up, it could wipe out our debugger page protection - UINT_PTR *sp = (UINT_PTR*)GetCurrentSP(); - while (sp >= m_pMarker) - { - sp -= (GetOsPageSize() / sizeof(UINT_PTR)); - *sp = NULL; - } - - // Write the cookie onto the stack. - PlaceMarker(m_pMarker); - - // We'll protect the page where we put the marker if a debugger is attached. That way, you get an AV right away - // when you go past the guard when running under a debugger. - ProtectMarkerPageInDebugger(); - - // Mark that we're initialized (and didn't get interupted from an exception) - m_eInitialized = cInit; - - // Initialize the exception occurred flag - m_exceptionOccurred = TRUE; - - // setup flag to tell if we're unwinding due to an exception - m_fEHInProgress = FALSE; - - // By this point, everything is working, so go ahead and hook up. - SetCurrentGuard(this); - - return TRUE; -} - - -//----------------------------------------------------------------------------- -// PopGuardForEH -// -// If we are being popped during an EH unwind, our cookie is likely corrupt so we can't check it. -// So just pop ourselves off the stack and return. We will restore the markers -// after we've caught the exception. -// -// We also set the EHInProgress bit on the previous guard to indicate that the -// current guard was unwound during EH and couldn't restore the previous guard's -// cookie. -// -// Also need to clear the protection bit as go down because it will no -// longer be protected. -//----------------------------------------------------------------------------- -void BaseStackGuard::PopGuardForEH() -{ - LIMITED_METHOD_CONTRACT; - // If we've protected this page, undo the protection - UndoPageProtectionInDebugger(); - - if (m_pPrevGuard) - { - m_pPrevGuard->m_fEHInProgress = TRUE; - - // Indicate that we haven't reprotected the previous guard - m_pPrevGuard->m_fProtectedStackPage = FALSE; - } - // Mark it as unwound for EH. This is for debugging purposes only so we - // know how it was popped. - m_eInitialized = cEHUnwound; - SetCurrentGuard(m_pPrevGuard); -} - -//----------------------------------------------------------------------------- -// Check guard in stack -// This must be called 1:1 with RequiresNPagesStack, else: -// - the function's stack cookie isn't restored -// - the stack chain in TLS gets out of wack. -//----------------------------------------------------------------------------- -void BaseStackGuard::CheckStack() -{ - WRAPPER_NO_CONTRACT; - - if (! IsStackProbingEnabled() || m_eInitialized != cInit) - { - return; - } - - // If we are being popped during an EH unwind, our cookie is likely corrupt so we can't check it. - // So just pop ourselves off the stack and return. We will restore the markers - // after we've caught the exception. - if (DidExceptionOccur()) - { - // We may not be the topmost in the stack, but we'd better not be called when we've already - // unwound the stack past this guy. - _ASSERTE(GetCurrentGuard() <= this); - - // Make sure that if we didn't get to the END_SO_INTOLERANT_CODE that the stack usage - // indicates an exception. This is only a rough check - we might miss some cases where the - // stack grew a lot between construction and descrution of the guard. However, it will - // catch most short-circuits. - if (!IsBackoutCalledForEH((BYTE *)(this), static_cast<BYTE *>((LPVOID)GetCurrentSP()))) - { - _ASSERTE(!"Short-circuit of END_SO_INTOLERANT_CODE detected. You cannot short-cirtuit return from an SO-intolerant region"); - } - - LOG((LF_EH, LL_INFO100000, "BSG::CS on EH path sp 0x %p popping probe 0x%p depth %d \n", GetCurrentSP(), this, m_depth)); - PopGuardForEH(); - return; - } - - LOG((LF_EH, LL_INFO100000, "BSG::CS checking probe 0x%p depth %d \n", this, m_depth)); - - // if we aren't being unwound during EH, then we shouldn't have our EHInProgress bit set. That - // means we caught the exception in the EE and didn't call RestoreGuard or we missed a SO-tolerant - // transition out of the EE and the exception occurred above us. - _ASSERTE(m_fEHInProgress == FALSE); - - // we should only ever be popping ourselves if we are not on the EH unwind path - _ASSERTE(GetCurrentGuard() == this); - - // Can have 0-sized probes for cases where have an entry that is small enough not to need a probe. But still - // need to put something in place for the boundary probe assertions to work properly. So just remove it and - // don't do any cookie checking. - if (m_numPages == 0) - { - // Just unhook our guard from the chain. We're done. 0-page probes don't have anything preceding them. - ResetCurrentGuard(m_pPrevGuard); - return; - } - - // We need to undo the page protection that we setup when we put the guard in place. - UndoPageProtectionInDebugger(); - - CheckMarkerIntegrity(); - - RestorePreviousGuard(); -} - -void BaseStackGuard::CheckMarkerIntegrity() -{ - LIMITED_METHOD_CONTRACT; - - if (m_pMarker == 0) - { - return; - } - - // Make sure our cookie is still on the stack where it belongs. - if (ShouldCheckThisCookieIntegrity() && IsMarkerOverrun(m_pMarker)) - { - HandleOverwrittenThisStackGuard(NULL); - } -} - - -void BaseStackGuard::RestorePreviousGuard() -{ - WRAPPER_NO_CONTRACT; - - if (! IsProbeGuard(m_pPrevGuard) || !m_pPrevGuard->Enabled()) - { - LOG((LF_EH, LL_INFO100000, "BSG::RPG depth %d, probe 0x%p, prev 0x%p not probe\n", - m_depth, this, m_pPrevGuard)); - // Unhook our guard from the chain. - ResetCurrentGuard(m_pPrevGuard); - return; - } - - if (m_pPrevGuard->m_fEHInProgress) - { - // If the marker was lost during exception processing, we cannot restore it and it will be restored on the catch. - // This can happen if we were partway through an EH unwind and then called something that probed. We'll have unwound our - // probe guards but won't have been able to put the cookie back, and we're still in that same position. - LOG((LF_EH, LL_INFO100000, "BSG::RPG depth %d, probe 0x%p, EH in progress, not resetting prev 0x%p\n", - m_depth, this, m_pPrevGuard)); - // Unhook our guard from the chain. - ResetCurrentGuard(m_pPrevGuard); - return; - } - - if (m_pPrevGuard->m_pMarker == NULL) - { - // Previous guard had no marker. - // We're done, so just unhook ourselves from the chain and leave. - ResetCurrentGuard(m_pPrevGuard); - } - - // Restore last cookie, so that our previous guard will be able to properly check whether it gets overwritten. Note: - // we don't restore the previous cookie if we overwrote it with this guard. Doing so, by definition, corrupts the - // stack. Its better to have the previous guard report the over-write. - PlaceMarker(m_pPrevGuard->m_pMarker); - LOG((LF_EH, LL_INFO100000, "BSG::RPG depth %d, probe 0x%p " - "for prev 0x%p at 0x%p in %s\n", - m_depth, this, m_pPrevGuard, m_pPrevGuard->m_pMarker, m_pPrevGuard->m_szFunction)); - // And, of course, restore the previous guard's page protection (if it had done any.) - if (m_pPrevGuard->m_fProtectedStackPage) - { - m_pPrevGuard->ProtectMarkerPageInDebugger(); - } - - // Mark it as unwound on normal path. This is for debugging purposes only so we - // know how it was popped. - m_eInitialized = cUnwound; - - // Unhook our guard from the chain. - ResetCurrentGuard(m_pPrevGuard); -} - -void BaseStackGuard::ProtectMarkerPageInDebugger(void *pGuard) -{ - ((BaseStackGuard *)pGuard)->ProtectMarkerPageInDebugger(); -} - -//----------------------------------------------------------------------------- -// Protect the page where we put the marker if a debugger is attached. That way, you get an AV right away -// when you go past the guard when running under a debugger. -//----------------------------------------------------------------------------- -void BaseStackGuard::ProtectMarkerPageInDebugger() -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - SO_TOLERANT; - MODE_ANY; - } - CONTRACTL_END; - - DEBUG_ONLY_FUNCTION; - - if (! (g_ProtectStackPagesInDebugger || g_ProtectStackPagesInDebuggerForProbeAtLine)) - { - return; - } - - DWORD flOldProtect; - - LOG((LF_EH, LL_INFO100000, "BSG::PMP: m_pMarker 0x%p, value 0x%p\n", m_pMarker, *m_pMarker)); - - // We cannot call into host for VirtualProtect. EEVirtualProtect will try to restore previous - // guard, but the location has been marked with PAGE_NOACCESS. -#undef VirtualProtect - BOOL fSuccess = ::VirtualProtect(m_pMarker, 1, PAGE_NOACCESS, &flOldProtect); - _ASSERTE(fSuccess); - -#define VirtualProtect(lpAddress, dwSize, flNewProtect, lpflOldProtect) \ - Dont_Use_VirtualProtect(lpAddress, dwSize, flNewProtect, lpflOldProtect) - - m_fProtectedStackPage = fSuccess; -} - - -void BaseStackGuard::UndoPageProtectionInDebugger(void *pGuard) -{ - ((BaseStackGuard *)pGuard)->UndoPageProtectionInDebugger(); -} - -//----------------------------------------------------------------------------- -// Remove page protection installed for this probe -//----------------------------------------------------------------------------- -void BaseStackGuard::UndoPageProtectionInDebugger() -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - SO_TOLERANT; - MODE_ANY; - } - CONTRACTL_END; - - DEBUG_ONLY_FUNCTION; - - if (!m_fProtectedStackPage) - { - return; - } - - _ASSERTE(IsProbeGuard()); - - DWORD flOldProtect; - // EEVirtualProtect installs a BoundaryStackGuard. To avoid recursion, we call - // into OS for VirtualProtect instead. -#undef VirtualProtect - BOOL fSuccess = ::VirtualProtect(m_pMarker, 1, PAGE_READWRITE, &flOldProtect); - _ASSERTE(fSuccess); - - LOG((LF_EH, LL_INFO100000, "BSG::UMP m_pMarker 0x%p\n", m_pMarker)); - // Frankly, if we had protected the stack page, then we shouldn't have gone past the guard, right? :) - _ASSERTE(!Enabled() || !IsMarkerOverrun(m_pMarker)); - -#define VirtualProtect(lpAddress, dwSize, flNewProtect, lpflOldProtect) \ - Dont_Use_VirtualProtect(lpAddress, dwSize, flNewProtect, lpflOldProtect) -} - -void BaseStackGuard::InitProbeReportingToFaultInjectionFramework() -{ - WRAPPER_NO_CONTRACT; - - if (! g_pConfig->ShouldInjectFault(INJECTFAULT_SO)) - { - return; - } - - m_hProbeCallBack = CLRLoadLibrary(MAKEDLLNAME_W(W("FaultHostingLayer"))); - if (!m_hProbeCallBack) { - fprintf(stderr, "StackProbing: Failed to load " MAKEDLLNAME_A("FaultHostingLayer") ". LastErr=%d\n", - GetLastError()); - return; - } - - m_pfnProbeCallback = (ProbeCallbackType)GetProcAddress(m_hProbeCallBack, "StackProbeCallback"); - if (!m_pfnProbeCallback) { - fprintf(stderr, "StackProbing: Couldn't find StackProbeCallback() in FaultHostingLayer\n"); - return; - } -} - -// The fault injection framework will return TRUE if we should -// inject an SO at the point of the current probe. -BOOL BaseStackGuard::ReportProbeToFaultInjectionFramework() -{ - STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - STATIC_CONTRACT_MODE_ANY; - - if (! g_pConfig->ShouldInjectFault(INJECTFAULT_SO) || ! m_pfnProbeCallback) - { - return FALSE; - } - - // FORBIDGC_LOADER_USE_ENABLED says we are only doing a minimal amount of work and will not - // update global state (just read it.) Code running in this state cannot tolerate a fault injection. - if (FORBIDGC_LOADER_USE_ENABLED()) - { - return FALSE; - } - - // For codepaths that are not mainline or are debug only, we don't care about fault injection because - // taking an SO here won't matter (or can't happen). However, we'd like to still probe on those paths - // just to give us more conservative probe coverage, so we still do the probe, just not the fault injection. - ClrDebugState *pDebugState = GetClrDebugState(); - if (pDebugState && pDebugState->IsSONotMainline() || pDebugState->IsDebugOnly()) - { - return FALSE; - } - - - // Faults injected into the default domain are process fatal. Probing is still going to occur - // but we never trigger fault injection. - { - //Attempting to figure out if we are in the default domain will trigger SO probes so - // we temporarily mark ourselves SONotMainline during the check to prevent recursive probes - SO_NOT_MAINLINE_REGION(); - Thread *pThread = GetThreadNULLOk(); - if (pThread && pThread->GetDomain(TRUE)->IsDefaultDomain()) - { - return FALSE; - } - } - - return m_pfnProbeCallback(m_lineNum, m_szFile); -} - -void BaseStackGuard::SetCurrentGuard(BaseStackGuard* pGuard) -{ - WRAPPER_NO_CONTRACT; - - ClrFlsSetValue(g_CurrentStackGuardTlsIdx, pGuard); - - Thread * pThread = GetThreadNULLOk(); - if (pThread) - { - // For faster access, store the guard in the thread object, if available - pThread->SetCurrentStackGuard(pGuard); - } -} - -// Reset the current guard state back to this one's -void BaseStackGuard::ResetCurrentGuard(BaseStackGuard* pGuard) -{ - WRAPPER_NO_CONTRACT; - - SetCurrentGuard(pGuard); -} - -// This puts a boundary probe in the list when we leave the EE -DEBUG_NOINLINE void BoundaryStackGuard::Push() -{ - SCAN_SCOPE_BEGIN; - ANNOTATION_FN_SO_TOLERANT; - - if (! IsStackProbingEnabled()) - { - return; - } - - - m_isBoundaryGuard = TRUE; - m_pPrevGuard = GetCurrentGuard(); - - if (m_pPrevGuard) - { - // @todo can remove the check for IsProbeGuard when have all the probes in place - if (IsProbeGuard(m_pPrevGuard)) - { - // ensure that the previous probe was sufficiently large - if (ShouldCheckPreviousCookieIntegrity()) - { - // Grab an approximation of our current stack pointer. - void *approxStackPointer = (LPVOID)GetCurrentSP(); - - if (((UINT_PTR*) approxStackPointer <= m_pPrevGuard->Marker())) - { - UINT_PTR uProbeShortFall = (char*)m_pPrevGuard->Marker() - (char*)this; - _ASSERTE(FitsIn<int>(uProbeShortFall)); - HandleOverwrittenPreviousStackGuard(static_cast<int>(uProbeShortFall), NULL); - } - } - m_pPrevGuard->UndoPageProtectionInDebugger(); // undo previuos guard's page protection - m_pPrevGuard->m_szNextFunction = m_szFunction; // track that we came next - m_pPrevGuard->m_szNextFile = m_szFile; - m_pPrevGuard->m_nextLineNum= m_lineNum; - } - m_depth = m_pPrevGuard->Depth(); // don't increment, but record so can transfer to next probe - } - LOG((LF_EH, LL_INFO100000, "BNSG::PS probe 0x%p, depth %d, prev 0x%p in %s\n", - this, m_depth, m_pPrevGuard, m_pPrevGuard ? m_pPrevGuard->FunctionName() : NULL)); - - // See if we're able to get a TLS slot to mark our guard page. If not, this will just be an unitialized - // guard. This generally happens in callbacks to the host before the EE infrastructure is set up on - // the thread, so there won't be interesting probes to protect anyway. - if (FAILED(PrepGuard())) - { - return; - } - - // Mark that we're initialized (and didn't get interupted from an exception) - m_eInitialized = cInit; - - // setup flag to tell if we're unwinding due to an exception - m_exceptionOccurred = TRUE; - - SetCurrentGuard(this); -} - - - -// Pop the boundary probe and reset the original probe's cookie when -// return into the EE -DEBUG_NOINLINE void BoundaryStackGuard::Pop() -{ - SCAN_SCOPE_END; - - if (! IsStackProbingEnabled() || m_eInitialized != cInit) - { - return; - } - - // If we are being popped during an EH unwind, we cannot restore the probe cookie because it will - // corrupt the stack. So just pop ourselves off the stack and return. We will restore the markers - // after we've caught the exception. - if (DidExceptionOccur()) - { - // We may not be the topmost in the stack, but we'd better not be called when we've already - // unwound the stack past this guy. - _ASSERTE(GetCurrentGuard() <= this); - - // Make sure that if we didn't get to the END_SO_TOLERANT_CODE that the stack usage - // indicates an exception. This is only a rough check - we might miss some cases where the - // stack grew a lot between construction and descrution of the guard. However, it will - // catch most short-circuits. - if (!IsBackoutCalledForEH((BYTE *)(this), static_cast<BYTE *>((LPVOID)GetCurrentSP()))) - { - _ASSERTE(!"Short-circuit of END_SO_TOLERANT_CODE detected. You cannot short-cirtuit return from an SO-tolerant region"); - } - - LOG((LF_EH, LL_INFO100000, "BNSG::PP popping on EH path 0x%p depth %d \n", this, m_depth)); - PopGuardForEH(); - return; - } - - LOG((LF_EH, LL_INFO100000, "BNSG::PP 0x%p depth %d restoring CK at 0x%p " - " probe 0x%p in %s\n", - this, m_depth, (!IsProbeGuard(m_pPrevGuard) ? 0 : m_pPrevGuard->Marker()), - m_pPrevGuard, m_pPrevGuard ? m_pPrevGuard->FunctionName() : NULL)); - - // we should only ever be popping ourselves - _ASSERTE(GetCurrentGuard() == this); - - RestorePreviousGuard(); -} - - -// -// IsBackoutCalledForEH -// -// Uses heuristics to determines whether the backout code is being called on an EH path or -// not based on the original SP and the SP when the backout code is called. -// -// origSP: The SP when the mainline code was called. For example, the SP of a ctor or code in a try block -// -// backoutSP: The SP when the backout code is called. -// -// Returns: boolean indicating whether or not the backout code is being called on an EH path. -// -BOOL IsBackoutCalledForEH(BYTE *origSP, - BYTE *backoutSP) -{ - // We need to determine if we are being called in the normal or exception path. (Sure would be - // nice if the CRT would tell us.) We use the stack pointer to determine this. On the normal path - // the stack pointer should be not far from the this pointer, whereas on the exception path it - // will typically be a lot higher up the stack. We will make the following assumptions: - // - // 1) on EH path the OS has to push a context onto the stack. So the SP will be increased by - // at least the size of a context when calling a destructor through EH path. - // - // 2) the CRT will use minimal stack space to call a destructor. This is assumed to be less - // than the size of a context. - // - // Caveats: - // - // 1) If there is less than a context on the stack on the EH path, we will miss the fact that - // an exception occurred - // - // 2) If the CRT uses near the size of a context before calling the destructor in the normal case, - // we will assume we've got an exception and ASSERT. - // - // So if we arrive at our backout code and the SP is more than the size of a context beyond the original SP, - // we assume we are on an EH path. - // - return (origSP - sizeof(CONTEXT)) > backoutSP; - -} - - -DebugSOIntolerantTransitionHandlerBeginOnly::DebugSOIntolerantTransitionHandlerBeginOnly(EEThreadHandle thread) -{ - SCAN_SCOPE_BEGIN; - ANNOTATION_FN_SO_INTOLERANT; - - // save the SP so that we can check if the dtor is being called with a much bigger one - m_ctorSP = (char *)GetCurrentSP(); - m_clrDebugState = GetClrDebugState(); - m_prevSOTolerantState = m_clrDebugState->BeginSOIntolerant(); -} - -DebugSOIntolerantTransitionHandlerBeginOnly::~DebugSOIntolerantTransitionHandlerBeginOnly() -{ - SCAN_SCOPE_END; - - // A DebugSOIntolerantTransitionHandlerBeginOnly is instantiated only for cases where we will not see - // an exception. So the desctructor should never be called on an exception path. This will check if - // we are handling an exception and raise an assert if so. - - // - // We need to determine if we are being called in the normal or exception path. (Sure would be - // nice if the CRT would tell us.) We use the stack pointer to determine this. On the normal path - // the stack pointer should be not far from the this pointer, whereas on the exception path it - // will typically be a lot higher up the stack. We will make the following assumptions: - // - // 1) on EH path the OS has to push a context onto the stack. So the SP will be increased by - // at least the size of a context when calling a destructor through EH path. - // - // 2) the CRT will use minimal stack space to call a destructor. This is assumed to be less - // than the size of a context. - // - // Caveats: - // - // 1) If there is less than a context on the stack on the EH path, we will miss the fact that - // an exception occurred - // - // 2) If the CRT uses near the size of a context before calling the destructor in the normal case, - // we will assume we've got an exception and ASSERT. - // - // So if we arrive at our destructor and the SP is within the size of a context beyond the SP when - // we called the ctor, we assume we are on normal path. - if ((m_ctorSP - sizeof(CONTEXT)) > (LPVOID)GetCurrentSP()) - { - _ASSERTE(!"An exception cannot leak through a SO_INTOLERANT_CODE_NOTHROW boundary"); - } - - m_clrDebugState->SetSOTolerance(m_prevSOTolerantState); -} -#endif // STACK_GUARDS_DEBUG - -#if defined(FEATURE_STACK_PROBE) && defined(_DEBUG) - -#undef __STACKPROBE_inl__ - -#define INCLUDE_RETAIL_STACK_PROBE - -#include "stackprobe.inl" - -#endif // defined(FEATURE_STACK_PROBE) && defined(_DEBUG) - -#if 0 //FEATURE_FUSION_FAST_CLOSURE - was too buggy at the end of Dev10, not used since then. Delete it after Dev12 if it is still not fixed and used. - -#ifdef FEATURE_STACK_PROBE -// This is a helper that fusion (CFastAssemblyBindingClosure) uses to -// do an interior stack probe. -HRESULT InteriorStackProbeNothrowCheckThread() -{ - STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_MODE_ANY; - - HRESULT hr = S_OK; - INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(hr = E_OUTOFMEMORY;); - END_INTERIOR_STACK_PROBE; - - return hr; -} -#endif - -#endif //0 - FEATURE_FUSION_FAST_CLOSURE diff --git a/src/vm/stackprobe.h b/src/vm/stackprobe.h deleted file mode 100644 index 0bf08b7423..0000000000 --- a/src/vm/stackprobe.h +++ /dev/null @@ -1,991 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. -// - -// -//----------------------------------------------------------------------------- -// Stack Probe Header -// Used to setup stack guards -//----------------------------------------------------------------------------- - -#ifndef __STACKPROBE_h__ -#define __STACKPROBE_h__ - -//----------------------------------------------------------------------------- -// Stack Guards. -// -// The idea is to force stack overflows to occur at convenient spots. -// * Fire at RequiresNPagesStack (beggining of func) if this functions locals -// cause overflow. Note that in a debug mode, initing the locals to garbage -// will cause the overflow before this macro is executed. -// -// * Fire at CheckStack (end of func) if either our nested function calls -// cause or use of _alloca cause the stack overflow. Note that this macro -// is debug only, so release builds won't catch on this -// -// Some comments: -// - Stack grows *down*, -// - Ideally, all funcs would have EBP frame and we'd use EBP instead of ESP, -// however, we use the 'this' ptr to get the stack ptr, since the guard -// is declared on the stack. -// -// Comments about inlining assembly w/ Macros: -// - Must use cstyle comments /* ... */ -// - No semi colons, need __asm keyword at the start of each line -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// *How* to use stack guards. -// -// See, in a CLR enlistment, src\ndp\clr\doc\OtherDevDocs\untriaged\clrdev_web\ -// -//----------------------------------------------------------------------------- - -//----------------------------------------------------------------------------- -// Stack guards have 3 compiler states: -//#define FEATURE_STACK_PROBE -// (All) All stack guard code is completely removed by the preprocessor if -// not defined. This is used for CoreCLR. -// -//#define STACK_GUARDS_DEBUG -// (DEBUG) Full stack guard debugging including cookies, tracking ips, and -// chaining. More heavy weight, recommended for a debug build only -// -//#define STACK_GUARDS_RELEASE -// (RELEASE) Light stack guard code. For golden builds. Forces Stack Overflow -// to happen at "convenient" times. No debugging help. -//----------------------------------------------------------------------------- - -#include "genericstackprobe.h" -#include "utilcode.h" - -/* defining VM_NO_SO_INFRASTRUCTURE_CODE for VM code - * This macro can be used to have code which will be present - * only for code inside VM directory when SO infrastructure code is not built. - * Eg. Currently it is used in macro EX_END_HOOK. - * For VM code EX_HOOK calls CLREXception::HandleState::SetupCatch(). - * When Stack guards are disabled we will tear down the process in - * CLREXception::HandleState::SetupCatch() if there is a StackOverflow. - * So we should not reach EX_END_HOOK when there is StackOverflow. - * This change cannot be done for all other code because - * CLREXception::HandleState::SetupCatch() is not called rather - * EXception::HandleState::SetupCatch() is called which is a nop. - */ - -#ifndef FEATURE_STACK_PROBE -#undef VM_NO_SO_INFRASTRUCTURE_CODE -#define VM_NO_SO_INFRASTRUCTURE_CODE(x) x -#endif - - -#ifdef FEATURE_STACK_PROBE - -#define DEFAULT_INTERIOR_PROBE_AMOUNT 4 - -#define MINIMUM_STACK_REQUIREMENT (0.25) - -BOOL IsBackoutCalledForEH(BYTE *origSP, BYTE *backoutSP); - -//============================================================================= -// Common code -//============================================================================= -// Release version of the probe function -BOOL RetailStackProbeNoThrow(unsigned int n, Thread *pThread); -BOOL RetailStackProbeNoThrowWorker(unsigned int n, Thread *pThread); -void RetailStackProbe(unsigned int n, Thread *pThread); -void RetailStackProbeWorker(unsigned int n, Thread *pThread); -void ReportStackOverflow(); - -// Retail stack probe with default amount is the most common stack probe. Create -// a dedicated method for it to reduce code size. -void DefaultRetailStackProbeWorker(Thread * pThread); - -void RetailStackProbe(unsigned int n); - -BOOL ShouldProbeOnThisThread(); - -int SOTolerantBoundaryFilter(EXCEPTION_POINTERS *pExceptionInfo, DWORD * pdwSOTolerantFlags); -void SOTolerantCode_RecoverStack(DWORD dwFlags); -void SOTolerantCode_ExceptBody(DWORD * pdwFlags, Frame * pSafeForSOFrame); - -#endif - -#if defined(FEATURE_STACK_PROBE) && !defined(DACCESS_COMPILE) - -inline bool IsStackProbingEnabled() -{ - LIMITED_METHOD_CONTRACT; - return g_StackProbingEnabled; -} - -//============================================================================= -// DEBUG -//============================================================================= -#if defined(STACK_GUARDS_DEBUG) - -#include "common.h" - -class BaseStackGuard; - -//----------------------------------------------------------------------------- -// Need to chain together stack guard address for nested functions -// Use a TLS slot to store the head of the chain -//----------------------------------------------------------------------------- -extern DWORD g_CurrentStackGuardTlsIdx; - -//----------------------------------------------------------------------------- -// Class -//----------------------------------------------------------------------------- - -// Base version - has no ctor/dtor, so we can use it with SEH -// -// *** Don't declare any members here. Put them in BaseStackGuardGeneric. -// We downcast directly from the base to the derived, using the knowledge -// that the base class and the derived class are identical for members. -// -class BaseStackGuard : public BaseStackGuardGeneric -{ -protected: - BaseStackGuard() - { - _ASSERTE(!"No default construction allowed"); - } - -public: - BaseStackGuard(const char *szFunction, const char *szFile, unsigned int lineNum) : - BaseStackGuardGeneric(szFunction, szFile, lineNum) - { - STATIC_CONTRACT_LEAF; - } - - UINT_PTR *Marker() { return m_pMarker; } - - unsigned int Depth() { return m_depth; } - - const char *FunctionName() { return m_szFunction; } - - BOOL IsProbeGuard() - { - return (m_isBoundaryGuard == FALSE); - } - - BOOL IsBoundaryGuard() - { - return (m_isBoundaryGuard == TRUE); - } - - inline BOOL ShouldCheckPreviousCookieIntegrity(); - inline BOOL ShouldCheckThisCookieIntegrity(); - - BOOL RequiresNStackPages(unsigned int n, BOOL fThrowOnSO = TRUE); - BOOL RequiresNStackPagesThrowing(unsigned int n); - BOOL RequiresNStackPagesNoThrow(unsigned int n); -private: - BOOL RequiresNStackPagesInternal(unsigned int n, BOOL fThrowOnSO = TRUE); -public: - BOOL DoProbe(unsigned int n, BOOL fThrowOnSO); - void CheckStack(); - - static void RestoreCurrentGuard(BOOL fWasDisabled = FALSE); - void PopGuardForEH(); - - // Different error messages for the different times we detemine there's a problem. - void HandleOverwrittenThisStackGuard(__in_z char *stackID); - void HandleOverwrittenPreviousStackGuard(int shortFall, __in_z char *stackID); - void HandleOverwrittenCurrentStackGuard(int shortFall, __in_z char *stackID); - static void HandleOverwrittenCurrentStackGuard(void *pGuard, int shortFall, __in_z char *stackID); - - void CheckMarkerIntegrity(); - void RestorePreviousGuard(); - void ProtectMarkerPageInDebugger(); - void UndoPageProtectionInDebugger(); - static void ProtectMarkerPageInDebugger(void *pGuard); - static void UndoPageProtectionInDebugger(void *pGuard); - - inline HRESULT PrepGuard() - { - WRAPPER_NO_CONTRACT; - - // See if it has already been prepped... - if (ClrFlsGetValue(g_CurrentStackGuardTlsIdx) != NULL) - return S_OK; - - // Let's see if we'll be able to put in a guard page - ClrFlsSetValue(g_CurrentStackGuardTlsIdx, -(void*)-1); - - if (ClrFlsGetValue(g_CurrentStackGuardTlsIdx) != (void*)-1) - return E_OUTOFMEMORY; - - return S_OK; - - } - - inline static BaseStackGuard* GetCurrentGuard() - { - WRAPPER_NO_CONTRACT; - if (g_CurrentStackGuardTlsIdx != -1) - return (BaseStackGuard*) ClrFlsGetValue(g_CurrentStackGuardTlsIdx); - else - return NULL; - } - - inline static BOOL IsGuard(BaseStackGuard *probe) - { - return (probe != NULL); - } - static void SetCurrentGuard(BaseStackGuard* pGuard); - static void ResetCurrentGuard(BaseStackGuard* pGuard); - - inline static BOOL IsProbeGuard(BaseStackGuard *probe) - { - LIMITED_METHOD_CONTRACT; - return (IsGuard(probe) != NULL && probe->IsProbeGuard()); - } - - inline static BOOL IsBoundaryGuard(BaseStackGuard *probe) - { - LIMITED_METHOD_CONTRACT; - return (IsGuard(probe) != NULL && probe->IsBoundaryGuard()); - } - - static void InitProbeReportingToFaultInjectionFramework(); - BOOL ReportProbeToFaultInjectionFramework(); - - static void Terminate(); - - - static HMODULE m_hProbeCallBack; - typedef BOOL (*ProbeCallbackType)(unsigned, const char *); - static ProbeCallbackType m_pfnProbeCallback; - -}; - - -// Derived version, add a dtor that automatically calls Check_Stack, move convenient, but can't use with SEH. -class AutoCleanupStackGuard : public BaseStackGuard -{ -protected: - AutoCleanupStackGuard() - { - _ASSERTE(!"No default construction allowed"); - } - -public: - DEBUG_NOINLINE AutoCleanupStackGuard(const char *szFunction, const char *szFile, unsigned int lineNum) : - BaseStackGuard(szFunction, szFile, lineNum) - { - SCAN_SCOPE_BEGIN; - // This CANNOT be a STATIC_CONTRACT_SO_INTOLERANT b/c that isn't - // really just a static contract, it is actually calls EnsureSOIntolerantOK - // as well. Instead we just use the annotation. - ANNOTATION_FN_SO_INTOLERANT; - } - - DEBUG_NOINLINE ~AutoCleanupStackGuard() - { - SCAN_SCOPE_END; - CheckStack(); - } -}; - -class DebugSOIntolerantTransitionHandlerBeginOnly -{ - BOOL m_prevSOTolerantState; - ClrDebugState* m_clrDebugState; - char *m_ctorSP; - - public: - DEBUG_NOINLINE DebugSOIntolerantTransitionHandlerBeginOnly(EEThreadHandle thread); - DEBUG_NOINLINE ~DebugSOIntolerantTransitionHandlerBeginOnly(); -}; - - - -extern DWORD g_InteriorProbeAmount; - -//============================================================================= -// Macros for transition into SO_INTOLERANT code -//============================================================================= - -FORCEINLINE DWORD DefaultEntryProbeAmount() { return g_EntryPointProbeAmount; } - -#define BEGIN_SO_INTOLERANT_CODE(pThread) \ - BEGIN_SO_INTOLERANT_CODE_FOR(pThread, g_EntryPointProbeAmount) \ - -#define BEGIN_SO_INTOLERANT_CODE_FOR(pThread, n) \ - { \ - /*_ASSERTE(pThread); */ \ - AutoCleanupStackGuard stack_guard_XXX(__FUNCTION__, __FILE__, __LINE__); \ - stack_guard_XXX.RequiresNStackPagesThrowing(ADJUST_PROBE(n)); \ - /* work around unreachable code warning */ \ - if (true) \ - { \ - DebugSOIntolerantTransitionHandler __soIntolerantTransitionHandler; \ - ANNOTATION_SO_PROBE_BEGIN(DEFAULT_ENTRY_PROBE_AMOUNT); \ - /* work around unreachable code warning */ \ - if (true) \ - { \ - DEBUG_ASSURE_NO_RETURN_BEGIN(SO_INTOLERANT) - -#define BEGIN_SO_INTOLERANT_CODE_NOTHROW(pThread, ActionOnSO) \ - { \ - /*_ASSERTE(pThread || IsGCSpecialThread());*/ \ - AutoCleanupStackGuard stack_guard_XXX(__FUNCTION__, __FILE__, __LINE__); \ - if (! stack_guard_XXX.RequiresNStackPagesNoThrow(ADJUST_PROBE(g_EntryPointProbeAmount)))\ - { \ - stack_guard_XXX.SetNoException(); \ - ActionOnSO; \ - } \ - /* work around unreachable code warning */ \ - else \ - { \ - DebugSOIntolerantTransitionHandler __soIntolerantTransitionHandler; \ - ANNOTATION_SO_PROBE_BEGIN(DEFAULT_ENTRY_PROBE_AMOUNT); \ - /* work around unreachable code warning */ \ - if (true) \ - { \ - DEBUG_ASSURE_NO_RETURN_BEGIN(SO_INTOLERANT) - - -// This is defined just for using in the InternalSetupForComCall macro which -// doesn't have a corresponding end macro because no exception will pass through it -// It should not be used in any situation where an exception could pass through -// the transition. -#define SO_INTOLERANT_CODE_NOTHROW(pThread, ActionOnSO) \ - AutoCleanupStackGuard stack_guard_XXX(__FUNCTION__, __FILE__, __LINE__); \ - if (! stack_guard_XXX.RequiresNStackPagesNoThrow(ADJUST_PROBE(g_EntryPointProbeAmount)))\ - { \ - ActionOnSO; \ - } \ - stack_guard_XXX.SetNoException(); \ - DebugSOIntolerantTransitionHandlerBeginOnly __soIntolerantTransitionHandler(pThread); \ - ANNOTATION_SO_PROBE_BEGIN(DEFAULT_ENTRY_PROBE_AMOUNT); - - -// For some codepaths used during the handling of an SO, we need to guarantee a -// minimal stack consumption to avoid an SO on that codepath. These are typically host -// APIS such as allocation. The host is going to use < 1/4 page, so make sure -// we have that amount before calling. Then use the BACKOUT_VALIDATION to ensure -// that we don't overrun it. We call ReportStackOverflow, which will generate a hard -// SO if we have less than a page left. - -#define MINIMAL_STACK_PROBE_CHECK_THREAD(pThread) \ - if (IsStackProbingEnabled()) \ - { \ - Thread *__pThread = pThread; \ - if (__pThread && ! __pThread->IsStackSpaceAvailable(MINIMUM_STACK_REQUIREMENT)) \ - { \ - ReportStackOverflow(); \ - } \ - } \ - CONTRACT_VIOLATION(SOToleranceViolation); - -// We don't use the DebugSOIntolerantTransitionHandler here because we don't need to transition into -// SO-intolerant code. We're already there. We also don't need to annotate as having probed, -// because this only matters for entry point functions. -// We have a way to separate the declaration from the actual probing for cases where need -// to do a test, such as IsGCThread(), to decide if should probe. -#define DECLARE_INTERIOR_STACK_PROBE \ - { \ - AutoCleanupStackGuard stack_guard_XXX(__FUNCTION__, __FILE__, __LINE__);\ - DEBUG_ASSURE_NO_RETURN_BEGIN(STACK_PROBE) - - -// A function containing an interior probe is implicilty SO-Intolerant because we -// assume that it is not behind a probe. So confirm that we are in the correct state. -#define DO_INTERIOR_STACK_PROBE_FOR(pThread, n) \ - _ASSERTE(pThread != NULL); \ - stack_guard_XXX.RequiresNStackPagesThrowing(ADJUST_PROBE(n)); \ - EnsureSOIntolerantOK(__FUNCTION__, __FILE__, __LINE__); - -#define DO_INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(n) \ - if (ShouldProbeOnThisThread()) \ - { \ - DO_INTERIOR_STACK_PROBE_FOR(GetThread(), g_InteriorProbeAmount); \ - } - -// A function containing an interior probe is implicilty SO-Intolerant because we -// assume that it is not behind a probe. So confirm that we are in the correct state. -#define DO_INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, n, actionOnSO) \ - _ASSERTE(pThread != NULL); \ - if (! stack_guard_XXX.RequiresNStackPagesNoThrow(ADJUST_PROBE(n))) \ - { \ - stack_guard_XXX.SetNoException(); \ - actionOnSO; \ - } \ - EnsureSOIntolerantOK(__FUNCTION__, __FILE__, __LINE__); - -#define DO_INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(n, actionOnSO) \ - if (ShouldProbeOnThisThread()) \ - { \ - DO_INTERIOR_STACK_PROBE_FOR_NOTHROW(GetThread(), n, actionOnSO); \ - } - - -#define INTERIOR_STACK_PROBE_FOR(pThread, n) \ - DECLARE_INTERIOR_STACK_PROBE; \ - DO_INTERIOR_STACK_PROBE_FOR(pThread, n) - -#define INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(n) \ - DECLARE_INTERIOR_STACK_PROBE; \ - DO_INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(n) - -#define INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, n, ActionOnSO) \ - DECLARE_INTERIOR_STACK_PROBE; \ - DO_INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, n, ActionOnSO) - -#define INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(n, ActionOnSO) \ - DECLARE_INTERIOR_STACK_PROBE; \ - DO_INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(n, ActionOnSO) - - -#define INTERIOR_STACK_PROBE(pThread) \ - INTERIOR_STACK_PROBE_FOR(pThread, g_InteriorProbeAmount) - -#define INTERIOR_STACK_PROBE_CHECK_THREAD \ - INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(g_InteriorProbeAmount) - -#define INTERIOR_STACK_PROBE_NOTHROW(pThread, ActionOnSO) \ - INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, g_InteriorProbeAmount, ActionOnSO) - -#define INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(ActionOnSO) \ - INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(g_InteriorProbeAmount, ActionOnSO) - - -#define END_INTERIOR_STACK_PROBE \ - DEBUG_ASSURE_NO_RETURN_END(STACK_PROBE) \ - stack_guard_XXX.SetNoException(); \ - } - -#define RETURN_FROM_INTERIOR_PROBE(x) \ - DEBUG_OK_TO_RETURN_BEGIN(STACK_PROBE) \ - stack_guard_XXX.SetNoException(); \ - RETURN(x); \ - DEBUG_OK_TO_RETURN_END(STACK_PROBE) - - -// This is used for EH code where we are about to throw. -// To avoid taking an SO during EH processing, want to include it in our probe limits -// So we will just do a big probe and then throw. -#define STACK_PROBE_FOR_THROW(pThread) \ - AutoCleanupStackGuard stack_guard_XXX(__FUNCTION__, __FILE__, __LINE__); \ - if (pThread != NULL) \ - { \ - DO_INTERIOR_STACK_PROBE_FOR(pThread, ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT)); \ - } - -// This is used for throws where we cannot use a dtor-based probe. -#define PUSH_STACK_PROBE_FOR_THROW(pThread) \ - BaseStackGuard stack_guard_XXX(__FUNCTION__, __FILE__, __LINE__); \ - stack_guard_XXX.RequiresNStackPagesThrowing(ADJUST_PROBE(g_EntryPointProbeAmount)); - -#define SAVE_ADDRESS_OF_STACK_PROBE_FOR_THROW(pGuard) \ - pGuard = &stack_guard_XXX; - -#define RESET_EXCEPTION_FROM_STACK_PROBE_FOR_THROW(pGuard) \ - pGuard->SetNoException (); - -#define POP_STACK_PROBE_FOR_THROW(pGuard) \ - pGuard->CheckStack(); - -//============================================================================= -// Macros for transition into SO_TOLERANT code -//============================================================================= -// @todo : put this assert in when all probes are in place. -// _ASSERTE(! pThread->IsSOTolerant()); - -//********************************************************************************* - -// A boundary stack guard is pushed onto the probe stack when we leave the EE and -// popped when we return. It is used for 1) restoring the original probe's cookie -// when we return, as managed code could trash it and 2) marking a boundary so that -// we know not to check for over-written probes before it when install a real probe. -// -class BoundaryStackGuard : public BaseStackGuard -{ -protected: - BoundaryStackGuard() - { - LIMITED_METHOD_CONTRACT; - - _ASSERTE(!"No default construction allowed"); - } - -public: - DEBUG_NOINLINE BoundaryStackGuard(const char *szFunction, const char *szFile, unsigned int lineNum) - : BaseStackGuard(szFunction, szFile, lineNum) - { - SCAN_SCOPE_BEGIN; - ANNOTATION_FN_SO_TOLERANT; - - m_isBoundaryGuard = TRUE; - } - - DEBUG_NOINLINE void Push(); - DEBUG_NOINLINE void Pop(); - - DEBUG_NOINLINE void SetNoExceptionNoPop() - { - SCAN_SCOPE_END; - SetNoException(); - } - -}; - -// Derived version, add a dtor that automatically calls Pop, more convenient, but can't use with SEH. -class AutoCleanupBoundaryStackGuard : public BoundaryStackGuard -{ -protected: - AutoCleanupBoundaryStackGuard() - { - _ASSERTE(!"No default construction allowed"); - } - -public: - DEBUG_NOINLINE AutoCleanupBoundaryStackGuard(const char *szFunction, const char *szFile, unsigned int lineNum) : - BoundaryStackGuard(szFunction, szFile, lineNum) - { - SCAN_SCOPE_BEGIN; - ANNOTATION_FN_SO_TOLERANT; - } - - DEBUG_NOINLINE ~AutoCleanupBoundaryStackGuard() - { - SCAN_SCOPE_END; - Pop(); - } -}; - - -class DebugSOTolerantTransitionHandler -{ - BOOL m_prevSOTolerantState; - ClrDebugState* m_clrDebugState; - - public: - void EnterSOTolerantCode(Thread *pThread); - void ReturnFromSOTolerantCode(); -}; - -class AutoCleanupDebugSOTolerantTransitionHandler : DebugSOTolerantTransitionHandler -{ - BOOL m_prevSOTolerantState; - ClrDebugState* m_clrDebugState; - - public: - DEBUG_NOINLINE AutoCleanupDebugSOTolerantTransitionHandler(Thread *pThread) - { - SCAN_SCOPE_BEGIN; - ANNOTATION_FN_SO_INTOLERANT; - - EnterSOTolerantCode(pThread); - } - DEBUG_NOINLINE ~AutoCleanupDebugSOTolerantTransitionHandler() - { - SCAN_SCOPE_END; - - ReturnFromSOTolerantCode(); - } -}; - - -// When we enter SO-tolerant code, we -// 1) probe to make sure that we will have enough stack to run our backout code. We don't -// need to check that the cookie was overrun because we only care that we had enough stack. -// But we do anyway, to pop off the guard.s -// The backout code infrastcture ensures that we stay below the BACKOUT_CODE_STACK_LIMIT. -// 2) Install a boundary guard, which will preserve our cookie and prevent spurious checks if -// we call back into the EE. -// 3) Formally transition into SO-tolerant code so that we can make sure we are probing if we call -// back into the EE. -// - -#undef OPTIONAL_SO_CLEANUP_UNWIND -#define OPTIONAL_SO_CLEANUP_UNWIND(pThread, pFrame) - -#define BSTC_RECOVER_STACK 0x1 -#define BSTC_IS_SO 0x2 -#define BSTC_IS_SOFT_SO 0x4 -#define BSTC_TRIGGERING_UNWIND_FOR_SO 0x8 - -#define BEGIN_SO_TOLERANT_CODE(pThread) \ - { /* add an outer scope so that we'll restore our state as soon as we return */ \ - Thread * const __pThread = pThread; \ - DWORD __dwFlags = 0; \ - Frame * __pSafeForSOFrame = __pThread ? __pThread->GetFrame() : NULL; \ - SCAN_BLOCKMARKER(); \ - SCAN_BLOCKMARKER_MARK(); \ - BoundaryStackGuard boundary_guard_XXX(__FUNCTION__, __FILE__, __LINE__); \ - boundary_guard_XXX.Push(); \ - DebugSOTolerantTransitionHandler __soTolerantTransitionHandler; \ - __soTolerantTransitionHandler.EnterSOTolerantCode(__pThread); \ - __try \ - { \ - SCAN_EHMARKER(); \ - __try \ - { \ - SCAN_EHMARKER_TRY(); \ - DEBUG_ASSURE_NO_RETURN_BEGIN(STACK_PROBE) \ - __try \ - { - - -// We need to catch any hard SO that comes through in order to get our stack back and make sure that we can run our backout code. -// Also can't allow a hard SO to propogate into SO-intolerant code, as we can't tell where it came from and would have to rip the process. -// So install a filter and catch hard SO and rethrow a C++ SO. Note that we don't check the host policy here it only applies to exceptions -// that will leak back into managed code. -#define END_SO_TOLERANT_CODE \ - } \ - __finally \ - { \ - STATIC_CONTRACT_SO_TOLERANT; \ - if (__dwFlags & BSTC_TRIGGERING_UNWIND_FOR_SO) \ - { \ - OPTIONAL_SO_CLEANUP_UNWIND(__pThread, __pSafeForSOFrame) \ - } \ - } \ - DEBUG_ASSURE_NO_RETURN_END(STACK_PROBE) \ - boundary_guard_XXX.SetNoException(); \ - SCAN_EHMARKER_END_TRY(); \ - } \ - __except(SOTolerantBoundaryFilter(GetExceptionInformation(), &__dwFlags)) \ - { \ - SCAN_EHMARKER_CATCH(); \ - __soTolerantTransitionHandler.ReturnFromSOTolerantCode(); \ - SOTolerantCode_ExceptBody(&__dwFlags, __pSafeForSOFrame); \ - SCAN_EHMARKER_END_CATCH(); \ - } \ - /* This will correctly set the annotation back to SOIntolerant if needed */ \ - SCAN_BLOCKMARKER_USE(); \ - if (__dwFlags & BSTC_RECOVER_STACK) \ - { \ - SOTolerantCode_RecoverStack(__dwFlags); \ - } \ - } \ - __finally \ - { \ - __soTolerantTransitionHandler.ReturnFromSOTolerantCode(); \ - boundary_guard_XXX.Pop(); \ - } \ - /* This is actually attached to the SCAN_BLOCKMARKER_USE() in the try scope */ \ - /* but should hopefully chain the right annotations for a call to a __finally */ \ - SCAN_BLOCKMARKER_END_USE(); \ - } - -extern unsigned __int64 getTimeStamp(); - -INDEBUG(void AddHostCallsStaticMarker();) - -// This is used for calling into host -// We only need to install the boundary guard, and transition into SO-tolerant code. -#define BEGIN_SO_TOLERANT_CODE_CALLING_HOST(pThread) \ - { \ - ULONGLONG __entryTime = 0; \ - __int64 __entryTimeStamp = 0; \ - _ASSERTE(CanThisThreadCallIntoHost()); \ - _ASSERTE((pThread == NULL) || \ - (pThread->GetClrDebugState() == NULL) || \ - ((pThread->GetClrDebugState()->ViolationMask() & \ - (HostViolation|BadDebugState)) != 0) || \ - (pThread->GetClrDebugState()->IsHostCaller())); \ - INDEBUG(AddHostCallsStaticMarker();) \ - _ASSERTE(pThread == NULL || !pThread->IsInForbidSuspendRegion()); \ - { \ - AutoCleanupBoundaryStackGuard boundary_guard_XXX(__FUNCTION__, __FILE__, __LINE__); \ - boundary_guard_XXX.Push(); \ - AutoCleanupDebugSOTolerantTransitionHandler __soTolerantTransitionHandler(pThread); \ - DEBUG_ASSURE_NO_RETURN_BEGIN(STACK_PROBE); \ - -#define END_SO_TOLERANT_CODE_CALLING_HOST \ - DEBUG_ASSURE_NO_RETURN_END(STACK_PROBE) \ - boundary_guard_XXX.SetNoExceptionNoPop(); \ - } \ - } - -//----------------------------------------------------------------------------- -// Startup & Shutdown stack guard subsystem -//----------------------------------------------------------------------------- -void InitStackProbes(); -void TerminateStackProbes(); - -#elif defined(STACK_GUARDS_RELEASE) -//============================================================================= -// Release - really streamlined, -//============================================================================= - -void InitStackProbesRetail(); -inline void InitStackProbes() -{ - InitStackProbesRetail(); -} - -inline void TerminateStackProbes() -{ - LIMITED_METHOD_CONTRACT; -} - - -//============================================================================= -// Macros for transition into SO_INTOLERANT code -//============================================================================= - -FORCEINLINE DWORD DefaultEntryProbeAmount() { return DEFAULT_ENTRY_PROBE_AMOUNT; } - -#define BEGIN_SO_INTOLERANT_CODE(pThread) \ -{ \ - if (IsStackProbingEnabled()) DefaultRetailStackProbeWorker(pThread); \ - /* match with the else used in other macros */ \ - if (true) { \ - SOIntolerantTransitionHandler __soIntolerantTransitionHandler; \ - /* work around unreachable code warning */ \ - if (true) { \ - DEBUG_ASSURE_NO_RETURN_BEGIN(SO_INTOLERANT) - -#define BEGIN_SO_INTOLERANT_CODE_FOR(pThread, n) \ -{ \ - if (IsStackProbingEnabled()) RetailStackProbeWorker(ADJUST_PROBE(n), pThread); \ - /* match with the else used in other macros */ \ - if (true) { \ - SOIntolerantTransitionHandler __soIntolerantTransitionHandler; \ - /* work around unreachable code warning */ \ - if (true) { \ - DEBUG_ASSURE_NO_RETURN_BEGIN(SO_INTOLERANT) - -#define BEGIN_SO_INTOLERANT_CODE_NOTHROW(pThread, ActionOnSO) \ -{ \ - if (IsStackProbingEnabled() && !RetailStackProbeNoThrowWorker(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), pThread)) \ - { \ - ActionOnSO; \ - } else { \ - SOIntolerantTransitionHandler __soIntolerantTransitionHandler; \ - /* work around unreachable code warning */ \ - if (true) { \ - DEBUG_ASSURE_NO_RETURN_BEGIN(SO_INTOLERANT) - - -// This is defined just for using in the InternalSetupForComCall macro which -// doesn't have a corresponding end macro because no exception will pass through it -// It should not be used in any situation where an exception could pass through -// the transition. -#define SO_INTOLERANT_CODE_NOTHROW(pThread, ActionOnSO) \ - if (IsStackProbingEnabled() && !RetailStackProbeNoThrowWorker(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), pThread)) \ - { \ - ActionOnSO; \ - } \ - -#define MINIMAL_STACK_PROBE_CHECK_THREAD(pThread) \ - if (IsStackProbingEnabled()) \ - { \ - Thread *__pThread = pThread; \ - if (__pThread && ! __pThread->IsStackSpaceAvailable(MINIMUM_STACK_REQUIREMENT)) \ - { \ - ReportStackOverflow(); \ - } \ - } - -#define DECLARE_INTERIOR_STACK_PROBE - - -#define DO_INTERIOR_STACK_PROBE_FOR(pThread, n) \ - if (IsStackProbingEnabled()) \ - { \ - RetailStackProbeWorker(ADJUST_PROBE(n), pThread); \ - } - -#define DO_INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(n) \ - if (IsStackProbingEnabled() && ShouldProbeOnThisThread()) \ - { \ - RetailStackProbeWorker(ADJUST_PROBE(n), GetThread()); \ - } - -#define DO_INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, n, ActionOnSO) \ - if (IsStackProbingEnabled()) \ - { \ - if (!RetailStackProbeNoThrowWorker(ADJUST_PROBE(n), pThread)) \ - { \ - ActionOnSO; \ - } \ - } - -#define DO_INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(n, ActionOnSO) \ - if (IsStackProbingEnabled() && ShouldProbeOnThisThread()) \ - { \ - if (!RetailStackProbeNoThrowWorker(ADJUST_PROBE(n), GetThread())) \ - { \ - ActionOnSO; \ - } \ - } - - -#define INTERIOR_STACK_PROBE_FOR(pThread, n) \ - DECLARE_INTERIOR_STACK_PROBE; \ - DO_INTERIOR_STACK_PROBE_FOR(pThread, n) - -#define INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(n) \ - DECLARE_INTERIOR_STACK_PROBE; \ - DO_INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(n) - -#define INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, n, ActionOnSO) \ - DECLARE_INTERIOR_STACK_PROBE; \ - DO_INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, n, ActionOnSO) - -#define INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(n, ActionOnSO) \ - DECLARE_INTERIOR_STACK_PROBE; \ - DO_INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(n, ActionOnSO) - - -#define INTERIOR_STACK_PROBE(pThread) \ - INTERIOR_STACK_PROBE_FOR(pThread, DEFAULT_INTERIOR_PROBE_AMOUNT) - -#define INTERIOR_STACK_PROBE_CHECK_THREAD \ - INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(DEFAULT_INTERIOR_PROBE_AMOUNT) - -#define INTERIOR_STACK_PROBE_NOTHROW(pThread, ActionOnSO) \ - INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, DEFAULT_INTERIOR_PROBE_AMOUNT, ActionOnSO) - -#define INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(ActionOnSO) \ - INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(DEFAULT_INTERIOR_PROBE_AMOUNT, ActionOnSO) - - -#define END_INTERIOR_STACK_PROBE - -#define RETURN_FROM_INTERIOR_PROBE(x) RETURN(x) - - -// This is used for EH code where we are about to throw -// To avoid taking an SO during EH processing, want to include it in our probe limits -// So we will just do a big probe and then throw. -#define STACK_PROBE_FOR_THROW(pThread) \ - if (pThread != NULL) \ - { \ - RetailStackProbe(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), pThread); \ - } \ - -#define PUSH_STACK_PROBE_FOR_THROW(pThread) \ - RetailStackProbe(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), pThread); - -#define SAVE_ADDRESS_OF_STACK_PROBE_FOR_THROW(pGuard) - -#define POP_STACK_PROBE_FOR_THROW(pGuard) - - -//============================================================================= -// Macros for transition into SO_TOLERANT code -//============================================================================= - -#undef OPTIONAL_SO_CLEANUP_UNWIND -#define OPTIONAL_SO_CLEANUP_UNWIND(pThread, pFrame) - -#define BSTC_RECOVER_STACK 0x1 -#define BSTC_IS_SO 0x2 -#define BSTC_IS_SOFT_SO 0x4 -#define BSTC_TRIGGERING_UNWIND_FOR_SO 0x8 - - -#define BEGIN_SO_TOLERANT_CODE(pThread) \ -{ \ - Thread * __pThread = pThread; \ - DWORD __dwFlags = 0; \ - Frame * __pSafeForSOFrame = __pThread ? __pThread->GetFrame() : NULL; \ - SCAN_BLOCKMARKER(); \ - SCAN_BLOCKMARKER_MARK(); \ - SCAN_EHMARKER(); \ - __try \ - { \ - SCAN_EHMARKER_TRY() \ - __try \ - { - -// We need to catch any hard SO that comes through in order to get our stack back and make sure that we can run our backout code. -// Also can't allow a hard SO to propogate into SO-intolerant code, as we can't tell where it came from and would have to rip the process. -// So install a filter and catch hard SO and rethrow a C++ SO. -#define END_SO_TOLERANT_CODE \ - } \ - __finally \ - { \ - STATIC_CONTRACT_SO_TOLERANT; \ - if (__dwFlags & BSTC_TRIGGERING_UNWIND_FOR_SO) \ - { \ - OPTIONAL_SO_CLEANUP_UNWIND(__pThread, __pSafeForSOFrame) \ - } \ - } \ - SCAN_EHMARKER_END_TRY(); \ - } \ - __except(SOTolerantBoundaryFilter(GetExceptionInformation(), &__dwFlags)) \ - { \ - SCAN_EHMARKER_CATCH(); \ - SOTolerantCode_ExceptBody(&__dwFlags, __pSafeForSOFrame); \ - SCAN_EHMARKER_END_CATCH(); \ - } \ - SCAN_BLOCKMARKER_USE(); \ - if (__dwFlags & BSTC_RECOVER_STACK) \ - { \ - SOTolerantCode_RecoverStack(__dwFlags); \ - } \ - SCAN_BLOCKMARKER_END_USE(); \ -} - -#define BEGIN_SO_TOLERANT_CODE_CALLING_HOST(pThread) \ - { \ - -#define END_SO_TOLERANT_CODE_CALLING_HOST \ - } - -#endif - -#else // FEATURE_STACK_PROBE && !DACCESS_COMPILE - -inline void InitStackProbes() -{ - LIMITED_METHOD_CONTRACT; -} - -inline void TerminateStackProbes() -{ - LIMITED_METHOD_CONTRACT; -} - -#define BEGIN_SO_INTOLERANT_CODE(pThread) -#define BEGIN_SO_INTOLERANT_CODE_FOR(pThread, n) -#define BEGIN_SO_INTOLERANT_CODE_NOTHROW(pThread, ActionOnSO) -#define SO_INTOLERANT_CODE_NOTHROW(pThread, ActionOnSO) -#define MINIMAL_STACK_PROBE_CHECK_THREAD(pThread) - -#define DECLARE_INTERIOR_STACK_PROBE - -#define DO_INTERIOR_STACK_PROBE_FOR(pThread, n) -#define DO_INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(n) -#define DO_INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, n, ActionOnSO) -#define DO_INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(n, ActionOnSO) - -#define INTERIOR_STACK_PROBE_FOR(pThread, n) -#define INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(n) -#define INTERIOR_STACK_PROBE_FOR_NOTHROW(pThread, n, ActionOnSO) -#define INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(n, ActionOnSO) - -#define INTERIOR_STACK_PROBE(pThread) -#define INTERIOR_STACK_PROBE_CHECK_THREAD -#define INTERIOR_STACK_PROBE_NOTHROW(pThread, ActionOnSO) -#define INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(ActionOnSO) - -#define END_INTERIOR_STACK_PROBE -#define RETURN_FROM_INTERIOR_PROBE(x) RETURN(x) - -#define STACK_PROBE_FOR_THROW(pThread) -#define PUSH_STACK_PROBE_FOR_THROW(pThread) -#define SAVE_ADDRESS_OF_STACK_PROBE_FOR_THROW(pGuard) -#define POP_STACK_PROBE_FOR_THROW(pGuard) - -#define BEGIN_SO_TOLERANT_CODE(pThread) -#define END_SO_TOLERANT_CODE -#define RETURN_FROM_SO_TOLERANT_CODE_HAS_CATCH -#define BEGIN_SO_TOLERANT_CODE_CALLING_HOST(pThread) \ - _ASSERTE(CanThisThreadCallIntoHost()); - -#define END_SO_TOLERANT_CODE_CALLING_HOST - -#endif // FEATURE_STACK_PROBE && !DACCESS_COMPILE - -#endif // __STACKPROBE_h__ diff --git a/src/vm/stackprobe.inl b/src/vm/stackprobe.inl deleted file mode 100644 index de912ffacc..0000000000 --- a/src/vm/stackprobe.inl +++ /dev/null @@ -1,135 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. -// See the LICENSE file in the project root for more information. - -// - -// -// ==--== -// - -// -//----------------------------------------------------------------------------- -// Stack Probe Header for inline functions -// Used to setup stack guards -//----------------------------------------------------------------------------- -#ifndef __STACKPROBE_inl__ -#define __STACKPROBE_inl__ - -#include "stackprobe.h" -#include "common.h" - -#if defined(FEATURE_STACK_PROBE) && !defined(DACCESS_COMPILE) - -// want to inline in retail, but out of line into stackprobe.cpp in debug -#if !defined(_DEBUG) || defined(INCLUDE_RETAIL_STACK_PROBE) - -#ifndef _DEBUG -#define INLINE_NONDEBUG_ONLY FORCEINLINE -#else -#define INLINE_NONDEBUG_ONLY -#endif - -INLINE_NONDEBUG_ONLY BOOL ShouldProbeOnThisThread() -{ - // we only want to probe on user threads, not any of our special threads - return GetCurrentTaskType() == TT_USER; -} - -#if defined(_DEBUG) && defined(STACK_GUARDS_DEBUG) - -DEBUG_NOINLINE void DebugSOTolerantTransitionHandler::EnterSOTolerantCode(Thread *pThread) -{ - SCAN_SCOPE_BEGIN; - ANNOTATION_FN_SO_TOLERANT; - - if (pThread) - { - m_clrDebugState = pThread->GetClrDebugState(); - } - else - { - m_clrDebugState = GetClrDebugState(); - } - if (m_clrDebugState) - m_prevSOTolerantState = m_clrDebugState->BeginSOTolerant(); -} - -DEBUG_NOINLINE void DebugSOTolerantTransitionHandler::ReturnFromSOTolerantCode() -{ - SCAN_SCOPE_END; - - if (m_clrDebugState) - m_clrDebugState->SetSOTolerance(m_prevSOTolerantState); -} - -#endif - -// Keep the main body out of line to keep code size down. -NOINLINE BOOL RetailStackProbeNoThrowWorker(unsigned int n, Thread *pThread); -NOINLINE void RetailStackProbeWorker(unsigned int n, Thread *pThread); - -INLINE_NONDEBUG_ONLY -BOOL RetailStackProbeNoThrow(unsigned int n, Thread *pThread) -{ - STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - -#ifdef STACK_GUARDS_RELEASE - if(!IsStackProbingEnabled()) - { - return TRUE; - } -#endif - - return RetailStackProbeNoThrowWorker(n, pThread); -} - -INLINE_NONDEBUG_ONLY -void RetailStackProbe(unsigned int n, Thread *pThread) -{ - STATIC_CONTRACT_THROWS; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - -#ifdef STACK_GUARDS_RELEASE - if(!IsStackProbingEnabled()) - { - return; - } -#endif - - if (RetailStackProbeNoThrowWorker(n, pThread)) - { - return; - } - ReportStackOverflow(); -} - -INLINE_NONDEBUG_ONLY -void RetailStackProbe(unsigned int n) -{ - STATIC_CONTRACT_THROWS; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; - -#ifdef STACK_GUARDS_RELEASE - if(!IsStackProbingEnabled()) - { - return; - } -#endif - - if (RetailStackProbeNoThrowWorker(n, GetThread())) - { - return; - } - ReportStackOverflow(); -} - -#endif -#endif - - -#endif // __STACKPROBE_inl__ diff --git a/src/vm/stacksampler.cpp b/src/vm/stacksampler.cpp index 1a6218a6db..e5b74731c5 100644 --- a/src/vm/stacksampler.cpp +++ b/src/vm/stacksampler.cpp @@ -227,7 +227,6 @@ StackWalkAction StackSampler::CrawlFrameVisitor(CrawlFrame* pCf, Thread* pMdThre { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -267,7 +266,6 @@ void StackSampler::ThreadProc() THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; } CONTRACTL_END; @@ -277,8 +275,6 @@ void StackSampler::ThreadProc() return; } - BEGIN_SO_INTOLERANT_CODE(m_pThread); - // User asked us to sample after certain time. m_pThread->UserSleep(m_nSampleAfter); @@ -322,8 +318,6 @@ void StackSampler::ThreadProc() // TODO: Measure time to JIT using CycleTimer and subtract from the time we sleep every time. m_pThread->UserSleep(m_nSampleEvery); } - - END_SO_INTOLERANT_CODE; } // Find the most frequent method in the samples and JIT them. diff --git a/src/vm/stackwalk.cpp b/src/vm/stackwalk.cpp index 1b1c2a2a08..97e83ee7d3 100644 --- a/src/vm/stackwalk.cpp +++ b/src/vm/stackwalk.cpp @@ -13,7 +13,6 @@ #include "eetwain.h" #include "codeman.h" #include "eeconfig.h" -#include "stackprobe.h" #include "dbginterface.h" #include "generics.h" #ifdef FEATURE_INTERPRETER @@ -128,7 +127,6 @@ BOOL CrawlFrame::IsInCalleesFrames(LPVOID stackPointer) MethodDesc* CrawlFrame::GetFunction() { LIMITED_METHOD_DAC_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; if (pFunc != NULL) { return pFunc; @@ -519,7 +517,6 @@ void ExInfoWalker::WalkToManaged() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } @@ -558,7 +555,6 @@ UINT_PTR Thread::VirtualUnwindCallFrame(PREGDISPLAY pRD, EECodeInfo* pCodeInfo / GC_NOTRIGGER; PRECONDITION(GetControlPC(pRD) == GetIP(pRD->pCurrentContext)); - SO_TOLERANT; } CONTRACTL_END; @@ -598,7 +594,6 @@ PCODE Thread::VirtualUnwindCallFrame(T_CONTEXT* pContext, GC_NOTRIGGER; PRECONDITION(CheckPointer(pContext, NULL_NOT_OK)); PRECONDITION(CheckPointer(pContextPointers, NULL_OK)); - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -718,7 +713,6 @@ PCODE Thread::VirtualUnwindNonLeafCallFrame(T_CONTEXT* pContext, KNONVOLATILE_CO PRECONDITION(CheckPointer(pContext, NULL_NOT_OK)); PRECONDITION(CheckPointer(pContextPointers, NULL_OK)); PRECONDITION(CheckPointer(pFunctionEntry, NULL_OK)); - SO_TOLERANT; } CONTRACTL_END; @@ -763,7 +757,6 @@ UINT_PTR Thread::VirtualUnwindToFirstManagedCallFrame(T_CONTEXT* pContext) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -908,7 +901,6 @@ StackWalkAction Thread::StackWalkFramesEx( // that any C++ destructors pushed in this function will never execute, and it means that this function can // never have a dynamic contract. STATIC_CONTRACT_WRAPPER; - STATIC_CONTRACT_SO_INTOLERANT; SCAN_IGNORE_THROW; // see contract above SCAN_IGNORE_TRIGGER; // see contract above @@ -2787,7 +2779,6 @@ void StackFrameIterator::ProcessIp(PCODE Ip) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -3200,7 +3191,6 @@ void StackFrameIterator::PostProcessingForManagedFrames(void) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } @@ -3238,7 +3228,6 @@ void StackFrameIterator::PostProcessingForNoFrameTransition() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } diff --git a/src/vm/stdinterfaces.cpp b/src/vm/stdinterfaces.cpp index 619be14694..285f65f8e9 100644 --- a/src/vm/stdinterfaces.cpp +++ b/src/vm/stdinterfaces.cpp @@ -147,7 +147,6 @@ Unknown_QueryInterface_Internal(ComCallWrapper* pWrap, IUnknown* pUnk, REFIID ri NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(IsInProcCCWTearOff(pUnk)); PRECONDITION(CheckPointer(ppv, NULL_OK)); @@ -230,7 +229,6 @@ Unknown_AddRefInner_Internal(IUnknown* pUnk) GC_TRIGGERS; MODE_PREEMPTIVE; PRECONDITION(CheckPointer(pUnk)); - SO_TOLERANT; } CONTRACTL_END; @@ -255,7 +253,6 @@ Unknown_AddRef_Internal(IUnknown* pUnk) GC_TRIGGERS; MODE_PREEMPTIVE; PRECONDITION(CheckPointer(pUnk)); - SO_TOLERANT; } CONTRACTL_END; @@ -289,7 +286,6 @@ Unknown_ReleaseInner_Internal(IUnknown* pUnk) GC_TRIGGERS; MODE_PREEMPTIVE; PRECONDITION(CheckPointer(pUnk)); - SO_TOLERANT; } CONTRACTL_END; @@ -317,7 +313,6 @@ Unknown_Release_Internal(IUnknown* pUnk) GC_TRIGGERS; MODE_PREEMPTIVE; PRECONDITION(CheckPointer(pUnk)); - SO_TOLERANT; } CONTRACTL_END; @@ -359,7 +354,6 @@ Unknown_AddRefSpecial_Internal(IUnknown* pUnk) MODE_PREEMPTIVE; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(IsSimpleTearOff(pUnk)); - SO_TOLERANT; } CONTRACTL_END; @@ -380,7 +374,6 @@ Unknown_ReleaseSpecial_Internal(IUnknown* pUnk) MODE_PREEMPTIVE; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(IsSimpleTearOff(pUnk)); - SO_TOLERANT; } CONTRACTL_END; @@ -2821,7 +2814,6 @@ HRESULT __stdcall ICustomPropertyProvider_GetProperty(IUnknown *pPropertyProvide NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pPropertyProvider)); PRECONDITION(IsSimpleTearOff(pPropertyProvider)); PRECONDITION(CheckPointer(ppProperty, NULL_OK)); @@ -2901,7 +2893,6 @@ HRESULT __stdcall ICustomPropertyProvider_GetIndexedProperty(IUnknown *pProperty NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pPropertyProvider)); PRECONDITION(IsSimpleTearOff(pPropertyProvider)); PRECONDITION(CheckPointer(ppProperty, NULL_OK)); @@ -2980,7 +2971,6 @@ HRESULT __stdcall ICustomPropertyProvider_GetStringRepresentation(IUnknown *pPro NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pPropertyProvider)); PRECONDITION(IsSimpleTearOff(pPropertyProvider)); PRECONDITION(CheckPointer(phstrStringRepresentation, NULL_OK)); @@ -3044,7 +3034,6 @@ HRESULT __stdcall ICustomPropertyProvider_GetType(IUnknown *pPropertyProvider, NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pPropertyProvider)); PRECONDITION(IsSimpleTearOff(pPropertyProvider)); PRECONDITION(CheckPointer(pTypeIdentifier)); @@ -3096,7 +3085,6 @@ HRESULT __stdcall IStringable_ToString(IUnknown* pStringable, NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pStringable)); PRECONDITION(IsSimpleTearOff(pStringable)); PRECONDITION(CheckPointer(pResult, NULL_OK)); diff --git a/src/vm/stdinterfaces_wrapper.cpp b/src/vm/stdinterfaces_wrapper.cpp index e23922fe04..cf0b1e6b74 100644 --- a/src/vm/stdinterfaces_wrapper.cpp +++ b/src/vm/stdinterfaces_wrapper.cpp @@ -256,7 +256,6 @@ inline BOOL IsCurrentDomainValid(ComCallWrapper* pWrap, Thread* pThread) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(pWrap)); PRECONDITION(CheckPointer(pThread)); } @@ -275,7 +274,7 @@ inline BOOL IsCurrentDomainValid(ComCallWrapper* pWrap, Thread* pThread) BOOL IsCurrentDomainValid(ComCallWrapper* pWrap) { - CONTRACTL { NOTHROW; GC_TRIGGERS; MODE_ANY; SO_TOLERANT; } CONTRACTL_END; + CONTRACTL { NOTHROW; GC_TRIGGERS; MODE_ANY; } CONTRACTL_END; return IsCurrentDomainValid(pWrap, GetThread()); } @@ -312,7 +311,6 @@ VOID AppDomainDoCallBack(ComCallWrapper* pWrap, ADCallBackFcnType pTarget, LPVOI DISABLED(NOTHROW); GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pWrap)); PRECONDITION(CheckPointer(pTarget)); PRECONDITION(CheckPointer(pArgs)); @@ -356,7 +354,6 @@ VOID __stdcall Unknown_QueryInterface_CallBack(LPVOID ptr) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(ptr)); } CONTRACTL_END; @@ -383,7 +380,6 @@ HRESULT __stdcall Unknown_QueryInterface(IUnknown* pUnk, REFIID riid, void** ppv NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(ppv, NULL_OK)); } @@ -417,7 +413,6 @@ HRESULT __stdcall Unknown_QueryInterface_ICCW(IUnknown *pUnk, REFIID riid, void NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(ppv, NULL_OK)); } @@ -498,7 +493,7 @@ VOID __stdcall DirtyCast_Assert(IUnknown* pUnk) ULONG __stdcall Unknown_AddRef(IUnknown* pUnk) { // Ensure the Thread is available for contracts and other users of the Thread, but don't do any of - // the other "entering managed code" work like going to SO_INTOLERANT or checking for reentrancy. + // the other "entering managed code" work like checking for reentrancy. // We don't really need to "enter" the runtime to do an interlocked increment on a refcount, so // all of that stuff should be isolated to rare paths here. SetupThreadForComCall(-1); @@ -508,7 +503,7 @@ ULONG __stdcall Unknown_AddRef(IUnknown* pUnk) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - ENTRY_POINT; // implies SO_TOLERANT + ENTRY_POINT; } CONTRACTL_END; @@ -521,7 +516,7 @@ ULONG __stdcall Unknown_AddRef(IUnknown* pUnk) ULONG __stdcall Unknown_Release(IUnknown* pUnk) { // Ensure the Thread is available for contracts and other users of the Thread, but don't do any of - // the other "entering managed code" work like going to SO_INTOLERANT or checking for reentrancy. + // the other "entering managed code" work like checking for reentrancy. // We don't really need to "enter" the runtime to do an interlocked decrement on a refcount, so // all of that stuff should be isolated to rare paths here. SetupThreadForComCall(-1); @@ -531,7 +526,7 @@ ULONG __stdcall Unknown_Release(IUnknown* pUnk) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - ENTRY_POINT; // implies SO_TOLERANT + ENTRY_POINT; } CONTRACTL_END; @@ -544,7 +539,7 @@ ULONG __stdcall Unknown_Release(IUnknown* pUnk) ULONG __stdcall Unknown_AddRefInner(IUnknown* pUnk) { // Ensure the Thread is available for contracts and other users of the Thread, but don't do any of - // the other "entering managed code" work like going to SO_INTOLERANT or checking for reentrancy. + // the other "entering managed code" work like checking for reentrancy. // We don't really need to "enter" the runtime to do an interlocked increment on a refcount, so // all of that stuff should be isolated to rare paths here. SetupThreadForComCall(-1); @@ -554,7 +549,7 @@ ULONG __stdcall Unknown_AddRefInner(IUnknown* pUnk) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - ENTRY_POINT; // implies SO_TOLERANT + ENTRY_POINT; } CONTRACTL_END; @@ -567,7 +562,7 @@ ULONG __stdcall Unknown_AddRefInner(IUnknown* pUnk) ULONG __stdcall Unknown_ReleaseInner(IUnknown* pUnk) { // Ensure the Thread is available for contracts and other users of the Thread, but don't do any of - // the other "entering managed code" work like going to SO_INTOLERANT or checking for reentrancy. + // the other "entering managed code" work like checking for reentrancy. // We don't really need to "enter" the runtime to do an interlocked decrement on a refcount, so // all of that stuff should be isolated to rare paths here. SetupThreadForComCall(-1); @@ -577,7 +572,7 @@ ULONG __stdcall Unknown_ReleaseInner(IUnknown* pUnk) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - ENTRY_POINT; // implies SO_TOLERANT + ENTRY_POINT; } CONTRACTL_END; @@ -590,7 +585,7 @@ ULONG __stdcall Unknown_ReleaseInner(IUnknown* pUnk) ULONG __stdcall Unknown_AddRefSpecial(IUnknown* pUnk) { // Ensure the Thread is available for contracts and other users of the Thread, but don't do any of - // the other "entering managed code" work like going to SO_INTOLERANT or checking for reentrancy. + // the other "entering managed code" work like checking for reentrancy. // We don't really need to "enter" the runtime to do an interlocked increment on a refcount, so // all of that stuff should be isolated to rare paths here. SetupThreadForComCall(-1); @@ -600,7 +595,7 @@ ULONG __stdcall Unknown_AddRefSpecial(IUnknown* pUnk) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - ENTRY_POINT; // implies SO_TOLERANT + ENTRY_POINT; } CONTRACTL_END; @@ -613,7 +608,7 @@ ULONG __stdcall Unknown_AddRefSpecial(IUnknown* pUnk) ULONG __stdcall Unknown_ReleaseSpecial(IUnknown* pUnk) { // Ensure the Thread is available for contracts and other users of the Thread, but don't do any of - // the other "entering managed code" work like going to SO_INTOLERANT or checking for reentrancy. + // the other "entering managed code" work like checking for reentrancy. // We don't really need to "enter" the runtime to do an interlocked decrement on a refcount, so // all of that stuff should be isolated to rare paths here. SetupThreadForComCall(-1); @@ -623,7 +618,7 @@ ULONG __stdcall Unknown_ReleaseSpecial(IUnknown* pUnk) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - ENTRY_POINT; // implies SO_TOLERANT + ENTRY_POINT; } CONTRACTL_END; @@ -640,7 +635,6 @@ HRESULT __stdcall Unknown_QueryInterface_IErrorInfo(IUnknown* pUnk, REFIID riid, SetupForComCallHRNoCheckCanRunManagedCode(); WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; HRESULT hr = S_OK; if (!CanRunManagedCode(LoaderLockCheck::ForCorrectness)) @@ -672,7 +666,6 @@ ULONG __stdcall Unknown_ReleaseSpecial_IErrorInfo(IUnknown* pUnk) SetupForComCallDWORDNoCheckCanRunManagedCode(); WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; // <TODO>Address this violation in context of bug 27409</TODO> CONTRACT_VIOLATION(GCViolation); @@ -736,7 +729,6 @@ HRESULT __stdcall ClassInfo_GetClassInfo_Wrapper(IUnknown* pUnk, ITypeInfo** ppT NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(ppTI, NULL_OK)); } @@ -792,7 +784,6 @@ SupportsErroInfo_IntfSupportsErrorInfo_Wrapper(IUnknown* pUnk, REFIID riid) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); } CONTRACTL_END; @@ -845,7 +836,6 @@ HRESULT __stdcall ErrorInfo_GetDescription_Wrapper(IUnknown* pUnk, BSTR* pbstrDe NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(pbstrDescription, NULL_OK)); } @@ -896,7 +886,6 @@ HRESULT __stdcall ErrorInfo_GetGUID_Wrapper(IUnknown* pUnk, GUID* pguid) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(pguid, NULL_OK)); } @@ -947,7 +936,6 @@ HRESULT _stdcall ErrorInfo_GetHelpContext_Wrapper(IUnknown* pUnk, DWORD* pdwHelp NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(pdwHelpCtxt, NULL_OK)); } @@ -998,7 +986,6 @@ HRESULT __stdcall ErrorInfo_GetHelpFile_Wrapper(IUnknown* pUnk, BSTR* pbstrHelpF NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(pbstrHelpFile, NULL_OK)); } @@ -1049,7 +1036,6 @@ HRESULT __stdcall ErrorInfo_GetSource_Wrapper(IUnknown* pUnk, BSTR* pbstrSource) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(pbstrSource, NULL_OK)); } @@ -1108,7 +1094,6 @@ HRESULT __stdcall Dispatch_GetTypeInfoCount_Wrapper(IDispatch* pDisp, unsigned i NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pctinfo, NULL_OK)); } @@ -1161,7 +1146,6 @@ HRESULT __stdcall Dispatch_GetTypeInfo_Wrapper(IDispatch* pDisp, unsigned int it NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pptinfo, NULL_OK)); } @@ -1218,7 +1202,6 @@ HRESULT __stdcall Dispatch_GetIDsOfNames_Wrapper(IDispatch* pDisp, REFIID riid, NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(rgszNames, NULL_OK)); PRECONDITION(CheckPointer(rgdispid, NULL_OK)); @@ -1265,7 +1248,6 @@ HRESULT __stdcall InternalDispatchImpl_GetIDsOfNames_Wrapper(IDispatch* pDisp, R NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(rgszNames, NULL_OK)); PRECONDITION(CheckPointer(rgdispid, NULL_OK)); @@ -1323,15 +1305,6 @@ HRESULT __stdcall Dispatch_Invoke_Wrapper(IDispatch* pDisp, DISPID dispidMember, HRESULT hrRetVal = S_OK; #ifdef FEATURE_CORRUPTING_EXCEPTIONS - // SetupForComCallHR uses "SO_INTOLERANT_CODE_NOTHROW" to setup the SO-Intolerant transition - // for COM Interop. However, "SO_INTOLERANT_CODE_NOTHROW" expects that no exception can escape - // through this boundary but all it does is (in addition to checking that no exception has escaped it) - // do stack probing. - // - // However, Corrupting Exceptions [CE] can escape the COM Interop boundary. Thus, to address that scenario, - // we use the macro below that uses BEGIN_SO_INTOLERANT_CODE_NOTHROW to do the equivalent of - // SO_INTOLERANT_CODE_NOTHROW and yet allow for CEs to escape through. Since there will be a corresponding - // END_SO_INTOLERANT_CODE, the call is splitted into two parts: the Begin and End (see below). BeginSetupForComCallHRWithEscapingCorruptingExceptions(); #else // !FEATURE_CORRUPTING_EXCEPTIONS SetupForComCallHR(); @@ -1343,7 +1316,6 @@ HRESULT __stdcall Dispatch_Invoke_Wrapper(IDispatch* pDisp, DISPID dispidMember, THROWS; // Dispatch_Invoke_CallBack can throw GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pdispparams, NULL_OK)); PRECONDITION(CheckPointer(pvarResult, NULL_OK)); @@ -1399,7 +1371,6 @@ HRESULT __stdcall InternalDispatchImpl_Invoke_Wrapper(IDispatch* pDisp, DISPID d NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pdispparams, NULL_OK)); PRECONDITION(CheckPointer(pvarResult, NULL_OK)); @@ -1457,7 +1428,6 @@ HRESULT __stdcall DispatchEx_GetTypeInfoCount_Wrapper(IDispatchEx* pDisp, unsign NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pctinfo, NULL_OK)); } @@ -1510,7 +1480,6 @@ HRESULT __stdcall DispatchEx_GetTypeInfo_Wrapper(IDispatchEx* pDisp, unsigned in NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pptinfo, NULL_OK)); } @@ -1567,7 +1536,6 @@ HRESULT __stdcall DispatchEx_GetIDsOfNames_Wrapper(IDispatchEx* pDisp, REFIID ri NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(rgszNames, NULL_OK)); PRECONDITION(CheckPointer(rgdispid, NULL_OK)); @@ -1630,7 +1598,6 @@ HRESULT __stdcall DispatchEx_Invoke_Wrapper(IDispatchEx* pDisp, DISPID dispidMem NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pdispparams, NULL_OK)); PRECONDITION(CheckPointer(pvarResult, NULL_OK)); @@ -1685,7 +1652,6 @@ HRESULT __stdcall DispatchEx_DeleteMemberByDispID_Wrapper(IDispatchEx* pDisp, DI NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); } CONTRACTL_END; @@ -1736,7 +1702,6 @@ HRESULT __stdcall DispatchEx_DeleteMemberByName_Wrapper(IDispatchEx* pDisp, BSTR NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); } CONTRACTL_END; @@ -1787,7 +1752,6 @@ HRESULT __stdcall DispatchEx_GetMemberName_Wrapper(IDispatchEx* pDisp, DISPID id NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pbstrName, NULL_OK)); } @@ -1840,7 +1804,6 @@ HRESULT __stdcall DispatchEx_GetDispID_Wrapper(IDispatchEx* pDisp, BSTR bstrName NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pid, NULL_OK)); } @@ -1894,7 +1857,6 @@ HRESULT __stdcall DispatchEx_GetMemberProperties_Wrapper(IDispatchEx* pDisp, DIS NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pgrfdex, NULL_OK)); } @@ -1945,7 +1907,6 @@ HRESULT __stdcall DispatchEx_GetNameSpaceParent_Wrapper(IDispatchEx* pDisp, IUnk NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(ppunk, NULL_OK)); } @@ -1998,7 +1959,6 @@ HRESULT __stdcall DispatchEx_GetNextDispID_Wrapper(IDispatchEx* pDisp, DWORD grf NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pid, NULL_OK)); } @@ -2058,7 +2018,6 @@ HRESULT __stdcall DispatchEx_InvokeEx_Wrapper(IDispatchEx* pDisp, DISPID id, LCI NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pDisp)); PRECONDITION(CheckPointer(pdp, NULL_OK)); PRECONDITION(CheckPointer(pVarRes, NULL_OK)); @@ -2116,7 +2075,6 @@ HRESULT __stdcall Inspectable_GetIIDs_Wrapper(IInspectable *pInsp, ULONG *iidCou NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pInsp)); } CONTRACTL_END; @@ -2166,7 +2124,6 @@ HRESULT __stdcall Inspectable_GetRuntimeClassName_Wrapper(IInspectable *pInsp, H NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pInsp)); } CONTRACTL_END; @@ -2187,7 +2144,6 @@ HRESULT __stdcall Inspectable_GetTrustLevel_Wrapper(IInspectable *pInsp, TrustLe NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pInsp)); } CONTRACTL_END; @@ -2242,7 +2198,6 @@ HRESULT __stdcall WeakReferenceSource_GetWeakReference_Wrapper(IWeakReferenceSou NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pRefSrc)); } CONTRACTL_END; @@ -2304,7 +2259,6 @@ HRESULT __stdcall Marshal_GetUnmarshalClass_Wrapper(IMarshal* pMarsh, REFIID rii NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pMarsh)); PRECONDITION(CheckPointer(pv, NULL_OK)); PRECONDITION(CheckPointer(pvDestContext, NULL_OK)); @@ -2368,7 +2322,6 @@ HRESULT __stdcall Marshal_GetMarshalSizeMax_Wrapper(IMarshal* pMarsh, REFIID rii NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pMarsh)); PRECONDITION(CheckPointer(pv, NULL_OK)); PRECONDITION(CheckPointer(pvDestContext, NULL_OK)); @@ -2430,7 +2383,6 @@ HRESULT __stdcall Marshal_MarshalInterface_Wrapper(IMarshal* pMarsh, LPSTREAM pS NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pMarsh)); PRECONDITION(CheckPointer(pv, NULL_OK)); PRECONDITION(CheckPointer(pvDestContext, NULL_OK)); @@ -2486,7 +2438,6 @@ HRESULT __stdcall Marshal_UnmarshalInterface_Wrapper(IMarshal* pMarsh, LPSTREAM NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pMarsh)); PRECONDITION(CheckPointer(pStm, NULL_OK)); PRECONDITION(CheckPointer(ppvObj, NULL_OK)); @@ -2539,7 +2490,6 @@ HRESULT __stdcall Marshal_ReleaseMarshalData_Wrapper(IMarshal* pMarsh, LPSTREAM NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pMarsh)); PRECONDITION(CheckPointer(pStm, NULL_OK)); } @@ -2590,7 +2540,6 @@ HRESULT __stdcall Marshal_DisconnectObject_Wrapper(IMarshal* pMarsh, ULONG dwRes NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pMarsh)); } CONTRACTL_END; @@ -2643,7 +2592,6 @@ HRESULT __stdcall ConnectionPointContainer_EnumConnectionPoints_Wrapper(IUnknown NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(ppEnum, NULL_OK)); } @@ -2696,7 +2644,6 @@ HRESULT __stdcall ConnectionPointContainer_FindConnectionPoint_Wrapper(IUnknown* NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(ppCP, NULL_OK)); } @@ -2757,7 +2704,6 @@ HRESULT __stdcall ObjectSafety_GetInterfaceSafetyOptions_Wrapper(IUnknown* pUnk, NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); PRECONDITION(CheckPointer(pdwSupportedOptions, NULL_OK)); PRECONDITION(CheckPointer(pdwEnabledOptions, NULL_OK)); @@ -2816,7 +2762,6 @@ HRESULT __stdcall ObjectSafety_SetInterfaceSafetyOptions_Wrapper(IUnknown* pUnk, NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pUnk)); } CONTRACTL_END; @@ -2866,7 +2811,6 @@ HRESULT __stdcall ICustomPropertyProvider_GetProperty_Wrapper(IUnknown *pPropert NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pPropertyProvider)); } CONTRACTL_END; @@ -2918,7 +2862,6 @@ HRESULT __stdcall ICustomPropertyProvider_GetIndexedProperty_Wrapper(IUnknown *p NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pPropertyProvider)); } CONTRACTL_END; @@ -2964,7 +2907,6 @@ HRESULT __stdcall ICustomPropertyProvider_GetStringRepresentation_Wrapper(IUnkno NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pPropertyProvider)); } CONTRACTL_END; @@ -3009,7 +2951,6 @@ HRESULT __stdcall ICustomPropertyProvider_GetType_Wrapper(IUnknown *pPropertyPro NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pPropertyProvider)); } CONTRACTL_END; @@ -3054,7 +2995,6 @@ HRESULT __stdcall IStringable_ToString_Wrapper(IUnknown *pStringable, NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; PRECONDITION(CheckPointer(pStringable)); } CONTRACTL_END; @@ -3080,8 +3020,7 @@ ULONG __stdcall ICCW_AddRefFromJupiter_Wrapper(IUnknown *pUnk) // We do not need to hook with host here SetupForComCallDWORDNoHostNotif(); - WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; + WRAPPER_NO_CONTRACT; return ICCW_AddRefFromJupiter(pUnk); } @@ -3091,8 +3030,7 @@ ULONG __stdcall ICCW_ReleaseFromJupiter_Wrapper(IUnknown *pUnk) // We do not need to hook with host here SetupForComCallDWORDNoHostNotif(); - WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; + WRAPPER_NO_CONTRACT; return ICCW_ReleaseFromJupiter(pUnk); } @@ -3103,8 +3041,7 @@ HRESULT __stdcall ICCW_Peg_Wrapper(IUnknown *pUnk) // as we are most likely in the middle of a GC SetupForComCallHRNoHostNotifNoCheckCanRunManagedCode(); - WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; + WRAPPER_NO_CONTRACT; return ICCW_Peg(pUnk); } @@ -3115,8 +3052,7 @@ HRESULT __stdcall ICCW_Unpeg_Wrapper(IUnknown *pUnk) // as we are most likely in the middle of a GC SetupForComCallHRNoHostNotifNoCheckCanRunManagedCode(); - WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; + WRAPPER_NO_CONTRACT; return ICCW_Unpeg(pUnk); } diff --git a/src/vm/stubhelpers.cpp b/src/vm/stubhelpers.cpp index 456a367de4..72265b0584 100644 --- a/src/vm/stubhelpers.cpp +++ b/src/vm/stubhelpers.cpp @@ -52,7 +52,6 @@ void StubHelpers::ValidateObjectInternal(Object *pObjUNSAFE, BOOL fValidateNextO NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -739,12 +738,12 @@ void QCALLTYPE StubHelpers::InterfaceMarshaler__ClearNative(IUnknown * pUnk) { QCALL_CONTRACT; - BEGIN_QCALL_SO_TOLERANT; + BEGIN_QCALL; ULONG cbRef = SafeReleasePreemp(pUnk); LogInteropRelease(pUnk, cbRef, "InterfaceMarshalerBase::ClearNative: In/Out release"); - END_QCALL_SO_TOLERANT; + END_QCALL; } #include <optdefault.h> diff --git a/src/vm/stublink.cpp b/src/vm/stublink.cpp index e41b853c7e..963555c08d 100644 --- a/src/vm/stublink.cpp +++ b/src/vm/stublink.cpp @@ -132,7 +132,6 @@ FindStubFunctionEntry ( NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END @@ -345,7 +344,6 @@ StubLinker::StubLinker() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -391,7 +389,6 @@ VOID StubLinker::EmitBytes(const BYTE *pBytes, UINT numBytes) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -457,7 +454,6 @@ VOID StubLinker::Emit16(unsigned __int16 val) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -479,7 +475,6 @@ VOID StubLinker::Emit32(unsigned __int32 val) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -522,7 +517,6 @@ VOID StubLinker::EmitPtr(const VOID *val) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -547,7 +541,6 @@ CodeLabel* StubLinker::NewCodeLabel() { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -589,7 +582,6 @@ VOID StubLinker::EmitLabel(CodeLabel* pCodeLabel) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -614,7 +606,6 @@ CodeLabel* StubLinker::EmitNewCodeLabel() { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -633,7 +624,6 @@ VOID StubLinker::EmitPatchLabel() { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -655,7 +645,6 @@ UINT32 StubLinker::GetLabelOffset(CodeLabel *pLabel) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -674,7 +663,6 @@ CodeLabel* StubLinker::NewExternalCodeLabel(LPVOID pExternalAddress) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(CheckPointer(pExternalAddress)); } @@ -707,7 +695,6 @@ VOID StubLinker::EmitLabelRef(CodeLabel* target, const InstructionFormat & instr { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -739,7 +726,6 @@ CodeRun *StubLinker::GetLastCodeRunIfAny() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -782,7 +768,6 @@ VOID StubLinker::AppendCodeElement(CodeElement *pCodeElement) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -801,7 +786,6 @@ static BOOL LabelCanReach(LabelRef *pLabelRef) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -938,7 +922,6 @@ int StubLinker::CalculateSize(int* pGlobalSize) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -1232,7 +1215,6 @@ VOID StubLinker::UnwindAllocStack (SHORT FrameSizeIncrement) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; if (! ClrSafeInt<SHORT>::addition(m_stackSize, FrameSizeIncrement, m_stackSize)) @@ -1280,7 +1262,6 @@ UNWIND_CODE *StubLinker::AllocUnwindInfo (UCHAR Op, UCHAR nExtraSlots /*= 0*/) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; _ASSERTE(Op < sizeof(UnwindOpExtraSlotTable)); diff --git a/src/vm/stublink.h b/src/vm/stublink.h index 41c11ebb49..23e5e1b855 100644 --- a/src/vm/stublink.h +++ b/src/vm/stublink.h @@ -582,7 +582,6 @@ class Stub NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END diff --git a/src/vm/stubmgr.cpp b/src/vm/stubmgr.cpp index 9237eeb4b5..17d262c058 100644 --- a/src/vm/stubmgr.cpp +++ b/src/vm/stubmgr.cpp @@ -421,7 +421,6 @@ BOOL StubManager::CheckIsStub_Worker(PCODE stubStartAddress) NOTHROW; CAN_TAKE_LOCK; // CheckIsStub_Internal can enter SimpleRWLock GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -435,10 +434,6 @@ BOOL StubManager::CheckIsStub_Worker(PCODE stubStartAddress) return FALSE; } - CONTRACT_VIOLATION(SOToleranceViolation); - // @todo : this might not have a thread - // BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), return FALSE); - struct Param { BOOL fIsStub; @@ -484,11 +479,9 @@ BOOL StubManager::CheckIsStub_Worker(PCODE stubStartAddress) #ifdef DACCESS_COMPILE PAL_ENDTRY #else - EX_END_CATCH(SwallowAllExceptions); -#endif + EX_END_CATCH(SwallowAllExceptions); +#endif - //END_SO_INTOLERANT_CODE; - return param.fIsStub; } @@ -1586,7 +1579,6 @@ RangeSectionStubManager::GetStubKind(PCODE stubStartAddress) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/stubmgr.h b/src/vm/stubmgr.h index fc77ca9293..8087d8bb89 100644 --- a/src/vm/stubmgr.h +++ b/src/vm/stubmgr.h @@ -93,7 +93,6 @@ public: // The addr is in unmanaged code. Used for Step-in from managed to native. void InitForUnmanaged(PCODE addr) { - STATIC_CONTRACT_SO_TOLERANT; this->type = TRACE_UNMANAGED; this->address = addr; this->stubManager = NULL; @@ -102,7 +101,6 @@ public: // The addr is inside jitted code (eg, there's a JitManaged that will claim it) void InitForManaged(PCODE addr) { - STATIC_CONTRACT_SO_TOLERANT; this->type = TRACE_MANAGED; this->address = addr; this->stubManager = NULL; @@ -111,7 +109,6 @@ public: // Initialize for an unmanaged entry stub. void InitForUnmanagedStub(PCODE addr) { - STATIC_CONTRACT_SO_TOLERANT; this->type = TRACE_ENTRY_STUB; this->address = addr; this->stubManager = NULL; @@ -120,7 +117,6 @@ public: // Initialize for a stub. void InitForStub(PCODE addr) { - STATIC_CONTRACT_SO_TOLERANT; this->type = TRACE_STUB; this->address = addr; this->stubManager = NULL; @@ -136,7 +132,6 @@ public: // call pStubManager->TraceManager() to get the next TraceDestination. void InitForManagerPush(PCODE addr, StubManager * pStubManager) { - STATIC_CONTRACT_SO_TOLERANT; this->type = TRACE_MGR_PUSH; this->address = addr; this->stubManager = pStubManager; diff --git a/src/vm/syncblk.cpp b/src/vm/syncblk.cpp index 979fa16239..30b29309e4 100644 --- a/src/vm/syncblk.cpp +++ b/src/vm/syncblk.cpp @@ -1862,7 +1862,6 @@ BOOL ObjHeader::TryEnterObjMonitor(INT32 timeOut) AwareLock::EnterHelperResult ObjHeader::EnterObjMonitorHelperSpin(Thread* pCurThread) { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -2089,7 +2088,6 @@ BOOL ObjHeader::GetThreadOwningMonitorLock(DWORD *pThreadId, DWORD *pAcquisition { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; #ifndef DACCESS_COMPILE if (!IsGCSpecialThread ()) {MODE_COOPERATIVE;} else {MODE_ANY;} #endif @@ -2290,7 +2288,6 @@ ADIndex ObjHeader::GetAppDomainIndex() { STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_SUPPORTS_DAC; ADIndex indx = GetRawAppDomainIndex(); @@ -2513,9 +2510,8 @@ BOOL ObjHeader::Validate (BOOL bVerifySyncBlkIndex) { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_MODE_COOPERATIVE; - + DWORD bits = GetBits (); Object * obj = GetBaseObject (); BOOL bVerifyMore = g_pConfig->GetHeapVerifyLevel() & EEConfig::HEAPVERIFY_SYNCBLK; diff --git a/src/vm/syncblk.h b/src/vm/syncblk.h index 03f3e16acb..58eb2869b5 100644 --- a/src/vm/syncblk.h +++ b/src/vm/syncblk.h @@ -968,7 +968,6 @@ class SyncBlock NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; POSTCONDITION(CheckPointer(RETVAL, NULL_OK)); } diff --git a/src/vm/syncblk.inl b/src/vm/syncblk.inl index 617e2409c0..f8f1746bca 100644 --- a/src/vm/syncblk.inl +++ b/src/vm/syncblk.inl @@ -471,7 +471,6 @@ FORCEINLINE void AwareLock::SpinWait(const YieldProcessorNormalizationInfo &norm FORCEINLINE bool AwareLock::TryEnterHelper(Thread* pCurThread) { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_ANY; @@ -496,7 +495,6 @@ FORCEINLINE bool AwareLock::TryEnterHelper(Thread* pCurThread) FORCEINLINE AwareLock::EnterHelperResult AwareLock::TryEnterBeforeSpinLoopHelper(Thread *pCurThread) { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_ANY; @@ -540,7 +538,6 @@ FORCEINLINE AwareLock::EnterHelperResult AwareLock::TryEnterBeforeSpinLoopHelper FORCEINLINE AwareLock::EnterHelperResult AwareLock::TryEnterInsideSpinLoopHelper(Thread *pCurThread) { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_ANY; @@ -568,7 +565,6 @@ FORCEINLINE AwareLock::EnterHelperResult AwareLock::TryEnterInsideSpinLoopHelper FORCEINLINE bool AwareLock::TryEnterAfterSpinLoopHelper(Thread *pCurThread) { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_ANY; @@ -592,7 +588,6 @@ FORCEINLINE bool AwareLock::TryEnterAfterSpinLoopHelper(Thread *pCurThread) FORCEINLINE AwareLock::EnterHelperResult ObjHeader::EnterObjMonitorHelper(Thread* pCurThread) { CONTRACTL{ - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; @@ -676,7 +671,6 @@ FORCEINLINE AwareLock::EnterHelperResult ObjHeader::EnterObjMonitorHelper(Thread FORCEINLINE AwareLock::LeaveHelperAction AwareLock::LeaveHelper(Thread* pCurThread) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_ANY; @@ -717,7 +711,6 @@ FORCEINLINE AwareLock::LeaveHelperAction AwareLock::LeaveHelper(Thread* pCurThre FORCEINLINE AwareLock::LeaveHelperAction ObjHeader::LeaveObjMonitorHelper(Thread* pCurThread) { CONTRACTL { - SO_TOLERANT; NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; diff --git a/src/vm/synch.cpp b/src/vm/synch.cpp index 7a081d22b2..13f6ff3d28 100644 --- a/src/vm/synch.cpp +++ b/src/vm/synch.cpp @@ -17,7 +17,6 @@ void CLREventBase::CreateAutoEvent (BOOL bInitialState // If TRUE, initial stat { THROWS; GC_NOTRIGGER; - SO_TOLERANT; // disallow creation of Crst before EE starts // Can not assert here. ASP.Net uses our Threadpool before EE is started. PRECONDITION((m_handle == INVALID_HANDLE_VALUE)); @@ -44,7 +43,6 @@ BOOL CLREventBase::CreateAutoEventNoThrow (BOOL bInitialState // If TRUE, initi { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; // disallow creation of Crst before EE starts // Can not assert here. ASP.Net uses our Threadpool before EE is started. PRECONDITION((m_handle == INVALID_HANDLE_VALUE)); @@ -71,7 +69,6 @@ void CLREventBase::CreateManualEvent (BOOL bInitialState // If TRUE, initial st { THROWS; GC_NOTRIGGER; - SO_TOLERANT; // disallow creation of Crst before EE starts // Can not assert here. ASP.Net uses our Threadpool before EE is started. PRECONDITION((m_handle == INVALID_HANDLE_VALUE)); @@ -95,7 +92,6 @@ BOOL CLREventBase::CreateManualEventNoThrow (BOOL bInitialState // If TRUE, ini { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; // disallow creation of Crst before EE starts // Can not assert here. ASP.Net uses our Threadpool before EE is started. PRECONDITION((m_handle == INVALID_HANDLE_VALUE)); @@ -315,7 +311,6 @@ void CLREventBase::CloseEvent() { NOTHROW; if (IsInDeadlockDetection()) {GC_TRIGGERS;} else {GC_NOTRIGGER;} - SO_TOLERANT; } CONTRACTL_END; @@ -340,7 +335,6 @@ BOOL CLREventBase::Set() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION((m_handle != INVALID_HANDLE_VALUE)); } CONTRACTL_END; @@ -360,7 +354,6 @@ BOOL CLREventBase::Reset() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION((m_handle != INVALID_HANDLE_VALUE)); } CONTRACTL_END; @@ -380,16 +373,14 @@ BOOL CLREventBase::Reset() static DWORD CLREventWaitHelper2(HANDLE handle, DWORD dwMilliseconds, BOOL alertable) { STATIC_CONTRACT_THROWS; - STATIC_CONTRACT_SO_TOLERANT; - + return WaitForSingleObjectEx(handle,dwMilliseconds,alertable); } static DWORD CLREventWaitHelper(HANDLE handle, DWORD dwMilliseconds, BOOL alertable) { STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_SO_TOLERANT; - + struct Param { HANDLE handle; @@ -451,7 +442,6 @@ DWORD CLREventBase::WaitEx(DWORD dwMilliseconds, WaitMode mode, PendingSync *syn { DISABLED(GC_TRIGGERS); } - SO_TOLERANT; PRECONDITION(m_handle != INVALID_HANDLE_VALUE); // Handle has to be valid } CONTRACTL_END; @@ -471,11 +461,9 @@ DWORD CLREventBase::WaitEx(DWORD dwMilliseconds, WaitMode mode, PendingSync *syn { if (pThread && alertable) { DWORD dwRet = WAIT_FAILED; - BEGIN_SO_INTOLERANT_CODE_NOTHROW (pThread, return WAIT_FAILED;); dwRet = pThread->DoAppropriateWait(1, &m_handle, FALSE, dwMilliseconds, mode, syncState); - END_SO_INTOLERANT_CODE; return dwRet; } else { @@ -491,7 +479,6 @@ void CLRSemaphore::Create (DWORD dwInitial, DWORD dwMax) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(m_handle == INVALID_HANDLE_VALUE); } CONTRACTL_END; @@ -522,7 +509,6 @@ BOOL CLRSemaphore::Release(LONG lReleaseCount, LONG *lpPreviousCount) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(m_handle != INVALID_HANDLE_VALUE); } CONTRACTL_END; @@ -556,7 +542,6 @@ DWORD CLRSemaphore::Wait(DWORD dwMilliseconds, BOOL alertable) { DISABLED(GC_TRIGGERS); } - SO_TOLERANT; PRECONDITION(m_handle != INVALID_HANDLE_VALUE); // Invalid to have invalid handle } CONTRACTL_END; @@ -596,7 +581,6 @@ void CLRLifoSemaphore::Create(INT32 initialSignalCount, INT32 maximumSignalCount { THROWS; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -638,7 +622,6 @@ bool CLRLifoSemaphore::WaitForSignal(DWORD timeoutMs) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -750,7 +733,6 @@ bool CLRLifoSemaphore::Wait(DWORD timeoutMs, UINT32 spinCount, UINT32 processorC { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -925,7 +907,6 @@ void CLRLifoSemaphore::Release(INT32 releaseCount) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -1005,7 +986,6 @@ void CLRMutex::Create(LPSECURITY_ATTRIBUTES lpMutexAttributes, BOOL bInitialOwne { THROWS; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(m_handle == INVALID_HANDLE_VALUE && m_handle != NULL); } CONTRACTL_END; @@ -1034,7 +1014,6 @@ BOOL CLRMutex::Release() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(m_handle != INVALID_HANDLE_VALUE && m_handle != NULL); } CONTRACTL_END; diff --git a/src/vm/threadpoolrequest.cpp b/src/vm/threadpoolrequest.cpp index 7bfb413735..f9576b7e62 100644 --- a/src/vm/threadpoolrequest.cpp +++ b/src/vm/threadpoolrequest.cpp @@ -226,7 +226,6 @@ bool PerAppDomainTPCountList::AreRequestsPendingInAnyAppDomains() NOTHROW; MODE_ANY; GC_NOTRIGGER; - SO_TOLERANT; //Its ok for tis function to fail. } CONTRACTL_END; @@ -729,7 +728,6 @@ void ManagedPerAppDomainTPCount::DispatchWorkItem(bool* foundWork, bool* wasNotR CONTRACTL_END; GCX_COOP(); - BEGIN_SO_INTOLERANT_CODE(pThread); // // NOTE: there is a potential race between the time we retrieve the app @@ -774,8 +772,6 @@ void ManagedPerAppDomainTPCount::DispatchWorkItem(bool* foundWork, bool* wasNotR // We should have released all locks. _ASSERTE(g_fEEShutDown || pThread->m_dwLockCount == 0 || pThread->m_fRudeAborted); - END_SO_INTOLERANT_CODE; - *foundWork = true; } else diff --git a/src/vm/threads.cpp b/src/vm/threads.cpp index cd405f1b3d..c8ebceb7f1 100644 --- a/src/vm/threads.cpp +++ b/src/vm/threads.cpp @@ -543,7 +543,6 @@ Thread* SetupThreadNoThrow(HRESULT *pHR) { CONTRACTL { NOTHROW; - SO_TOLERANT; if (GetThread()) {GC_TRIGGERS;} else {DISABLED(GC_NOTRIGGER);} } CONTRACTL_END; @@ -633,7 +632,6 @@ Thread* SetupThread(BOOL fInternal) CONTRACTL { THROWS; if (GetThread()) {GC_TRIGGERS;} else {DISABLED(GC_NOTRIGGER);} - SO_TOLERANT; } CONTRACTL_END; @@ -641,12 +639,6 @@ Thread* SetupThread(BOOL fInternal) if ((pThread = GetThread()) != NULL) return pThread; -#ifdef FEATURE_STACK_PROBE - RetailStackProbe(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), NULL); -#endif //FEATURE_STACK_PROBE - - CONTRACT_VIOLATION(SOToleranceViolation); - // For interop debugging, we must mark that we're in a can't-stop region // b.c we may take Crsts here that may block the helper thread. // We're especially fragile here b/c we don't have a Thread object yet @@ -935,9 +927,6 @@ HRESULT Thread::DetachThread(BOOL fDLLThreadDetach) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - // @todo . We need to probe here, but can't introduce destructors etc. - BEGIN_CONTRACT_VIOLATION(SOToleranceViolation); - // Clear any outstanding stale EH state that maybe still active on the thread. #ifdef WIN64EXCEPTIONS ExceptionTracker::PopTrackers((void*)-1); @@ -1008,8 +997,6 @@ HRESULT Thread::DetachThread(BOOL fDLLThreadDetach) ThreadStore::CheckForEEShutdown(); } - END_CONTRACT_VIOLATION; - HANDLE hThread = GetThreadHandle(); SetThreadHandle (SWITCHOUT_HANDLE_VALUE); while (m_dwThreadHandleBeingUsed > 0) @@ -1854,13 +1841,9 @@ BOOL Thread::HasStarted(BOOL bRequiresTSL) CONTRACTL { NOTHROW; DISABLED(GC_NOTRIGGER); - SO_TOLERANT; } CONTRACTL_END; - // @todo need a probe that tolerates not having a thread setup at all - CONTRACT_VIOLATION(SOToleranceViolation); - _ASSERTE(!m_fPreemptiveGCDisabled); // can't use PreemptiveGCDisabled() here // This is cheating a little. There is a pathway here from SetupThread, but only @@ -2736,17 +2719,11 @@ void Thread::BaseCoUninitialize() { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; - STATIC_CONTRACT_SO_INTOLERANT; STATIC_CONTRACT_MODE_PREEMPTIVE; _ASSERTE(GetThread() == this); - BEGIN_SO_TOLERANT_CODE(this); - // BEGIN_SO_TOLERANT_CODE wraps a __try/__except around this call, so if the OS were to allow - // an exception to leak through to us, we'll catch it. ::CoUninitialize(); - END_SO_TOLERANT_CODE; - }// BaseCoUninitialize #ifdef FEATURE_COMINTEROP @@ -2754,16 +2731,13 @@ void Thread::BaseWinRTUninitialize() { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; - STATIC_CONTRACT_SO_INTOLERANT; STATIC_CONTRACT_MODE_PREEMPTIVE; _ASSERTE(WinRTSupported()); _ASSERTE(GetThread() == this); _ASSERTE(IsWinRTInitialized()); - BEGIN_SO_TOLERANT_CODE(this); RoUninitialize(); - END_SO_TOLERANT_CODE; } #endif // FEATURE_COMINTEROP @@ -3311,7 +3285,6 @@ DWORD MsgWaitHelper(int numWaiters, HANDLE* phEvent, BOOL bWaitAll, DWORD millis // The true contract for GC trigger should be the following. But this puts a very strong restriction // on contract for functions that call EnablePreemptiveGC. //if (GetThread() && !ThreadStore::HoldingThreadStore(GetThread())) {GC_TRIGGERS;} else {GC_NOTRIGGER;} - STATIC_CONTRACT_SO_INTOLERANT; STATIC_CONTRACT_GC_TRIGGERS; DWORD flags = 0; @@ -3323,7 +3296,6 @@ DWORD MsgWaitHelper(int numWaiters, HANDLE* phEvent, BOOL bWaitAll, DWORD millis _ASSERTE (g_fEEShutDown); DWORD lastError = 0; - BEGIN_SO_TOLERANT_CODE(pThread); // If we're going to pump, we cannot use WAIT_ALL. That's because the wait would // only be satisfied if a message arrives while the handles are signalled. If we @@ -3371,9 +3343,6 @@ DWORD MsgWaitHelper(int numWaiters, HANDLE* phEvent, BOOL bWaitAll, DWORD millis lastError = ::GetLastError(); - END_SO_TOLERANT_CODE; - - // END_SO_TOLERANT_CODE overwrites lasterror. Let's reset it. ::SetLastError(lastError); return dwReturn; @@ -3381,23 +3350,6 @@ DWORD MsgWaitHelper(int numWaiters, HANDLE* phEvent, BOOL bWaitAll, DWORD millis #endif // FEATURE_COMINTEROP_APARTMENT_SUPPORT -DWORD WaitForMultipleObjectsEx_SO_TOLERANT (DWORD nCount, HANDLE *lpHandles, BOOL bWaitAll,DWORD dwMilliseconds, BOOL bAlertable) -{ - STATIC_CONTRACT_SO_INTOLERANT; - - DWORD dwRet = WAIT_FAILED; - DWORD lastError = 0; - - BEGIN_SO_TOLERANT_CODE (GetThread ()); - dwRet = ::WaitForMultipleObjectsEx (nCount, lpHandles, bWaitAll, dwMilliseconds, bAlertable); - lastError = ::GetLastError(); - END_SO_TOLERANT_CODE; - - // END_SO_TOLERANT_CODE overwrites lasterror. Let's reset it. - ::SetLastError(lastError); - return dwRet; -} - //-------------------------------------------------------------------- // Do appropriate wait based on apartment state (STA or MTA) DWORD Thread::DoAppropriateAptStateWait(int numWaiters, HANDLE* pHandles, BOOL bWaitAll, @@ -3406,7 +3358,6 @@ DWORD Thread::DoAppropriateAptStateWait(int numWaiters, HANDLE* pHandles, BOOL b CONTRACTL { THROWS; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; @@ -3423,7 +3374,7 @@ DWORD Thread::DoAppropriateAptStateWait(int numWaiters, HANDLE* pHandles, BOOL b } #endif // FEATURE_COMINTEROP_APARTMENT_SUPPORT - return WaitForMultipleObjectsEx_SO_TOLERANT(numWaiters, pHandles, bWaitAll, timeout, alertable); + return WaitForMultipleObjectsEx(numWaiters, pHandles, bWaitAll, timeout, alertable); } // A helper called by our two flavors of DoAppropriateWaitWorker @@ -4214,7 +4165,6 @@ void WINAPI Thread::UserInterruptAPC(ULONG_PTR data) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -4450,7 +4400,6 @@ void Thread::SetLastThrownObject(OBJECTREF throwable, BOOL isUnhandled) if ((throwable == NULL) || CLRException::IsPreallocatedExceptionObject(throwable)) NOTHROW; else THROWS; // From CreateHandle GC_NOTRIGGER; if (throwable == NULL) MODE_ANY; else MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -4489,11 +4438,7 @@ void Thread::SetLastThrownObject(OBJECTREF throwable, BOOL isUnhandled) } else { - BEGIN_SO_INTOLERANT_CODE(GetThread()); - { - m_LastThrownObjectHandle = GetDomain()->CreateHandle(throwable); - } - END_SO_INTOLERANT_CODE; + m_LastThrownObjectHandle = GetDomain()->CreateHandle(throwable); } _ASSERTE(m_LastThrownObjectHandle != NULL); @@ -4512,7 +4457,6 @@ void Thread::SetSOForLastThrownObject() NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; CANNOT_TAKE_LOCK; } CONTRACTL_END; @@ -4536,7 +4480,6 @@ OBJECTREF Thread::SafeSetLastThrownObject(OBJECTREF throwable) NOTHROW; GC_NOTRIGGER; if (throwable == NULL) MODE_ANY; else MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -4574,7 +4517,6 @@ OBJECTREF Thread::SafeSetThrowables(OBJECTREF throwable DEBUG_ARG(ThreadExceptio NOTHROW; GC_NOTRIGGER; if (throwable == NULL) MODE_ANY; else MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -4652,7 +4594,6 @@ void Thread::SetLastThrownObjectHandle(OBJECTHANDLE h) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -4676,7 +4617,6 @@ void Thread::SafeUpdateLastThrownObject(void) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_INTOLERANT; } CONTRACTL_END; @@ -5035,7 +4975,6 @@ Thread::ApartmentState Thread::GetFinalApartment() NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -5797,7 +5736,6 @@ Thread *ThreadStore::GetAllThreadList(Thread *cursor, ULONG mask, ULONG bits) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; SUPPORTS_DAC; @@ -5827,7 +5765,6 @@ Thread *ThreadStore::GetThreadList(Thread *cursor) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; SUPPORTS_DAC; @@ -5848,7 +5785,6 @@ Thread::ThreadState Thread::GetSnapshotState() CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -6073,14 +6009,11 @@ void Thread::HandleThreadInterrupt (BOOL fWaitForADUnload) { STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; - STATIC_CONTRACT_SO_TOLERANT; // If we're waiting for shutdown, we don't want to abort/interrupt this thread if (HasThreadStateNC(Thread::TSNC_BlockedForShutdown)) return; - BEGIN_SO_INTOLERANT_CODE(this); - if ((m_UserInterrupt & TI_Abort) != 0) { // If the thread is waiting for AD unload to finish, and the thread is interrupted, @@ -6094,7 +6027,6 @@ void Thread::HandleThreadInterrupt (BOOL fWaitForADUnload) COMPlusThrow(kThreadInterruptedException); } - END_SO_INTOLERANT_CODE; } #ifdef _DEBUG @@ -6104,7 +6036,6 @@ void CleanStackForFastGCStress () CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -6121,25 +6052,15 @@ void CleanStackForFastGCStress () void Thread::ObjectRefFlush(Thread* thread) { + // this is debug only code, so no need to validate + STATIC_CONTRACT_NOTHROW; + STATIC_CONTRACT_GC_NOTRIGGER; + STATIC_CONTRACT_ENTRY_POINT; - BEGIN_PRESERVE_LAST_ERROR; - - // The constructor and destructor of AutoCleanupSONotMainlineHolder (allocated by SO_NOT_MAINLINE_FUNCTION below) - // may trash the last error, so we need to save and restore last error here. Also, we need to add a scope here - // because we can't let the destructor run after we call SetLastError(). - { - // this is debug only code, so no need to validate - STATIC_CONTRACT_NOTHROW; - STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_ENTRY_POINT; - - _ASSERTE(thread->PreemptiveGCDisabled()); // Should have been in managed code - memset(thread->dangerousObjRefs, 0, sizeof(thread->dangerousObjRefs)); - thread->m_allObjRefEntriesBad = FALSE; - CLEANSTACKFORFASTGCSTRESS (); - } - - END_PRESERVE_LAST_ERROR; + _ASSERTE(thread->PreemptiveGCDisabled()); // Should have been in managed code + memset(thread->dangerousObjRefs, 0, sizeof(thread->dangerousObjRefs)); + thread->m_allObjRefEntriesBad = FALSE; + CLEANSTACKFORFASTGCSTRESS (); } #endif @@ -6410,7 +6331,6 @@ BOOL Thread::UniqueStack(void* stackStart) { NOTHROW; GC_NOTRIGGER; - SO_NOT_MAINLINE; } CONTRACTL_END; @@ -6540,7 +6460,6 @@ void * Thread::GetStackLowerBound() // Called during fiber switch. Can not have non-static contract. STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; #ifndef FEATURE_PAL MEMORY_BASIC_INFORMATION lowerBoundMemInfo; @@ -6577,7 +6496,6 @@ void *Thread::GetStackUpperBound() // Called during fiber switch. Can not have non-static contract. STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; return ClrTeb::GetStackBase(); } @@ -6588,7 +6506,6 @@ BOOL Thread::SetStackLimits(SetStackLimitScope scope) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -6659,7 +6576,6 @@ HRESULT Thread::CLRSetThreadStackGuarantee(SetThreadStackGuaranteeScope fScope) { WRAPPER(NOTHROW); GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -6738,7 +6654,6 @@ UINT_PTR Thread::GetLastNormalStackAddress(UINT_PTR StackLimit) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -6824,7 +6739,6 @@ static void DebugLogStackRegionMBIs(UINT_PTR uLowAddress, UINT_PTR uHighAddress) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; CANNOT_TAKE_LOCK; } CONTRACTL_END; @@ -6870,7 +6784,6 @@ void Thread::DebugLogStackMBIs() { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; CANNOT_TAKE_LOCK; } CONTRACTL_END; @@ -6954,7 +6867,6 @@ BOOL Thread::DoesRegionContainGuardPage(UINT_PTR uLowAddress, UINT_PTR uHighAddr { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; CANNOT_TAKE_LOCK; } CONTRACTL_END; @@ -7015,7 +6927,6 @@ BOOL Thread::DetermineIfGuardPagePresent() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; CANNOT_TAKE_LOCK; } CONTRACTL_END; @@ -7060,101 +6971,6 @@ UINT_PTR Thread::GetLastNormalStackAddress() } -#ifdef FEATURE_STACK_PROBE -/* - * CanResetStackTo - * - * Given a target stack pointer, this function will tell us whether or not we could restore the guard page if we - * unwound the stack that far. - * - * Parameters: - * stackPointer -- stack pointer that we want to try to reset the thread's stack up to. - * - * Returns: - * TRUE if there's enough room to reset the stack, false otherwise. - */ -BOOL Thread::CanResetStackTo(LPCVOID stackPointer) -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - SO_TOLERANT; - } - CONTRACTL_END; - - // How much space between the given stack pointer and the first guard page? - // - // This must be signed since the stack pointer might be in the guard region, - // which is at a lower address than GetLastNormalStackAddress will return. - INT_PTR iStackSpaceLeft = (INT_PTR)stackPointer - GetLastNormalStackAddress(); - - // We need to have enough space to call back into the EE from the handler, so we use the twice the entry point amount. - // We need enough to do work and enough that partway through that work we won't probe and COMPlusThrowSO. - - const INT_PTR iStackSizeThreshold = (ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT * 2) * GetOsPageSize()); - - if (iStackSpaceLeft > iStackSizeThreshold) - { - return TRUE; - } - else - { - return FALSE; - } -} - -/* - * IsStackSpaceAvailable - * - * Given a number of stack pages, this function will tell us whether or not we have that much space - * before the top of the stack. If we are in the guard region we must be already handling an SO, - * so we report how much space is left in the guard region - * - * Parameters: - * numPages -- the number of pages that we need. This can be a fractional amount. - * - * Returns: - * TRUE if there's that many pages of stack available - */ -BOOL Thread::IsStackSpaceAvailable(float numPages) -{ - CONTRACTL - { - NOTHROW; - GC_NOTRIGGER; - SO_TOLERANT; - } - CONTRACTL_END; - - // How much space between the current stack pointer and the first guard page? - // - // This must be signed since the stack pointer might be in the guard region, - // which is at a lower address than GetLastNormalStackAddress will return. - float iStackSpaceLeft = static_cast<float>((INT_PTR)GetCurrentSP() - (INT_PTR)GetLastNormalStackAddress()); - - // If we have access to the stack guarantee (either in the guard region or we've tripped the guard page), then - // use that. - if ((iStackSpaceLeft/GetOsPageSize()) < numPages && !DetermineIfGuardPagePresent()) - { - UINT_PTR stackGuarantee = GetStackGuarantee(); - // GetLastNormalStackAddress actually returns the 2nd to last stack page on the stack. We'll add that to our available - // amount of stack, in addition to any sort of stack guarantee we might have. - // - // All these values are OS supplied, and will never overflow. (If they do, that means the stack is on the order - // over GB, which isn't possible. - iStackSpaceLeft += stackGuarantee + GetOsPageSize(); - } - if ((iStackSpaceLeft/GetOsPageSize()) < numPages) - { - return FALSE; - } - - return TRUE; -} - -#endif // FEATURE_STACK_PROBE - /* * GetStackGuarantee * @@ -7206,7 +7022,6 @@ BOOL Thread::MarkPageAsGuard(UINT_PTR uGuardPageBase) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; CANNOT_TAKE_LOCK; } CONTRACTL_END; @@ -7252,14 +7067,10 @@ VOID Thread::RestoreGuardPage() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; CANNOT_TAKE_LOCK; } CONTRACTL_END; - // Need a hard SO probe here. - CONTRACT_VIOLATION(SOToleranceViolation); - BOOL bStackGuarded = DetermineIfGuardPagePresent(); // If the guard page is still there, then just return. @@ -8015,11 +7826,6 @@ static void ManagedThreadBase_DispatchMiddle(ManagedThreadCallState *pCallState) STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_THROWS; STATIC_CONTRACT_MODE_COOPERATIVE; - STATIC_CONTRACT_SO_TOLERANT; - - // We have the probe outside the EX_TRY below since corresponding EX_CATCH - // also invokes SO_INTOLERANT code. - BEGIN_SO_INTOLERANT_CODE(GetThread()); EX_TRY_CPP_ONLY { @@ -8091,8 +7897,6 @@ static void ManagedThreadBase_DispatchMiddle(ManagedThreadCallState *pCallState) } } EX_END_CATCH(SwallowAllExceptions); - - END_SO_INTOLERANT_CODE; } /* @@ -8130,7 +7934,6 @@ static LONG ThreadBaseRedirectingFilter(PEXCEPTION_POINTERS pExceptionInfo, LPVO } LONG ret = -1; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return EXCEPTION_CONTINUE_SEARCH;); // This will invoke the swallowing filter. If that returns EXCEPTION_CONTINUE_SEARCH, // it will trigger unhandled exception processing. @@ -8227,8 +8030,6 @@ static LONG ThreadBaseRedirectingFilter(PEXCEPTION_POINTERS pExceptionInfo, LPVO } } - - END_SO_INTOLERANT_CODE; return ret; } @@ -8682,7 +8483,6 @@ BOOL ThreadStore::HoldingThreadStore(Thread *pThread) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -8749,7 +8549,6 @@ INT32 Thread::ResetManagedThreadObjectInCoopMode(INT32 nPriority) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -8770,7 +8569,6 @@ BOOL Thread::IsRealThreadPoolResetNeeded() NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -8794,7 +8592,7 @@ void Thread::InternalReset(BOOL fNotFinalizerThread, BOOL fThreadObjectResetNeed { CONTRACTL { NOTHROW; - if(!fNotFinalizerThread || fThreadObjectResetNeeded) {GC_TRIGGERS;SO_INTOLERANT;} else {GC_NOTRIGGER;SO_TOLERANT;} + if(!fNotFinalizerThread || fThreadObjectResetNeeded) {GC_TRIGGERS;} else {GC_NOTRIGGER;} } CONTRACTL_END; @@ -8847,11 +8645,9 @@ HRESULT Thread::Abort () { NOTHROW; if (GetThread()) {GC_TRIGGERS;} else {DISABLED(GC_NOTRIGGER);} - SO_TOLERANT; } CONTRACTL_END; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW;); EX_TRY { UserAbort(TAR_Thread, EEPolicy::TA_Safe, INFINITE, Thread::UAC_Host); @@ -8860,7 +8656,6 @@ HRESULT Thread::Abort () { } EX_END_CATCH(SwallowAllExceptions); - END_SO_INTOLERANT_CODE; return S_OK; } @@ -8871,12 +8666,9 @@ HRESULT Thread::RudeAbort() { NOTHROW; if (GetThread()) {GC_TRIGGERS;} else {DISABLED(GC_NOTRIGGER);} - SO_TOLERANT; } CONTRACTL_END; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - EX_TRY { UserAbort(TAR_Thread, EEPolicy::TA_Rude, INFINITE, Thread::UAC_Host); @@ -8886,8 +8678,6 @@ HRESULT Thread::RudeAbort() } EX_END_CATCH(SwallowAllExceptions); - END_SO_INTOLERANT_CODE; - return S_OK; } @@ -8896,7 +8686,6 @@ HRESULT Thread::NeedsPriorityScheduling(BOOL *pbNeedsPriorityScheduling) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -8988,13 +8777,10 @@ void Thread::SetupThreadForHost() { THROWS; GC_TRIGGERS; - SO_TOLERANT; } CONTRACTL_END; _ASSERTE (GetThread() == this); - CONTRACT_VIOLATION(SOToleranceViolation); - } @@ -9002,7 +8788,6 @@ ETaskType GetCurrentTaskType() { STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; - STATIC_CONTRACT_SO_TOLERANT; ETaskType TaskType = TT_UNKNOWN; size_t type = (size_t)ClrFlsGetValue (TlsIdx_ThreadType); diff --git a/src/vm/threads.h b/src/vm/threads.h index b4e3b9dc70..61d92e2871 100644 --- a/src/vm/threads.h +++ b/src/vm/threads.h @@ -1564,25 +1564,6 @@ public: return (m_State & TS_Detached); } -#ifdef FEATURE_STACK_PROBE -//--------------------------------------------------------------------------------------- -// -// IsSOTolerant - Is the current thread in SO Tolerant region? -// -// Arguments: -// pLimitFrame: the limit of search for frames -// -// Return Value: -// TRUE if in SO tolerant region. -// FALSE if in SO intolerant region. -// -// Note: -// We walk our frame chain to decide. If HelperMethodFrame is seen first, we are in tolerant -// region. If EnterSOIntolerantCodeFrame is seen first, we are in intolerant region. -// - BOOL IsSOTolerant(void * pLimitFrame); -#endif - #ifdef _DEBUG class DisableSOCheckInHCALL { @@ -1790,7 +1771,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } @@ -1817,7 +1797,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } @@ -2529,7 +2508,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -2651,7 +2629,6 @@ public: DWORD GetThreadId() { - STATIC_CONTRACT_SO_TOLERANT; LIMITED_METHOD_DAC_CONTRACT; _ASSERTE(m_ThreadId != UNINITIALIZED_THREADID); return m_ThreadId; @@ -3455,7 +3432,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3511,16 +3487,6 @@ public: // stack overflow exception. BOOL DetermineIfGuardPagePresent(); -#ifdef FEATURE_STACK_PROBE - // CanResetStackTo will return TRUE if the given stack pointer is far enough away from the guard page to proper - // restore the guard page with RestoreGuardPage. - BOOL CanResetStackTo(LPCVOID stackPointer); - - // IsStackSpaceAvailable will return true if there are the given number of stack pages available on the stack. - BOOL IsStackSpaceAvailable(float numPages); - -#endif - // Returns the amount of stack available after an SO but before the OS rips the process. static UINT_PTR GetStackGuarantee(); @@ -4623,27 +4589,6 @@ public: #endif // defined(GCCOVER_TOLERATE_SPURIOUS_AV) #endif // HAVE_GCCOVER -#if defined(_DEBUG) && defined(FEATURE_STACK_PROBE) - class ::BaseStackGuard; -private: - // This field is used for debugging purposes to allow easy access to the stack guard - // chain and also in SO-tolerance checking to quickly determine if a guard is in place. - BaseStackGuard *m_pCurrentStackGuard; - -public: - BaseStackGuard *GetCurrentStackGuard() - { - LIMITED_METHOD_CONTRACT; - return m_pCurrentStackGuard; - } - - void SetCurrentStackGuard(BaseStackGuard *pGuard) - { - LIMITED_METHOD_CONTRACT; - m_pCurrentStackGuard = pGuard; - } -#endif - private: BOOL m_fCompletionPortDrained; public: @@ -5398,7 +5343,6 @@ private: { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -6607,29 +6551,6 @@ class GCForbidLoaderUseHolder #endif // _DEBUG_IMPL #endif // DACCESS_COMPILE -#ifdef FEATURE_STACK_PROBE -#ifdef _DEBUG_IMPL -inline void NO_FORBIDGC_LOADER_USE_ThrowSO() -{ - WRAPPER_NO_CONTRACT; - if (FORBIDGC_LOADER_USE_ENABLED()) - { - //if you hitting this assert maybe a failure was injected at the place - // it won't occur in a real-world scenario, see VSW 397871 - // then again maybe it 's a bug at the place FORBIDGC_LOADER_USE_ENABLED was set - _ASSERTE(!"Unexpected SO, please read the comment"); - } - else - COMPlusThrowSO(); -} -#else -inline void NO_FORBIDGC_LOADER_USE_ThrowSO() -{ - COMPlusThrowSO(); -} -#endif -#endif - // There is an MDA which can detect illegal reentrancy into the CLR. For instance, if you call managed // code from a native vectored exception handler, this might cause a reverse PInvoke to occur. But if the // exception was triggered from code that was executing in cooperative GC mode, we now have GC holes and diff --git a/src/vm/threads.inl b/src/vm/threads.inl index 2da3c1a376..df50a51b02 100644 --- a/src/vm/threads.inl +++ b/src/vm/threads.inl @@ -82,7 +82,6 @@ inline void Thread::SetKickOffDomainId(ADID ad) CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -95,7 +94,6 @@ inline ADID Thread::GetKickOffDomainId() CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -108,7 +106,6 @@ inline OBJECTHANDLE Thread::GetThreadCurrNotification() { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; SUPPORTS_DAC; @@ -123,7 +120,6 @@ inline void Thread::SetThreadCurrNotification(OBJECTHANDLE handle) { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -137,7 +133,6 @@ inline void Thread::ClearThreadCurrNotification() { CONTRACTL { - SO_NOT_MAINLINE; NOTHROW; GC_NOTRIGGER; } @@ -152,7 +147,6 @@ inline OBJECTREF Thread::GetExposedObjectRaw() CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -163,14 +157,7 @@ inline OBJECTREF Thread::GetExposedObjectRaw() inline void Thread::FinishSOWork() { WRAPPER_NO_CONTRACT; -#ifdef FEATURE_STACK_PROBE - if (HasThreadStateNC(TSNC_SOWorkNeeded)) - { - ResetThreadStateNC(TSNC_SOWorkNeeded); - } -#else _ASSERTE(!HasThreadStateNC(TSNC_SOWorkNeeded)); -#endif } #ifdef FEATURE_COMINTEROP diff --git a/src/vm/threadstatics.cpp b/src/vm/threadstatics.cpp index fbcd4fa9b3..877589835d 100644 --- a/src/vm/threadstatics.cpp +++ b/src/vm/threadstatics.cpp @@ -23,7 +23,6 @@ void ThreadLocalBlock::FreeTLM(SIZE_T i, BOOL isThreadShuttingdown) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -81,7 +80,6 @@ void ThreadLocalBlock::FreeTable() { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -243,7 +241,6 @@ DWORD ThreadLocalModule::GetClassFlags(MethodTable* pMT, DWORD iClassIndex) // i CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; if (pMT->IsDynamicStatics()) @@ -288,7 +285,6 @@ void ThreadLocalBlock::AddPinningHandleToList(OBJECTHANDLE oh) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -302,7 +298,6 @@ void ThreadLocalBlock::FreePinningHandles() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/threadstatics.h b/src/vm/threadstatics.h index e2c9339b2e..c85245dba3 100644 --- a/src/vm/threadstatics.h +++ b/src/vm/threadstatics.h @@ -115,7 +115,6 @@ struct ThreadLocalModule NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -169,7 +168,6 @@ struct ThreadLocalModule NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC; } CONTRACTL_END; @@ -378,7 +376,6 @@ struct ThreadLocalModule { THROWS; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/threadsuspend.cpp b/src/vm/threadsuspend.cpp index 72218dbae9..fcc9732a31 100644 --- a/src/vm/threadsuspend.cpp +++ b/src/vm/threadsuspend.cpp @@ -456,7 +456,6 @@ DWORD Thread::ResumeThread() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1012,7 +1011,6 @@ BOOL Thread::ReadyForAsyncException() CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -1026,9 +1024,6 @@ BOOL Thread::ReadyForAsyncException() return TRUE; } - // This needs the probe with GenerateHardSO - CONTRACT_VIOLATION(SOToleranceViolation); - if (GetThread() == this && HasThreadStateNC (TSNC_PreparingAbort) && !IsRudeAbort() ) { STRESS_LOG0(LF_APPDOMAIN, LL_INFO10, "in Thread::ReadyForAbort PreparingAbort\n"); @@ -1194,7 +1189,6 @@ BOOL Thread::IsRudeAbort() CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -2751,13 +2745,10 @@ void Thread::RareDisablePreemptiveGC() CONTRACTL { NOTHROW; - SO_TOLERANT; DISABLED(GC_TRIGGERS); // I think this is actually wrong: prevents a p->c->p mode switch inside a NOTRIGGER region. } CONTRACTL_END; - CONTRACT_VIOLATION(SOToleranceViolation); - if (IsAtProcessExit()) { goto Exit; @@ -3000,9 +2991,7 @@ void Thread::HandleThreadAbort (BOOL fForce) STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; - STATIC_CONTRACT_SO_TOLERANT; - BEGIN_SO_INTOLERANT_CODE(this); TESTHOOKCALL(AppDomainCanBeUnloaded(GetDomain()->GetId().m_dwId,FALSE)); // It's possible we could go through here if we hit a hard SO and MC++ has called back @@ -3058,7 +3047,6 @@ void Thread::HandleThreadAbort (BOOL fForce) RaiseTheExceptionInternalOnly(exceptObj, FALSE); } - END_SO_INTOLERANT_CODE; END_PRESERVE_LAST_ERROR; } @@ -3090,9 +3078,6 @@ void Thread::PreWorkForThreadAbort() case eRudeExitProcess: case eDisableRuntime: { - // We're about to exit the process, if we take an SO here we'll just exit faster right??? - CONTRACT_VIOLATION(SOToleranceViolation); - GetEEPolicy()->NotifyHostOnDefaultAction(OPR_ThreadRudeAbortInCriticalRegion,action); GetEEPolicy()->HandleExitProcessFromEscalation(action,HOST_E_EXITPROCESS_ADUNLOAD); } @@ -3178,12 +3163,11 @@ void Thread::RareEnablePreemptiveGC() CONTRACTL { NOTHROW; DISABLED(GC_TRIGGERS); // I think this is actually wrong: prevents a p->c->p mode switch inside a NOTRIGGER region. - SO_TOLERANT; } CONTRACTL_END; // @todo - Needs a hard SO probe - CONTRACT_VIOLATION(GCViolation|FaultViolation|SOToleranceViolation); + CONTRACT_VIOLATION(GCViolation|FaultViolation); // If we have already received our PROCESS_DETACH during shutdown, there is only one thread in the // process and no coordination is necessary. @@ -3342,7 +3326,6 @@ void RedirectedThreadFrame::ExceptionUnwind() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -3485,7 +3468,6 @@ void NotifyHostOnGCSuspension() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -3517,15 +3499,6 @@ void __stdcall Thread::RedirectedHandledJITCase(RedirectReason reason) Thread *pThread = GetThread(); _ASSERTE(pThread); -#ifdef FEATURE_STACK_PROBE - if (GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) == eRudeUnloadAppDomain) - { - RetailStackProbe(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), pThread); - } -#endif - - BEGIN_CONTRACT_VIOLATION(SOToleranceViolation); - // Get the saved context CONTEXT *pCtx = pThread->GetSavedRedirectContext(); _ASSERTE(pCtx); @@ -3683,9 +3656,6 @@ void __stdcall Thread::RedirectedHandledJITCase(RedirectReason reason) } #endif // _TARGET_X86_ - - END_CONTRACT_VIOLATION; - } //**************************************************************************************** @@ -4988,13 +4958,6 @@ ThrowControlForThread( _ASSERTE(pThread->PreemptiveGCDisabled()); -#ifdef FEATURE_STACK_PROBE - if (GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) == eRudeUnloadAppDomain) - { - RetailStackProbe(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), pThread); - } -#endif - // Check if we can start abort // We use InducedThreadRedirect as a marker to tell stackwalker that a thread is redirected from JIT code. // This is to distinguish a thread is in Preemptive mode and in JIT code. @@ -5830,7 +5793,6 @@ void Thread::UnhijackThread() CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; CANNOT_TAKE_LOCK; } CONTRACTL_END; @@ -6061,24 +6023,12 @@ void STDCALL OnHijackWorker(HijackArgs * pArgs) CONTRACTL{ THROWS; GC_TRIGGERS; - SO_TOLERANT; } CONTRACTL_END; #ifdef HIJACK_NONINTERRUPTIBLE_THREADS Thread *thread = GetThread(); -#ifdef FEATURE_STACK_PROBE - if (GetEEPolicy()->GetActionOnFailure(FAIL_StackOverflow) == eRudeUnloadAppDomain) - { - // Make sure default domain does not see SO. - // probe for our entry point amount and throw if not enough stack - RetailStackProbe(ADJUST_PROBE(DEFAULT_ENTRY_PROBE_AMOUNT), thread); - } -#endif // FEATURE_STACK_PROBE - - CONTRACT_VIOLATION(SOToleranceViolation); - thread->ResetThreadState(Thread::TS_Hijacked); // Fix up our caller's stack, so it can resume from the hijack correctly diff --git a/src/vm/tlbexport.h b/src/vm/tlbexport.h index c104c5b437..32db10b7aa 100644 --- a/src/vm/tlbexport.h +++ b/src/vm/tlbexport.h @@ -158,7 +158,6 @@ private: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -239,7 +238,7 @@ protected: } ~CHrefOfTIHash() { - CONTRACTL { NOTHROW; SO_TOLERANT; } CONTRACTL_END; + CONTRACTL { NOTHROW; } CONTRACTL_END; Clear(); } diff --git a/src/vm/typectxt.cpp b/src/vm/typectxt.cpp index e2d6abaa95..8d3341a370 100644 --- a/src/vm/typectxt.cpp +++ b/src/vm/typectxt.cpp @@ -23,7 +23,6 @@ void SigTypeContext::InitTypeContext(MethodDesc *md, Instantiation exactClassInst, Instantiation exactMethodInst, SigTypeContext *pRes) { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; MethodTable *pMT = md->GetMethodTable(); if (pMT->IsArray()) @@ -43,7 +42,6 @@ void SigTypeContext::InitTypeContext(MethodDesc *md, SigTypeContext *pRes) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; PRECONDITION(CheckPointer(md)); @@ -67,7 +65,6 @@ void SigTypeContext::InitTypeContext(MethodDesc *md, TypeHandle declaringType, S NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; PRECONDITION(CheckPointer(md)); @@ -137,7 +134,6 @@ void SigTypeContext::InitTypeContext(MethodDesc *md, TypeHandle declaringType, I NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; PRECONDITION(CheckPointer(md)); } CONTRACTL_END; @@ -181,7 +177,6 @@ void SigTypeContext::InitTypeContext(FieldDesc *pFD, TypeHandle declaringType, S NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; PRECONDITION(CheckPointer(declaringType, NULL_OK)); PRECONDITION(CheckPointer(pFD)); @@ -197,7 +192,6 @@ void SigTypeContext::InitTypeContext(TypeHandle th, SigTypeContext *pRes) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END; if (th.IsNull()) @@ -221,7 +215,6 @@ const SigTypeContext * SigTypeContext::GetOptionalTypeContext(MethodDesc *md, Ty { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -246,7 +239,6 @@ const SigTypeContext * SigTypeContext::GetOptionalTypeContext(TypeHandle th, Sig { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -272,7 +264,6 @@ BOOL SigTypeContext::IsValidTypeOnlyInstantiationOf(const SigTypeContext *pCtxTy { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/typedesc.cpp b/src/vm/typedesc.cpp index bac52f5943..a19551cea1 100644 --- a/src/vm/typedesc.cpp +++ b/src/vm/typedesc.cpp @@ -25,8 +25,6 @@ #include "compile.h" #endif #include "array.h" -#include "stackprobe.h" - #ifndef DACCESS_COMPILE #ifdef _DEBUG @@ -107,12 +105,10 @@ PTR_Module TypeDesc::GetLoaderModule() _ASSERTE(GetInternalCorElementType() == ELEMENT_TYPE_FNPTR); PTR_FnPtrTypeDesc asFnPtr = dac_cast<PTR_FnPtrTypeDesc>(this); - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), fFail = TRUE ); if (!fFail) { - retVal = ClassLoader::ComputeLoaderModuleForFunctionPointer(asFnPtr->GetRetAndArgTypesPointer(), asFnPtr->GetNumArgs()+1); + retVal = ClassLoader::ComputeLoaderModuleForFunctionPointer(asFnPtr->GetRetAndArgTypesPointer(), asFnPtr->GetNumArgs()+1); } - END_SO_INTOLERANT_CODE; return retVal; } } @@ -145,7 +141,6 @@ PTR_Module TypeDesc::GetModule() { NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; SUPPORTS_DAC; // Function pointer types belong to no module //PRECONDITION(GetInternalCorElementType() != ELEMENT_TYPE_FNPTR); @@ -541,7 +536,6 @@ TypeHandle::CastResult TypeDesc::CanCastToNoGC(TypeHandle toType) NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END @@ -633,7 +627,6 @@ TypeHandle::CastResult TypeDesc::CanCastParamNoGC(TypeHandle fromParam, TypeHand NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END @@ -708,7 +701,6 @@ BOOL TypeDesc::IsEquivalentTo(TypeHandle type COMMA_INDEBUG(TypeHandlePairList * THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/typedesc.h b/src/vm/typedesc.h index 06b544b79c..a6671dfbab 100644 --- a/src/vm/typedesc.h +++ b/src/vm/typedesc.h @@ -350,7 +350,6 @@ public: , m_pCCWTemplate(NULL) #endif // FEATURE_COMINTEROP { - STATIC_CONTRACT_SO_TOLERANT; WRAPPER_NO_CONTRACT; INDEBUG(Verify()); } diff --git a/src/vm/typehandle.cpp b/src/vm/typehandle.cpp index 5004ab9c3d..53725aff0c 100644 --- a/src/vm/typehandle.cpp +++ b/src/vm/typehandle.cpp @@ -42,7 +42,6 @@ void TypeHandle::NormalizeUnsharedArrayMT() { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; // @TODO: This is probably incorrect if (IsNull() || IsTypeDesc()) return; @@ -61,8 +60,6 @@ void TypeHandle::NormalizeUnsharedArrayMT() CorElementType kind = AsMethodTable()->GetInternalCorElementType(); unsigned rank = AsMethodTable()->GetRank(); - // @todo This should be turned into a probe with a hard SO when we have one - CONTRACT_VIOLATION(SOToleranceViolation); // == FailIfNotLoadedOrNotRestored TypeHandle arrayType = ClassLoader::LoadArrayTypeThrowing( elemType, kind, @@ -194,9 +191,7 @@ Module *TypeHandle::GetDefiningModuleForOpenType() const SUPPORTS_DAC; Module* returnValue = NULL; - - INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(goto Exit;); - + if (IsGenericVariable()) { PTR_TypeVarTypeDesc pTyVar = dac_cast<PTR_TypeVarTypeDesc>(AsTypeDesc()); @@ -213,15 +208,12 @@ Module *TypeHandle::GetDefiningModuleForOpenType() const returnValue = GetMethodTable()->GetDefiningModuleForOpenType(); } Exit: - ; - END_INTERIOR_STACK_PROBE; return returnValue; } BOOL TypeHandle::ContainsGenericVariables(BOOL methodOnly /*=FALSE*/) const { - STATIC_CONTRACT_SO_TOLERANT; STATIC_CONTRACT_NOTHROW; SUPPORTS_DAC; @@ -405,7 +397,6 @@ PTR_LoaderAllocator TypeHandle::GetLoaderAllocator() const STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_INTOLERANT; STATIC_CONTRACT_SUPPORTS_DAC; if (IsTypeDesc()) @@ -755,18 +746,14 @@ void TypeHandle::GetName(SString &result) const { THROWS; GC_NOTRIGGER; - SO_TOLERANT; INJECT_FAULT(COMPlusThrowOM();); } CONTRACTL_END - INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(goto Exit;); - { - if (IsTypeDesc()) { AsTypeDesc()->GetName(result); - goto Exit; + return; } AsMethodTable()->_GetFullyQualifiedNameForClass(result); @@ -775,10 +762,6 @@ void TypeHandle::GetName(SString &result) const Instantiation inst = GetInstantiation(); if (!inst.IsEmpty()) TypeString::AppendInst(result, inst); - } -Exit: - ; - END_INTERIOR_STACK_PROBE; } TypeHandle TypeHandle::GetParent() const @@ -786,7 +769,6 @@ TypeHandle TypeHandle::GetParent() const STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; if (IsTypeDesc()) return(AsTypeDesc()->GetParent()); @@ -1276,7 +1258,6 @@ OBJECTREF TypeHandle::GetManagedClassObjectFast() const NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; FORBID_FAULT; } @@ -1605,7 +1586,6 @@ BOOL TypeHandle::SatisfiesClassConstraints() const THROWS; GC_TRIGGERS; MODE_ANY; - SO_INTOLERANT; INJECT_FAULT(COMPlusThrowOM()); } @@ -1617,8 +1597,6 @@ BOOL TypeHandle::SatisfiesClassConstraints() const Instantiation typicalInst; SigTypeContext typeContext; TypeHandle thParent; - - INTERIOR_STACK_PROBE_CHECK_THREAD; //TODO: cache (positive?) result in methodtable using, say, enum_flag2_UNUSEDxxx @@ -1627,14 +1605,12 @@ BOOL TypeHandle::SatisfiesClassConstraints() const if (!thParent.IsNull() && !thParent.SatisfiesClassConstraints()) { - returnValue = FALSE; - goto Exit; + return FALSE; } if (!HasInstantiation()) { - returnValue = TRUE; - goto Exit; + return TRUE; } classInst = GetInstantiation(); @@ -1646,9 +1622,9 @@ BOOL TypeHandle::SatisfiesClassConstraints() const typicalInst = thCanonical.GetInstantiation(); SigTypeContext::InitTypeContext(*this, &typeContext); - + for (DWORD i = 0; i < classInst.GetNumArgs(); i++) - { + { TypeHandle thArg = classInst[i]; _ASSERTE(!thArg.IsNull()); @@ -1660,23 +1636,16 @@ BOOL TypeHandle::SatisfiesClassConstraints() const if (!tyvar->SatisfiesConstraints(&typeContext, thArg)) { - returnValue = FALSE; - goto Exit; + return FALSE; } + } - } - returnValue = TRUE; -Exit: - ; - END_INTERIOR_STACK_PROBE; - - return returnValue; + return TRUE; } TypeKey TypeHandle::GetTypeKey() const { LIMITED_METHOD_CONTRACT; - STATIC_CONTRACT_SO_TOLERANT; PRECONDITION(!IsGenericVariable()); if (IsTypeDesc()) @@ -1845,7 +1814,6 @@ CHECK TypeHandle::CheckFullyLoaded() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/typehandle.h b/src/vm/typehandle.h index f704c3e487..9e373df86d 100644 --- a/src/vm/typehandle.h +++ b/src/vm/typehandle.h @@ -674,7 +674,6 @@ inline CHECK CheckPointer(TypeHandle th, IsNullOK ok = NULL_NOT_OK) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; SUPPORTS_DAC; STATIC_CONTRACT_CANNOT_TAKE_LOCK; diff --git a/src/vm/typehandle.inl b/src/vm/typehandle.inl index 9f6fb7b344..545519fb1d 100644 --- a/src/vm/typehandle.inl +++ b/src/vm/typehandle.inl @@ -203,7 +203,6 @@ inline BOOL TypeHandle::IsEquivalentTo(TypeHandle type COMMA_INDEBUG(TypeHandleP THROWS; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/typehash.cpp b/src/vm/typehash.cpp index a1d6d77025..552960b916 100644 --- a/src/vm/typehash.cpp +++ b/src/vm/typehash.cpp @@ -224,7 +224,6 @@ static DWORD HashTypeHandle(DWORD level, TypeHandle t) NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; PRECONDITION(CheckPointer(t)); PRECONDITION(!t.IsEncodedFixup()); SUPPORTS_DAC; @@ -233,8 +232,6 @@ static DWORD HashTypeHandle(DWORD level, TypeHandle t) DWORD retVal = 0; - INTERIOR_STACK_PROBE_NOTHROW_CHECK_THREAD(goto Exit;); - if (t.HasTypeParam()) { retVal = HashParamType(level, t.GetInternalCorElementType(), t.GetTypeParam()); @@ -254,12 +251,6 @@ static DWORD HashTypeHandle(DWORD level, TypeHandle t) } else retVal = HashPossiblyInstantiatedType(level, t.GetCl(), Instantiation()); - -#if defined(FEATURE_STACK_PROBE) && !defined(DACCESS_COMPILE) -Exit: - ; -#endif - END_INTERIOR_STACK_PROBE; return retVal; } @@ -624,7 +615,6 @@ BOOL EETypeHashTable::ContainsValue(TypeHandle th) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; diff --git a/src/vm/typekey.h b/src/vm/typekey.h index 22f8abf3c2..95a9f8b3b0 100644 --- a/src/vm/typekey.h +++ b/src/vm/typekey.h @@ -148,7 +148,6 @@ public: { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; SUPPORTS_DAC; } diff --git a/src/vm/typeparse.cpp b/src/vm/typeparse.cpp index 1fd867ad5e..34bf9647e7 100644 --- a/src/vm/typeparse.cpp +++ b/src/vm/typeparse.cpp @@ -16,7 +16,6 @@ #include "typeparse.h" #include "typestring.h" #include "assemblynative.hpp" -#include "stackprobe.h" #include "fstring.h" // @@ -68,7 +67,6 @@ HRESULT STDMETHODCALLTYPE TypeNameFactory::ParseTypeName(LPCWSTR szTypeName, DWO { CONTRACTL { - SO_TOLERANT; WRAPPER(THROWS); }CONTRACTL_END; @@ -76,7 +74,6 @@ HRESULT STDMETHODCALLTYPE TypeNameFactory::ParseTypeName(LPCWSTR szTypeName, DWO return E_INVALIDARG; HRESULT hr = S_OK; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); *ppTypeName = NULL; *pError = (DWORD)-1; @@ -102,8 +99,6 @@ HRESULT STDMETHODCALLTYPE TypeNameFactory::ParseTypeName(LPCWSTR szTypeName, DWO } } - END_SO_INTOLERANT_CODE; - return hr; } @@ -124,8 +119,6 @@ HRESULT STDMETHODCALLTYPE TypeNameFactory::GetTypeNameBuilder(ITypeNameBuilder** HRESULT hr = S_OK; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - ITypeNameBuilder* pTypeNameBuilder = new (nothrow) TypeNameBuilderWrapper(); if (pTypeNameBuilder) @@ -139,8 +132,6 @@ HRESULT STDMETHODCALLTYPE TypeNameFactory::GetTypeNameBuilder(ITypeNameBuilder** hr = E_OUTOFMEMORY; } - END_SO_INTOLERANT_CODE; - return hr; } @@ -153,14 +144,10 @@ SString* TypeName::ToString(SString* pBuf, BOOL bAssemblySpec, BOOL bSignature, PRECONDITION(!bGenericArguments & !bSignature &! bAssemblySpec); - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return pBuf); - { TypeNameBuilder tnb(pBuf); for (COUNT_T i = 0; i < m_names.GetCount(); i ++) tnb.AddName(m_names[i]->GetUnicode()); - } - END_SO_INTOLERANT_CODE; return pBuf; } @@ -181,10 +168,8 @@ DWORD STDMETHODCALLTYPE TypeName::Release() { THROWS; GC_TRIGGERS; - SO_TOLERANT; } CONTRACTL_END; - VALIDATE_BACKOUT_STACK_CONSUMPTION; m_count--; @@ -201,10 +186,8 @@ TypeName::~TypeName() { THROWS; GC_TRIGGERS; - SO_TOLERANT; } CONTRACTL_END; - VALIDATE_BACKOUT_STACK_CONSUMPTION; for(COUNT_T i = 0; i < m_genericArguments.GetCount(); i ++) m_genericArguments[i]->Release(); @@ -243,7 +226,6 @@ HRESULT STDMETHODCALLTYPE TypeName::GetNames(DWORD count, BSTR* bszName, DWORD* { CONTRACTL { - SO_TOLERANT; WRAPPER(THROWS); }CONTRACTL_END; @@ -260,12 +242,8 @@ HRESULT STDMETHODCALLTYPE TypeName::GetNames(DWORD count, BSTR* bszName, DWORD* if (!bszName) return E_INVALIDARG; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - { for (COUNT_T i = 0; i < m_names.GetCount(); i ++) bszName[i] = SysAllocString(m_names[i]->GetUnicode()); - } - END_SO_INTOLERANT_CODE; return hr; } @@ -343,7 +321,6 @@ HRESULT STDMETHODCALLTYPE TypeName::GetAssemblyName(BSTR* pszAssemblyName) { CONTRACTL { - SO_TOLERANT; WRAPPER(THROWS); }CONTRACTL_END; @@ -352,14 +329,9 @@ HRESULT STDMETHODCALLTYPE TypeName::GetAssemblyName(BSTR* pszAssemblyName) if (pszAssemblyName == NULL) return E_INVALIDARG; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - { *pszAssemblyName = SysAllocString(m_assembly.GetUnicode()); - } - END_SO_INTOLERANT_CODE; - if (*pszAssemblyName == NULL) - hr= E_OUTOFMEMORY; + hr = E_OUTOFMEMORY; return hr; } @@ -1430,18 +1402,6 @@ TypeHandle TypeName::GetTypeFromAsm() if (pKeepAlive == NULL) pAsmRef = NULL; - //requires a lot of space - DECLARE_INTERIOR_STACK_PROBE; - // This function is recursive, so it must have an interior probe - if (bThrowIfNotFound) - { - DO_INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(12); - } - else - { - DO_INTERIOR_STACK_PROBE_FOR_NOTHROW_CHECK_THREAD(12, goto Exit;); - } - // An explicit assembly has been specified so look for the type there if (!GetAssembly()->IsEmpty()) { @@ -1643,8 +1603,6 @@ TypeHandle TypeName::GetTypeFromAsm() Exit: ; - END_INTERIOR_STACK_PROBE; - GCPROTECT_END(); RETURN th; diff --git a/src/vm/typeparse.h b/src/vm/typeparse.h index 14cd8431b2..171a22cac3 100644 --- a/src/vm/typeparse.h +++ b/src/vm/typeparse.h @@ -95,10 +95,8 @@ private: CONTRACTL { NOTHROW; - SO_TOLERANT; } CONTRACTL_END; - VALIDATE_BACKOUT_STACK_CONSUMPTION; if (m_next) delete m_next; diff --git a/src/vm/typestring.cpp b/src/vm/typestring.cpp index 7f5393575d..bdf8cd9694 100644 --- a/src/vm/typestring.cpp +++ b/src/vm/typestring.cpp @@ -578,8 +578,6 @@ HRESULT TypeNameBuilder::AddAssemblySpec(LPCWSTR szAssemblySpec) HRESULT hr = S_OK; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - m_parseState = ParseStateASSEMSPEC; if (szAssemblySpec && *szAssemblySpec) @@ -599,8 +597,6 @@ HRESULT TypeNameBuilder::AddAssemblySpec(LPCWSTR szAssemblySpec) hr = S_OK; } - END_SO_INTOLERANT_CODE; - return hr; } @@ -629,8 +625,6 @@ HRESULT TypeNameBuilder::Clear() } CONTRACTL_END; - CONTRACT_VIOLATION(SOToleranceViolation); - if (m_pStr) { m_pStr->Clear(); @@ -660,12 +654,10 @@ void TypeString::AppendTypeDef(SString& ss, IMDInternalImport *pImport, mdTypeDe } CONTRACT_END - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(COMPlusThrowSO()); { TypeNameBuilder tnb(&ss, TypeNameBuilder::ParseStateNAME); AppendTypeDef(tnb, pImport, td, format); } - END_SO_INTOLERANT_CODE; RETURN; } @@ -745,14 +737,12 @@ void TypeString::AppendInst(SString& ss, Instantiation inst, DWORD format) } CONTRACT_END - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(COMPlusThrowSO()); { TypeNameBuilder tnb(&ss, TypeNameBuilder::ParseStateNAME); if ((format & FormatAngleBrackets) != 0) tnb.SetUseAngleBracketsForGenerics(TRUE); AppendInst(tnb, inst, format); } - END_SO_INTOLERANT_CODE; RETURN; } @@ -854,15 +844,13 @@ void TypeString::AppendType(SString& ss, TypeHandle ty, Instantiation typeInstan THROWS; } CONTRACT_END - - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(COMPlusThrowSO()); + { TypeNameBuilder tnb(&ss); if ((format & FormatAngleBrackets) != 0) tnb.SetUseAngleBracketsForGenerics(TRUE); AppendType(tnb, ty, typeInstantiation, format); } - END_SO_INTOLERANT_CODE; RETURN; } @@ -883,8 +871,6 @@ void TypeString::AppendType(TypeNameBuilder& tnb, TypeHandle ty, Instantiation t } CONTRACT_END - INTERIOR_STACK_PROBE_FOR_CHECK_THREAD(10); - BOOL bToString = (format & (FormatNamespace|FormatFullInst|FormatAssembly)) == FormatNamespace; // It's null! @@ -1022,12 +1008,9 @@ void TypeString::AppendType(TypeNameBuilder& tnb, TypeHandle ty, Instantiation t tnb.AddAssemblySpec(pAssemblyName.GetUnicode()); - } - - END_INTERIOR_STACK_PROBE; - + } - RETURN; + RETURN; } void TypeString::AppendMethod(SString& s, MethodDesc *pMD, Instantiation typeInstantiation, const DWORD format) @@ -1077,7 +1060,6 @@ void TypeString::AppendMethodImpl(SString& ss, MethodDesc *pMD, Instantiation ty } CONTRACTL_END - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(COMPlusThrowSO()); { TypeHandle th; @@ -1153,7 +1135,6 @@ void TypeString::AppendMethodImpl(SString& ss, MethodDesc *pMD, Instantiation ty } } } - END_SO_INTOLERANT_CODE; } void TypeString::AppendField(SString& s, FieldDesc *pFD, Instantiation typeInstantiation, const DWORD format /* = FormatNamespace */) @@ -1168,7 +1149,6 @@ void TypeString::AppendField(SString& s, FieldDesc *pFD, Instantiation typeInsta } CONTRACTL_END; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(COMPlusThrowSO()); { TypeHandle th(pFD->GetApproxEnclosingMethodTable()); AppendType(s, th, typeInstantiation, format); @@ -1176,7 +1156,6 @@ void TypeString::AppendField(SString& s, FieldDesc *pFD, Instantiation typeInsta s.AppendUTF8(NAMESPACE_SEPARATOR_STR); s.AppendUTF8(pFD->GetName()); } - END_SO_INTOLERANT_CODE; } #ifdef _DEBUG @@ -1219,7 +1198,6 @@ void TypeString::AppendTypeDebug(SString& ss, TypeHandle t) NOTHROW; PRECONDITION(CheckPointer(t)); PRECONDITION(ss.Check()); - SO_NOT_MAINLINE; } CONTRACTL_END @@ -1249,7 +1227,6 @@ void TypeString::AppendTypeKeyDebug(SString& ss, TypeKey *pTypeKey) NOTHROW; PRECONDITION(CheckPointer(pTypeKey)); PRECONDITION(ss.Check()); - SO_NOT_MAINLINE; } CONTRACTL_END @@ -1281,7 +1258,6 @@ void TypeString::AppendTypeKey(TypeNameBuilder& tnb, TypeKey *pTypeKey, DWORD fo THROWS; if (format & (FormatAssembly|FormatFullInst)) GC_TRIGGERS; else GC_NOTRIGGER; PRECONDITION(CheckPointer(pTypeKey)); - SO_INTOLERANT; } CONTRACT_END @@ -1368,13 +1344,11 @@ void TypeString::AppendTypeKey(SString& ss, TypeKey *pTypeKey, DWORD format) PRECONDITION(CheckPointer(pTypeKey)); } CONTRACT_END - - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(COMPlusThrowSO()); + { TypeNameBuilder tnb(&ss); AppendTypeKey(tnb, pTypeKey, format); } - END_SO_INTOLERANT_CODE; RETURN; } @@ -1422,7 +1396,6 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::QueryInterface(REFIID riid, vo NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -1446,7 +1419,6 @@ ULONG STDMETHODCALLTYPE TypeNameBuilderWrapper::AddRef() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -1460,21 +1432,16 @@ ULONG STDMETHODCALLTYPE TypeNameBuilderWrapper::Release() NOTHROW; GC_NOTRIGGER; MODE_ANY; - SO_TOLERANT; SUPPORTS_DAC_HOST_ONLY; } CONTRACTL_END; LONG ref = 0; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - ref = InterlockedDecrement(&m_ref); if (ref == 0) delete this; - END_SO_INTOLERANT_CODE; - return ref; } @@ -1490,9 +1457,7 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::OpenGenericArguments() CONTRACTL_END; HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); hr = m_tnb.OpenGenericArguments(); - END_SO_INTOLERANT_CODE; return hr; } @@ -1507,9 +1472,7 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::CloseGenericArguments() CONTRACTL_END; HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); hr = m_tnb.CloseGenericArguments(); - END_SO_INTOLERANT_CODE; return hr; } @@ -1524,9 +1487,7 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::OpenGenericArgument() CONTRACTL_END; HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); hr = m_tnb.OpenGenericArgument(); - END_SO_INTOLERANT_CODE; return hr; } @@ -1541,9 +1502,7 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::CloseGenericArgument() CONTRACTL_END; HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); hr = m_tnb.CloseGenericArgument(); - END_SO_INTOLERANT_CODE; return hr; } @@ -1557,11 +1516,7 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddName(LPCWSTR szName) } CONTRACTL_END; - HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - hr = m_tnb.AddName(szName); - END_SO_INTOLERANT_CODE; - return hr; + return m_tnb.AddName(szName); } HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddPointer() @@ -1574,11 +1529,7 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddPointer() } CONTRACTL_END; - HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - hr = m_tnb.AddPointer(); - END_SO_INTOLERANT_CODE; - return hr; + return m_tnb.AddPointer(); } HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddByRef() @@ -1591,11 +1542,7 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddByRef() } CONTRACTL_END; - HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - hr = m_tnb.AddByRef(); - END_SO_INTOLERANT_CODE; - return hr; + return m_tnb.AddByRef(); } HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddSzArray() @@ -1608,11 +1555,7 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddSzArray() } CONTRACTL_END; - HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - hr = m_tnb.AddSzArray(); - END_SO_INTOLERANT_CODE; - return hr; + return m_tnb.AddSzArray(); } HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddArray(DWORD rank) @@ -1625,11 +1568,7 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddArray(DWORD rank) } CONTRACTL_END; - HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - hr = m_tnb.AddArray(rank); - END_SO_INTOLERANT_CODE; - return hr; + return m_tnb.AddArray(rank); } HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddAssemblySpec(LPCWSTR szAssemblySpec) @@ -1642,22 +1581,14 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::AddAssemblySpec(LPCWSTR szAsse } CONTRACTL_END; - HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - hr = m_tnb.AddAssemblySpec(szAssemblySpec); - END_SO_INTOLERANT_CODE; - return hr; + return m_tnb.AddAssemblySpec(szAssemblySpec); } HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::ToString(BSTR* pszStringRepresentation) { WRAPPER_NO_CONTRACT; - HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - hr = m_tnb.ToString(pszStringRepresentation); - END_SO_INTOLERANT_CODE; - return hr; + return m_tnb.ToString(pszStringRepresentation); } HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::Clear() @@ -1670,9 +1601,5 @@ HRESULT STDMETHODCALLTYPE TypeNameBuilderWrapper::Clear() } CONTRACTL_END; - HRESULT hr; - BEGIN_SO_INTOLERANT_CODE_NO_THROW_CHECK_THREAD(return COR_E_STACKOVERFLOW); - hr = m_tnb.Clear(); - END_SO_INTOLERANT_CODE; - return hr; + return m_tnb.Clear(); } diff --git a/src/vm/util.cpp b/src/vm/util.cpp index 9b18764ecc..5565a011cd 100644 --- a/src/vm/util.cpp +++ b/src/vm/util.cpp @@ -314,7 +314,6 @@ LPVOID CQuickHeap::Alloc(UINT sz) { THROWS; GC_NOTRIGGER; - SO_TOLERANT; // So long as we cleanup the heap when we're done, all the memory goes with it INJECT_FAULT(COMPlusThrowOM();); } CONTRACTL_END; @@ -2055,7 +2054,6 @@ HMODULE CLRGetModuleHandle(LPCWSTR lpModuleFileName) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; HMODULE hMod = WszGetModuleHandle(lpModuleFileName); return hMod; @@ -2068,7 +2066,6 @@ HMODULE CLRGetCurrentModuleHandle() STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; HMODULE hMod = WszGetModuleHandle(NULL); return hMod; @@ -2226,7 +2223,6 @@ static HMODULE CLRLoadLibraryWorker(LPCWSTR lpLibFileName, DWORD *pLastError) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_FAULT; - STATIC_CONTRACT_SO_TOLERANT; HMODULE hMod; UINT last = SetErrorMode(SEM_NOOPENFILEERRORBOX|SEM_FAILCRITICALERRORS); @@ -2249,12 +2245,7 @@ HMODULE CLRLoadLibrary(LPCWSTR lpLibFileName) DWORD dwLastError = 0; HMODULE hmod = 0; - // This method should be marked "throws" due to the probe here. - STATIC_CONTRACT_VIOLATION(ThrowsViolation); - - BEGIN_SO_TOLERANT_CODE(GetThread()); hmod = CLRLoadLibraryWorker(lpLibFileName, &dwLastError); - END_SO_TOLERANT_CODE; SetLastError(dwLastError); return hmod; @@ -2269,7 +2260,6 @@ static HMODULE CLRLoadLibraryExWorker(LPCWSTR lpLibFileName, HANDLE hFile, DWORD STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_FAULT; - STATIC_CONTRACT_SO_TOLERANT; HMODULE hMod; UINT last = SetErrorMode(SEM_NOOPENFILEERRORBOX|SEM_FAILCRITICALERRORS); @@ -2294,10 +2284,8 @@ HMODULE CLRLoadLibraryEx(LPCWSTR lpLibFileName, HANDLE hFile, DWORD dwFlags) DWORD lastError = ERROR_SUCCESS; HMODULE hmod = NULL; - BEGIN_SO_TOLERANT_CODE(GetThread()); hmod = CLRLoadLibraryExWorker(lpLibFileName, hFile, dwFlags, &lastError); - END_SO_TOLERANT_CODE; - + SetLastError(lastError); return hmod; } @@ -2310,7 +2298,6 @@ BOOL CLRFreeLibrary(HMODULE hModule) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; return FreeLibrary(hModule); } @@ -2321,7 +2308,6 @@ VOID CLRFreeLibraryAndExitThread(HMODULE hModule,DWORD dwExitCode) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_TRIGGERS; STATIC_CONTRACT_FORBID_FAULT; - STATIC_CONTRACT_SO_TOLERANT; // This is no-return FreeLibraryAndExitThread(hModule,dwExitCode); @@ -2791,7 +2777,6 @@ void DACRaiseException(TADDR *args, UINT argCount) STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; struct Param { @@ -2817,7 +2802,6 @@ void DACNotifyExceptionHelper(TADDR *args, UINT argCount) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_ANY; } CONTRACTL_END; @@ -2876,7 +2860,6 @@ void DACNotify::DoJITNotification(MethodDesc *MethodDescPtr, TADDR NativeCodeLoc { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_PREEMPTIVE; } CONTRACTL_END; @@ -2891,7 +2874,6 @@ void DACNotify::DoJITPitchingNotification(MethodDesc *MethodDescPtr) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_PREEMPTIVE; } CONTRACTL_END; @@ -2909,7 +2891,6 @@ void DACNotify::DoModuleLoadNotification(Module *ModulePtr) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_PREEMPTIVE; } CONTRACTL_END; @@ -2927,7 +2908,6 @@ void DACNotify::DoModuleUnloadNotification(Module *ModulePtr) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_PREEMPTIVE; } CONTRACTL_END; @@ -2945,7 +2925,6 @@ void DACNotify::DoExceptionNotification(Thread* ThreadPtr) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_PREEMPTIVE; } CONTRACTL_END; @@ -2963,7 +2942,6 @@ void DACNotify::DoGCNotification(const GcEvtArgs& args) { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -2981,7 +2959,6 @@ void DACNotify::DoExceptionCatcherEnterNotification(MethodDesc *MethodDescPtr, D { NOTHROW; GC_NOTRIGGER; - SO_INTOLERANT; MODE_COOPERATIVE; } CONTRACTL_END; @@ -3201,7 +3178,6 @@ BOOL EnableARM() // can be called on a COOP thread and it has a GC_NOTRIGGER contract. // We should use the AD unload thread to call this function on. GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -3215,11 +3191,6 @@ BOOL EnableARM() Thread *pThread = NULL; CONTRACT_VIOLATION(GCViolation); - // I am returning TRUE here so the caller will NOT enable - // ARM - if we can't take the thread store lock, something - // is already kind of messed up so no need to proceed with - // enabling ARM. - BEGIN_SO_INTOLERANT_CODE_NOTHROW(GetThread(), return TRUE); // Take the thread store lock while we enumerate threads. ThreadStoreLockHolder tsl ; @@ -3229,8 +3200,6 @@ BOOL EnableARM() continue; pThread->QueryThreadProcessorUsage(); } - - END_SO_INTOLERANT_CODE; } g_fEnableARM = TRUE; } diff --git a/src/vm/util.hpp b/src/vm/util.hpp index 82e87e4a11..7f88f31761 100644 --- a/src/vm/util.hpp +++ b/src/vm/util.hpp @@ -756,8 +756,7 @@ BOOL IsHostRegisteredForEvent(EClrEvent event); #define InternalSetupForComCall(CannotEnterRetVal, OOMRetVal, SORetVal, CheckCanRunManagedCode) \ SetupThreadForComCall(OOMRetVal); \ if (CheckCanRunManagedCode && !CanRunManagedCode()) \ - return CannotEnterRetVal; \ -SO_INTOLERANT_CODE_NOTHROW(CURRENT_THREAD, return SORetVal) + return CannotEnterRetVal; #define SetupForComCallHRNoHostNotif() InternalSetupForComCall(HOST_E_CLRNOTAVAILABLE, E_OUTOFMEMORY, COR_E_STACKOVERFLOW, true) #define SetupForComCallHRNoHostNotifNoCheckCanRunManagedCode() InternalSetupForComCall(HOST_E_CLRNOTAVAILABLE, E_OUTOFMEMORY, COR_E_STACKOVERFLOW, false) @@ -777,7 +776,6 @@ InternalSetupForComCall(HOST_E_CLRNOTAVAILABLE, E_OUTOFMEMORY, COR_E_STACKOVERFL if (CheckCanRunManagedCode && !CanRunManagedCode()) \ return CannotEnterRetVal; \ SetupThreadForComCall(OOMRetVal); \ -BEGIN_SO_INTOLERANT_CODE_NOTHROW(CURRENT_THREAD, SORetVal) \ #define BeginSetupForComCallHRWithEscapingCorruptingExceptions() \ HRESULT __hr = S_OK; \ @@ -788,7 +786,6 @@ if (SUCCEEDED(__hr)) \ #define EndSetupForComCallHRWithEscapingCorruptingExceptions() \ } \ -END_SO_INTOLERANT_CODE; \ \ if (FAILED(__hr)) \ { \ diff --git a/src/vm/versionresilienthashcode.cpp b/src/vm/versionresilienthashcode.cpp index 4271c757f2..70ca3d8e59 100644 --- a/src/vm/versionresilienthashcode.cpp +++ b/src/vm/versionresilienthashcode.cpp @@ -12,7 +12,6 @@ bool GetVersionResilientTypeHashCode(IMDInternalImport *pMDImport, mdExportedTyp { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; PRECONDITION(CheckPointer(pdwHashCode)); } diff --git a/src/vm/virtualcallstub.cpp b/src/vm/virtualcallstub.cpp index 31cfdd9a6d..08ad121bb6 100644 --- a/src/vm/virtualcallstub.cpp +++ b/src/vm/virtualcallstub.cpp @@ -1022,7 +1022,6 @@ VirtualCallStubManager *VirtualCallStubManager::FindStubManager(PCODE stubAddres NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; } CONTRACTL_END #ifndef DACCESS_COMPILE @@ -1040,7 +1039,6 @@ VirtualCallStubManager *VirtualCallStubManager::FindStubManager(PCODE stubAddres // LockedRangeList::IsInRangeWorker // VirtualCallStubManager::isDispatchingStub // - CONTRACT_VIOLATION(SOToleranceViolation); kind = pCur->getStubKind(stubAddress, usePredictStubKind); if (kind != SK_UNKNOWN) { @@ -1578,12 +1576,9 @@ ResolveCacheElem* __fastcall VirtualCallStubManager::PromoteChainEntry(ResolveCa NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_TOLERANT; PRECONDITION(CheckPointer(pElem)); } CONTRACTL_END; - // @todo - Remove this when have a probe that generates a hard SO. - CONTRACT_VIOLATION(SOToleranceViolation); g_resolveCache->PromoteChainEntry(pElem); return pElem; } @@ -1615,7 +1610,6 @@ PCODE VSD_ResolveWorker(TransitionBlock * pTransitionBlock, INJECT_FAULT(COMPlusThrowOM();); PRECONDITION(CheckPointer(pTransitionBlock)); MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; MAKE_CURRENT_THREAD_AVAILABLE(); @@ -1651,8 +1645,6 @@ PCODE VSD_ResolveWorker(TransitionBlock * pTransitionBlock, #ifndef _TARGET_X86_ if (flags & SDF_ResolvePromoteChain) { - BEGIN_SO_INTOLERANT_CODE(CURRENT_THREAD); - ResolveCacheElem * pElem = (ResolveCacheElem *)token; g_resolveCache->PromoteChainEntry(pElem); target = (PCODE) pElem->target; @@ -1665,8 +1657,6 @@ PCODE VSD_ResolveWorker(TransitionBlock * pTransitionBlock, pMgr->BackPatchWorker(&callSite); } - END_SO_INTOLERANT_CODE; - return target; } #endif @@ -2445,7 +2435,6 @@ VirtualCallStubManager::GetRepresentativeMethodDescFromToken( MODE_COOPERATIVE; PRECONDITION(CheckPointer(pMT)); POSTCONDITION(CheckPointer(RETVAL)); - SO_TOLERANT; } CONTRACT_END; // This is called when trying to create a HelperMethodFrame, which means there are @@ -2511,7 +2500,6 @@ PCODE VirtualCallStubManager::CacheLookup(size_t token, UINT16 tokenHash, Method CONTRACTL { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; PRECONDITION(CheckPointer(pMT)); } CONTRACTL_END diff --git a/src/vm/vmholder.h b/src/vm/vmholder.h index a9869fc801..3c5b1e71da 100644 --- a/src/vm/vmholder.h +++ b/src/vm/vmholder.h @@ -14,10 +14,7 @@ inline void DoTheReleaseHost(TYPE *value) { if (value) { - BEGIN_SO_TOLERANT_CODE_CALLING_HOST(GetThread()); value->Release(); - END_SO_TOLERANT_CODE_CALLING_HOST; - } } diff --git a/src/vm/weakreferencenative.cpp b/src/vm/weakreferencenative.cpp index 236052ed54..5c7a4da47b 100644 --- a/src/vm/weakreferencenative.cpp +++ b/src/vm/weakreferencenative.cpp @@ -325,7 +325,6 @@ NOINLINE OBJECTHANDLE AcquireWeakHandleSpinLockSpin(WEAKREFERENCEREF pThis) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -371,7 +370,6 @@ FORCEINLINE OBJECTHANDLE AcquireWeakHandleSpinLock(WEAKREFERENCEREF pThis) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; } CONTRACTL_END; @@ -581,7 +579,6 @@ static FORCEINLINE OBJECTREF GetWeakReferenceTarget(WEAKREFERENCEREF pThis) NOTHROW; GC_NOTRIGGER; MODE_COOPERATIVE; - SO_TOLERANT; } CONTRACTL_END; diff --git a/src/vm/win32threadpool.cpp b/src/vm/win32threadpool.cpp index 330dcffe8d..908fedf51c 100644 --- a/src/vm/win32threadpool.cpp +++ b/src/vm/win32threadpool.cpp @@ -525,8 +525,6 @@ BOOL ThreadpoolMgr::SetMaxThreadsHelper(DWORD MaxWorkerThreads, MaxWorkerThreads != 0 && MaxIOCompletionThreads != 0) { - BEGIN_SO_INTOLERANT_CODE(GetThread()); - if (GetForceMaxWorkerThreadsValue() == 0) { MaxLimitTotalWorkerThreads = min(MaxWorkerThreads, (DWORD)ThreadCounter::MaxPossibleCount); @@ -545,8 +543,6 @@ BOOL ThreadpoolMgr::SetMaxThreadsHelper(DWORD MaxWorkerThreads, } } - END_SO_INTOLERANT_CODE; - MaxLimitTotalCPThreads = min(MaxIOCompletionThreads, (DWORD)ThreadCounter::MaxPossibleCount); result = TRUE; @@ -613,8 +609,6 @@ BOOL ThreadpoolMgr::SetMinThreads(DWORD MinWorkerThreads, MinWorkerThreads <= (DWORD) MaxLimitTotalWorkerThreads && MinIOCompletionThreads <= (DWORD) MaxLimitTotalCPThreads) { - BEGIN_SO_INTOLERANT_CODE(GetThread()); - if (GetForceMinWorkerThreadsValue() == 0) { MinLimitTotalWorkerThreads = max(1, min(MinWorkerThreads, (DWORD)ThreadCounter::MaxPossibleCount)); @@ -645,8 +639,6 @@ BOOL ThreadpoolMgr::SetMinThreads(DWORD MinWorkerThreads, } } - END_SO_INTOLERANT_CODE; - MinLimitTotalCPThreads = max(1, min(MinIOCompletionThreads, (DWORD)ThreadCounter::MaxPossibleCount)); init_result = TRUE; @@ -755,7 +747,6 @@ void ThreadpoolMgr::ReportThreadStatus(bool isWorking) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -790,7 +781,6 @@ int TakeMaxWorkingThreadCount() { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1576,7 +1566,6 @@ BOOL ThreadpoolMgr::SetAppDomainRequestsActive(BOOL UnmanagedTP) NOTHROW; MODE_ANY; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; @@ -1628,7 +1617,6 @@ void ThreadpoolMgr::ClearAppDomainRequestsActive(BOOL UnmanagedTP, BOOL AdUnload NOTHROW; MODE_ANY; GC_TRIGGERS; - SO_INTOLERANT; } CONTRACTL_END; @@ -1716,7 +1704,6 @@ void ThreadpoolMgr::RecycleMemory(LPVOID mem, enum MemType memType) { NOTHROW; GC_NOTRIGGER; - SO_TOLERANT; MODE_ANY; } CONTRACTL_END; @@ -1756,7 +1743,6 @@ void ThreadpoolMgr::RecycleMemory(LPVOID mem, enum MemType memType) DWORD WINAPI ThreadpoolMgr::intermediateThreadProc(PVOID arg) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_INTOLERANT; offset_counter++; if (offset_counter * offset_multiplier > (int)GetOsPageSize()) @@ -1904,7 +1890,6 @@ DWORD WINAPI ThreadpoolMgr::WorkerThreadStart(LPVOID lpArgs) THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_INTOLERANT; } CONTRACTL_END; @@ -2474,7 +2459,6 @@ BOOL ThreadpoolMgr::CreateWaitThread() void ThreadpoolMgr::InsertNewWaitForSelf(WaitInfo* pArgs) { WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_INTOLERANT; WaitInfo* waitInfo = pArgs; @@ -2594,7 +2578,6 @@ DWORD WINAPI ThreadpoolMgr::WaitThreadStart(LPVOID lpArgs) THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -2616,7 +2599,6 @@ DWORD WINAPI ThreadpoolMgr::WaitThreadStart(LPVOID lpArgs) return 0; } - BEGIN_SO_INTOLERANT_CODE(pThread); // we probe at the top of the thread so we can safely call anything below here. { // wait threads never die. (Why?) for (;;) @@ -2777,7 +2759,6 @@ DWORD WINAPI ThreadpoolMgr::WaitThreadStart(LPVOID lpArgs) } } } - END_SO_INTOLERANT_CODE; //This is unreachable...so no return required. } @@ -2861,7 +2842,6 @@ DWORD WINAPI ThreadpoolMgr::AsyncCallbackCompletion(PVOID pArgs) THROWS; MODE_PREEMPTIVE; GC_TRIGGERS; - SO_TOLERANT; } CONTRACTL_END; @@ -2880,7 +2860,6 @@ DWORD WINAPI ThreadpoolMgr::AsyncCallbackCompletion(PVOID pArgs) } } - BEGIN_SO_INTOLERANT_CODE_NOTHROW(pThread, return ERROR_STACK_OVERFLOW); { AsyncCallback * asyncCallback = (AsyncCallback*) pArgs; @@ -2901,7 +2880,6 @@ DWORD WINAPI ThreadpoolMgr::AsyncCallbackCompletion(PVOID pArgs) ((WAITORTIMERCALLBACKFUNC) waitInfo->Callback) ( waitInfo->Context, asyncCallback->waitTimedOut != FALSE); } - END_SO_INTOLERANT_CODE; return ERROR_SUCCESS; } @@ -3097,9 +3075,7 @@ BOOL ThreadpoolMgr::UnregisterWaitEx(HANDLE hWaitObject,HANDLE Event) void ThreadpoolMgr::DeregisterWait(WaitInfo* pArgs) { - WRAPPER_NO_CONTRACT; - STATIC_CONTRACT_SO_INTOLERANT; WaitInfo* waitInfo = pArgs; @@ -3276,7 +3252,6 @@ DWORD WINAPI ThreadpoolMgr::CompletionPortThreadStart(LPVOID lpArgs) THROWS; if (GetThread()) { MODE_PREEMPTIVE;} else { DISABLED(MODE_ANY);} if (GetThread()) { GC_TRIGGERS;} else {DISABLED(GC_NOTRIGGER);} - SO_INTOLERANT; } CONTRACTL_END; @@ -3717,7 +3692,6 @@ LPOVERLAPPED ThreadpoolMgr::CompletionPortDispatchWorkWithinAppDomain( STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; LPOVERLAPPED lpOverlapped=NULL; @@ -3800,7 +3774,6 @@ void ThreadpoolMgr::StoreOverlappedInfoInThread(Thread* pThread, DWORD dwErrorCo STATIC_CONTRACT_NOTHROW; STATIC_CONTRACT_GC_NOTRIGGER; STATIC_CONTRACT_MODE_ANY; - STATIC_CONTRACT_SO_TOLERANT; _ASSERTE(pThread); @@ -3823,7 +3796,6 @@ BOOL ThreadpoolMgr::ShouldGrowCompletionPortThreadpool(ThreadCounter::Counts cou GC_NOTRIGGER; NOTHROW; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; @@ -4121,7 +4093,6 @@ DWORD WINAPI ThreadpoolMgr::GateThreadStart(LPVOID lpArgs) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_INTOLERANT; } CONTRACTL_END; @@ -4571,7 +4542,6 @@ DWORD WINAPI ThreadpoolMgr::TimerThreadStart(LPVOID p) STATIC_CONTRACT_THROWS; STATIC_CONTRACT_GC_TRIGGERS; // due to SetApartment STATIC_CONTRACT_MODE_PREEMPTIVE; - STATIC_CONTRACT_SO_INTOLERANT; /* cannot use contract because of SEH CONTRACTL { @@ -4683,7 +4653,6 @@ void ThreadpoolMgr::InsertNewTimer(TimerInfo* pArg) MODE_ANY; } CONTRACTL_END; - STATIC_CONTRACT_SO_INTOLERANT; _ASSERTE(pArg); TimerInfo * timerInfo = pArg; @@ -4813,7 +4782,6 @@ DWORD WINAPI ThreadpoolMgr::AsyncTimerCallbackCompletion(PVOID pArgs) THROWS; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; @@ -4832,7 +4800,6 @@ DWORD WINAPI ThreadpoolMgr::AsyncTimerCallbackCompletion(PVOID pArgs) } } - BEGIN_SO_INTOLERANT_CODE(pThread); { TimerInfo* timerInfo = (TimerInfo*) pArgs; ((WAITORTIMERCALLBACKFUNC) timerInfo->Function) (timerInfo->Context, TRUE) ; @@ -4842,7 +4809,6 @@ DWORD WINAPI ThreadpoolMgr::AsyncTimerCallbackCompletion(PVOID pArgs) DeleteTimer(timerInfo); } } - END_SO_INTOLERANT_CODE; return ERROR_SUCCESS; } @@ -5222,7 +5188,6 @@ void ThreadpoolMgr::DeregisterTimer(TimerInfo* pArgs) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_INTOLERANT; } CONTRACTL_END; diff --git a/src/vm/wrappers.h b/src/vm/wrappers.h index 5d51252e49..505430c311 100644 --- a/src/vm/wrappers.h +++ b/src/vm/wrappers.h @@ -93,7 +93,6 @@ inline void SafeComRelease(TYPE *value) NOTHROW; GC_TRIGGERS; MODE_ANY; - SO_TOLERANT; } CONTRACTL_END; SafeRelease((IUnknown*)value); @@ -105,7 +104,6 @@ inline void SafeComReleasePreemp(TYPE *value) NOTHROW; GC_TRIGGERS; MODE_PREEMPTIVE; - SO_TOLERANT; } CONTRACTL_END; SafeReleasePreemp((IUnknown*)value); diff --git a/src/vm/zapsig.cpp b/src/vm/zapsig.cpp index 734491ed66..dbb318d948 100644 --- a/src/vm/zapsig.cpp +++ b/src/vm/zapsig.cpp @@ -682,7 +682,6 @@ Module *ZapSig::DecodeModuleFromIndexIfLoaded(Module *fromModule, NOTHROW; GC_NOTRIGGER; FORBID_FAULT; - SO_INTOLERANT; } CONTRACTL_END; |