From 60f43b9c0be683b3a2f2b05c1ac2b331e83fd9b9 Mon Sep 17 00:00:00 2001 From: David Mason Date: Fri, 26 Apr 2024 16:31:09 -0700 Subject: [PATCH 1/4] WIP --- src/coreclr/debug/ee/debugger.cpp | 67 ++++++++++++- src/coreclr/debug/ee/debugger.h | 96 ++++++++++++++++++- src/coreclr/debug/inc/dbgipcevents.h | 7 ++ src/coreclr/debug/inc/dbgipceventtypes.h | 6 +- .../debug/shared/dbgtransportsession.cpp | 5 + 5 files changed, 175 insertions(+), 6 deletions(-) diff --git a/src/coreclr/debug/ee/debugger.cpp b/src/coreclr/debug/ee/debugger.cpp index 3723ab2c90354..87018177e6999 100644 --- a/src/coreclr/debug/ee/debugger.cpp +++ b/src/coreclr/debug/ee/debugger.cpp @@ -916,6 +916,7 @@ Debugger::Debugger() m_ignoreThreadDetach(FALSE), m_pMethodInfos(NULL), m_pForceCatchHandlerFoundEventsTable(NULL), + m_pCustomNotificationTable(NULL), m_mutex(CrstDebuggerMutex, (CrstFlags)(CRST_UNSAFE_ANYMODE | CRST_REENTRANCY | CRST_DEBUGGER_THREAD)), #ifdef _DEBUG m_mutexOwner(0), @@ -958,8 +959,7 @@ Debugger::Debugger() m_processId = GetCurrentProcessId(); m_pForceCatchHandlerFoundEventsTable = new ForceCatchHandlerFoundTable(); - - + m_pCustomNotificationTable = new CustomNotificationTable(); //------------------------------------------------------------------------------ // Metadata data structure version numbers @@ -8045,6 +8045,20 @@ BOOL Debugger::ShouldSendCatchHandlerFound(Thread* pThread) } } +BOOL Debugger::ShouldSendCustomNotification(DomainAssembly *pAssembly, mdTypeDef typeDef) +{ + CONTRACTL + { + THROWS; + GC_NOTRIGGER; + MODE_COOPERATIVE; + } + CONTRACTL_END; + + Module *pModule = pAssembly->GetModule(); + TypeInModule tim(pModule, typeDef); + return m_pCustomNotificationTable->Lookup(tim) != NULL; +} // Actually send the catch handler found event. // This can be used to send CHF for both regular managed catchers as well @@ -10485,6 +10499,26 @@ bool Debugger::HandleIPCEvent(DebuggerIPCEvent * pEvent) } break; + case DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION: + { + Module * pModule = pEvent->CustomNotificationData.vmModule.GetRawPtr(); + mdTypeDef classToken = pEvent->CustomNotificationData.classMetadataToken; + BOOL enabled = pEvent->CustomNotificationData.Enabled; + + HRESULT hr = UpdateCustomNotificationTable(pModule, classToken, enabled); + + DebuggerIPCEvent * pIPCResult = m_pRCThread->GetIPCEventReceiveBuffer(); + InitIPCEvent(pIPCResult, + DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION_RESULT, + g_pEEInterface->GetThread(), + pEvent->vmAppDomain); + + pIPCResult->hr = hr; + + m_pRCThread->SendIPCReply(); + } + break; + case DB_IPCE_BREAKPOINT_ADD: { @@ -12408,6 +12442,33 @@ HRESULT Debugger::IsMethodDeoptimized(Module *pModule, mdMethodDef methodDef, BO return S_OK; } +HRESULT Debugger::UpdateCustomNotificationTable(Module *pModule, mdTypeDef classToken, BOOL enabled) +{ + CONTRACTL + { + THROWS; + CAN_TAKE_LOCK; + GC_NOTRIGGER; + } + CONTRACTL_END; + + TypeInModule tim(pModule, classToken); + if (enabled) + { + if (m_pCustomNotificationTable->Lookup(tim) == NULL) + { + m_pCustomNotificationTable->Add(tim); + } + } + else + { + if (m_pCustomNotificationTable->Lookup(tim) != NULL) + { + m_pCustomNotificationTable->Remove(tim); + } + } +} + HRESULT Debugger::UpdateForceCatchHandlerFoundTable(BOOL enableEvents, OBJECTREF exObj, AppDomain *pAppDomain) { CONTRACTL @@ -14583,7 +14644,7 @@ void Debugger::SendCustomDebuggerNotification(Thread * pThread, Thread *curThread = g_pEEInterface->GetThread(); SENDIPCEVENT_BEGIN(this, curThread); - if (CORDebuggerAttached()) + if (CORDebuggerAttached() && ShouldSendCustomNotification(pDomain, classToken)) { DebuggerIPCEvent* ipce = m_pRCThread->GetIPCEventSendBuffer(); InitIPCEvent(ipce, diff --git a/src/coreclr/debug/ee/debugger.h b/src/coreclr/debug/ee/debugger.h index 43f56c00dc793..5a33e62c8dce7 100644 --- a/src/coreclr/debug/ee/debugger.h +++ b/src/coreclr/debug/ee/debugger.h @@ -588,6 +588,95 @@ class EMPTY_BASES_DECL ForceCatchHandlerFoundSHashTraits : public DefaultSHashTr } }; typedef SHash ForceCatchHandlerFoundTable; + +class TypeInModule +{ +private: + Module *m_module; + mdTypeDef m_typeDef; + +public: + + bool operator ==(const MethodInModule& other) const + { + return m_module == other.m_module && m_typeDef == other.m_typeDef; + } + + bool operator !=(const MethodInModule& other) const + { + return !(*this == other); + } + + bool IsNull() + { + return m_module == NULL && m_typeDef == 0; + } + + INT32 Hash() + { + return m_module ^ m_typeDef; + } + + TypeInModule(Module * module, mdTypeDef typeDef) + :m_module(module), m_typeDef(typeDef) + { + LIMITED_METHOD_DAC_CONTRACT; + } + + TypeInModule() + :m_module(NULL), m_typeDef(0) + { + LIMITED_METHOD_DAC_CONTRACT; + } +}; + +} +class EMPTY_BASES_DECL CustomNotificationSHashTraits : public DefaultSHashTraits +{ + public: + typedef TypeInModule element_t; + typedef TypeInModule key_t; + static const bool s_supports_autoremove = true; + static const bool s_NoThrow = false; + static const bool s_RemovePerEntryCleanupAction = true; + + static BOOL Equals(const TypeInModule &e, const TypeInModule &f) + { + return e == f; + } + static OBJECTHANDLE GetKey(constTypeInModule &e) + { + return e; + } + static INT32 Hash(const TypeInModule &e) + { + return e.Hash(); + } + static bool ShouldDelete(const TypeInModule &e) + { + return e.IsNull(); + } + static TypeInModule Null() + { + TypeInModule tim; + return tim; + } + static bool IsNull(const TypeInModule &e) + { + return e.IsNull(); + } + static TypeInModule Deleted() + { + TypeInModule tim((Module *)-1, -1) + return tim; + } + static bool IsDeleted(const TypeInModule &e) + { + TypeInModule tim((Module *)-1, -1); + return e == tim; + } +}; +typedef SHash CustomNotificationTable; #endif /* ------------------------------------------------------------------------ * @@ -1974,6 +2063,8 @@ class Debugger : public DebugInterface BOOL ShouldSendCatchHandlerFound(Thread* pThread); + BOOL ShouldSendCustomNotification(DomainAssembly *pAssembly, mdTypeDef typeDef); + void SendCatchHandlerFound(Thread *pThread, FramePointer fp, SIZE_T nOffset, @@ -2276,6 +2367,7 @@ class Debugger : public DebugInterface #endif //DACCESS_COMPILE HRESULT IsMethodDeoptimized(Module *pModule, mdMethodDef methodDef, BOOL *pResult); HRESULT UpdateForceCatchHandlerFoundTable(BOOL enableEvents, OBJECTREF exObj, AppDomain *pAppDomain); + HRESULT UpdateCustomNotificationTable(Module *pModule, mdTypeDef classToken, BOOL enabled); // // The debugger mutex is used to protect any "global" Left Side @@ -2865,9 +2957,11 @@ class Debugger : public DebugInterface BOOL m_ignoreThreadDetach; PTR_DebuggerMethodInfoTable m_pMethodInfos; #ifdef DACCESS_COMPILE - VOID * m_pForceCatchHandlerFoundEventsTable; + VOID *m_pForceCatchHandlerFoundEventsTable; + VOID *m_pCustomNotificationTable; #else ForceCatchHandlerFoundTable *m_pForceCatchHandlerFoundEventsTable; + CustomNotificationTable *m_pCustomNotificationTable; #endif diff --git a/src/coreclr/debug/inc/dbgipcevents.h b/src/coreclr/debug/inc/dbgipcevents.h index 661fcfdd33478..23e67bd5673f8 100644 --- a/src/coreclr/debug/inc/dbgipcevents.h +++ b/src/coreclr/debug/inc/dbgipcevents.h @@ -2060,6 +2060,13 @@ struct MSLAYOUT DebuggerIPCEvent VMPTR_Object vmObj; } ForceCatchHandlerFoundData; + struct MSLAYOUT + { + VMPTR_Module vmModule; + mdTypeDef classMetadataToken; + BOOL Enabled; + } CustomNotificationData; + struct MSLAYOUT { LSPTR_BREAKPOINT breakpointToken; diff --git a/src/coreclr/debug/inc/dbgipceventtypes.h b/src/coreclr/debug/inc/dbgipceventtypes.h index 650156fdda061..0c028619b69e5 100644 --- a/src/coreclr/debug/inc/dbgipceventtypes.h +++ b/src/coreclr/debug/inc/dbgipceventtypes.h @@ -94,7 +94,8 @@ IPC_EVENT_TYPE1(DB_IPCE_BEFORE_GARBAGE_COLLECTION ,0x0161) IPC_EVENT_TYPE1(DB_IPCE_AFTER_GARBAGE_COLLECTION ,0x0162) IPC_EVENT_TYPE1(DB_IPCE_DISABLE_OPTS_RESULT ,0x0163) IPC_EVENT_TYPE1(DB_IPCE_CATCH_HANDLER_FOUND_RESULT ,0x0165) -IPC_EVENT_TYPE0(DB_IPCE_RUNTIME_LAST ,0x0166) // The last event from runtime +IPC_EVENT_TYPE1(DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION_RESULT, 0x0166) +IPC_EVENT_TYPE0(DB_IPCE_RUNTIME_LAST ,0x0167) // The last event from runtime @@ -145,5 +146,6 @@ IPC_EVENT_TYPE2(DB_IPCE_RESOLVE_UPDATE_METADATA_1 ,0x0256) IPC_EVENT_TYPE2(DB_IPCE_RESOLVE_UPDATE_METADATA_2 ,0x0257) IPC_EVENT_TYPE2(DB_IPCE_DISABLE_OPTS ,0x0258) IPC_EVENT_TYPE2(DB_IPCE_FORCE_CATCH_HANDLER_FOUND ,0x025A) -IPC_EVENT_TYPE0(DB_IPCE_DEBUGGER_LAST ,0x025B) // The last event from the debugger +IPC_EVENT_TYPE2(DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION, 0x025B) +IPC_EVENT_TYPE0(DB_IPCE_DEBUGGER_LAST ,0x025C) // The last event from the debugger diff --git a/src/coreclr/debug/shared/dbgtransportsession.cpp b/src/coreclr/debug/shared/dbgtransportsession.cpp index f03a62c62ea99..ada87bc3c8f65 100644 --- a/src/coreclr/debug/shared/dbgtransportsession.cpp +++ b/src/coreclr/debug/shared/dbgtransportsession.cpp @@ -2502,10 +2502,15 @@ DWORD DbgTransportSession::GetEventSize(DebuggerIPCEvent *pEvent) case DB_IPCE_DISABLE_OPTS: cbAdditionalSize = sizeof(pEvent->DisableOptData); break; + case DB_IPCE_FORCE_CATCH_HANDLER_FOUND: cbAdditionalSize = sizeof(pEvent->ForceCatchHandlerFoundData); break; + case DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION: + cbAdditionalSize = sizeof(pEvent->ForceCatchHandlerFoundData); + break; + default: STRESS_LOG1(LF_CORDB, LL_INFO1000, "Unknown debugger event type: 0x%x\n", (pEvent->type & DB_IPCE_TYPE_MASK)); _ASSERTE(!"Unknown debugger event type"); From 38960bf692cc637d9dfa3984b047521ac9494424 Mon Sep 17 00:00:00 2001 From: David Mason Date: Fri, 26 Apr 2024 17:13:57 -0700 Subject: [PATCH 2/4] Fixes --- src/coreclr/debug/di/process.cpp | 30 +++++++++++++++---- src/coreclr/debug/di/rsclass.cpp | 3 +- src/coreclr/debug/di/rspriv.h | 7 ----- src/coreclr/debug/ee/debugger.cpp | 8 +++-- src/coreclr/debug/ee/debugger.h | 15 +++++----- .../debug/shared/dbgtransportsession.cpp | 2 +- 6 files changed, 39 insertions(+), 26 deletions(-) diff --git a/src/coreclr/debug/di/process.cpp b/src/coreclr/debug/di/process.cpp index 67f1a963a53d5..cffe97d17e016 100644 --- a/src/coreclr/debug/di/process.cpp +++ b/src/coreclr/debug/di/process.cpp @@ -5318,7 +5318,7 @@ void CordbProcess::RawDispatchEvent( // if the class is NULL, that means the debugger never enabled notifications for it. Otherwise, // the CordbClass instance would already have been created when the notifications were // enabled. - if ((pNotificationClass != NULL) && pNotificationClass->CustomNotificationsEnabled()) + if (pNotificationClass != NULL) { PUBLIC_CALLBACK_IN_THIS_SCOPE(this, pLockHolder, pEvent); @@ -11414,14 +11414,34 @@ const EXCEPTION_RECORD * CordbProcess::ValidateExceptionRecord( HRESULT CordbProcess::SetEnableCustomNotification(ICorDebugClass * pClass, BOOL fEnable) { HRESULT hr = S_OK; - PUBLIC_API_BEGIN(this); // takes the lock + PUBLIC_API_ENTRY(this); + FAIL_IF_NEUTERED(this); + ATT_REQUIRE_STOPPED_MAY_FAIL(GetProcess()); ValidateOrThrow(pClass); - ((CordbClass *)pClass)->SetCustomNotifications(fEnable); + CordbProcess * pProcess = GetProcess(); + RSLockHolder lockHolder(pProcess->GetProcessLock()); - PUBLIC_API_END(hr); - return hr; + DebuggerIPCEvent event; + CordbClass *pCordbClass = static_cast(pClass); + _ASSERTE(pCordbClass != NULL); + CordbAppDomain * pAppDomain = pCordbClass->GetAppDomain(); + _ASSERTE (pAppDomain != NULL); + CordbModule *pModule = pCordbClass->GetModule(); + + pProcess->InitIPCEvent(&event, DB_IPCE_CUSTOM_NOTIFICATION, true, pAppDomain->GetADToken()); + event.CustomNotificationData.vmModule = pModule->GetRuntimeModule(); + event.CustomNotificationData.classMetadataToken = pCordbClass->MDToken(); + event.CustomNotificationData.Enabled = fEnable; + + lockHolder.Release(); + hr = pProcess->m_cordb->SendIPCEvent(pProcess, &event, sizeof(DebuggerIPCEvent)); + lockHolder.Acquire(); + + _ASSERTE(event.type == DB_IPCE_DISABLE_OPTS_RESULT); + + return event.hr; } // CordbProcess::SetEnableCustomNotification //--------------------------------------------------------------------------------------- diff --git a/src/coreclr/debug/di/rsclass.cpp b/src/coreclr/debug/di/rsclass.cpp index d030efc3c31f0..d60d1777de0b5 100644 --- a/src/coreclr/debug/di/rsclass.cpp +++ b/src/coreclr/debug/di/rsclass.cpp @@ -34,8 +34,7 @@ CordbClass::CordbClass(CordbModule *m, mdTypeDef classMetadataToken) m_fIsValueClassKnown(false), m_fIsValueClass(false), m_fHasTypeParams(false), - m_continueCounterLastSync(0), - m_fCustomNotificationsEnabled(false) + m_continueCounterLastSync(0) { m_classInfo.Clear(); } diff --git a/src/coreclr/debug/di/rspriv.h b/src/coreclr/debug/di/rspriv.h index 9c6a98776d1cc..ee9f4e9849a47 100644 --- a/src/coreclr/debug/di/rspriv.h +++ b/src/coreclr/debug/di/rspriv.h @@ -5100,10 +5100,6 @@ class CordbClass : public CordbBase, public ICorDebugClass, public ICorDebugClas public: - // set or clear the custom notifications flag to control whether we ignore custom debugger notifications - void SetCustomNotifications(BOOL fEnable) { m_fCustomNotificationsEnabled = fEnable; } - BOOL CustomNotificationsEnabled () { return m_fCustomNotificationsEnabled; } - HRESULT GetFieldInfo(mdFieldDef fldToken, FieldData ** ppFieldData); // If you want to force the init to happen even if we think the class @@ -5178,9 +5174,6 @@ class CordbClass : public CordbBase, public ICorDebugClass, public ICorDebugClas // their value will be hung off the FieldDesc. Hold information about such fields here. CordbHangingFieldTable m_hangingFieldsStatic; - // this indicates whether we should send custom debugger notifications - BOOL m_fCustomNotificationsEnabled; - }; diff --git a/src/coreclr/debug/ee/debugger.cpp b/src/coreclr/debug/ee/debugger.cpp index 87018177e6999..d3a5e8b70fb61 100644 --- a/src/coreclr/debug/ee/debugger.cpp +++ b/src/coreclr/debug/ee/debugger.cpp @@ -8057,7 +8057,7 @@ BOOL Debugger::ShouldSendCustomNotification(DomainAssembly *pAssembly, mdTypeDef Module *pModule = pAssembly->GetModule(); TypeInModule tim(pModule, typeDef); - return m_pCustomNotificationTable->Lookup(tim) != NULL; + return !(m_pCustomNotificationTable->Lookup(tim).IsNull()); } // Actually send the catch handler found event. @@ -12455,18 +12455,20 @@ HRESULT Debugger::UpdateCustomNotificationTable(Module *pModule, mdTypeDef class TypeInModule tim(pModule, classToken); if (enabled) { - if (m_pCustomNotificationTable->Lookup(tim) == NULL) + if (m_pCustomNotificationTable->Lookup(tim).IsNull()) { m_pCustomNotificationTable->Add(tim); } } else { - if (m_pCustomNotificationTable->Lookup(tim) != NULL) + if (!(m_pCustomNotificationTable->Lookup(tim).IsNull())) { m_pCustomNotificationTable->Remove(tim); } } + + return S_OK; } HRESULT Debugger::UpdateForceCatchHandlerFoundTable(BOOL enableEvents, OBJECTREF exObj, AppDomain *pAppDomain) diff --git a/src/coreclr/debug/ee/debugger.h b/src/coreclr/debug/ee/debugger.h index 5a33e62c8dce7..a0616f306ba3d 100644 --- a/src/coreclr/debug/ee/debugger.h +++ b/src/coreclr/debug/ee/debugger.h @@ -597,24 +597,24 @@ class TypeInModule public: - bool operator ==(const MethodInModule& other) const + bool operator ==(const TypeInModule& other) const { return m_module == other.m_module && m_typeDef == other.m_typeDef; } - bool operator !=(const MethodInModule& other) const + bool operator !=(const TypeInModule& other) const { return !(*this == other); } - bool IsNull() + bool IsNull() const { return m_module == NULL && m_typeDef == 0; } - INT32 Hash() + INT32 Hash() const { - return m_module ^ m_typeDef; + return (INT32)((UINT_PTR)m_module ^ m_typeDef); } TypeInModule(Module * module, mdTypeDef typeDef) @@ -630,7 +630,6 @@ class TypeInModule } }; -} class EMPTY_BASES_DECL CustomNotificationSHashTraits : public DefaultSHashTraits { public: @@ -644,7 +643,7 @@ class EMPTY_BASES_DECL CustomNotificationSHashTraits : public DefaultSHashTraits { return e == f; } - static OBJECTHANDLE GetKey(constTypeInModule &e) + static TypeInModule GetKey(const TypeInModule &e) { return e; } @@ -667,7 +666,7 @@ class EMPTY_BASES_DECL CustomNotificationSHashTraits : public DefaultSHashTraits } static TypeInModule Deleted() { - TypeInModule tim((Module *)-1, -1) + TypeInModule tim((Module *)-1, -1); return tim; } static bool IsDeleted(const TypeInModule &e) diff --git a/src/coreclr/debug/shared/dbgtransportsession.cpp b/src/coreclr/debug/shared/dbgtransportsession.cpp index ada87bc3c8f65..f05cb0007c8ef 100644 --- a/src/coreclr/debug/shared/dbgtransportsession.cpp +++ b/src/coreclr/debug/shared/dbgtransportsession.cpp @@ -2508,7 +2508,7 @@ DWORD DbgTransportSession::GetEventSize(DebuggerIPCEvent *pEvent) break; case DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION: - cbAdditionalSize = sizeof(pEvent->ForceCatchHandlerFoundData); + cbAdditionalSize = sizeof(pEvent->CustomNotificationData); break; default: From 5e7f912a7ff28a7227fba9d878a46156ae1e9757 Mon Sep 17 00:00:00 2001 From: David Mason Date: Fri, 3 May 2024 13:21:19 -0700 Subject: [PATCH 3/4] Fixes --- src/coreclr/debug/di/process.cpp | 7 +++++-- src/coreclr/debug/ee/debugger.cpp | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/coreclr/debug/di/process.cpp b/src/coreclr/debug/di/process.cpp index cffe97d17e016..38c11c89127b7 100644 --- a/src/coreclr/debug/di/process.cpp +++ b/src/coreclr/debug/di/process.cpp @@ -11430,7 +11430,10 @@ HRESULT CordbProcess::SetEnableCustomNotification(ICorDebugClass * pClass, BOOL _ASSERTE (pAppDomain != NULL); CordbModule *pModule = pCordbClass->GetModule(); - pProcess->InitIPCEvent(&event, DB_IPCE_CUSTOM_NOTIFICATION, true, pAppDomain->GetADToken()); + pProcess->InitIPCEvent(&event, + DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION, + true, + pAppDomain->GetADToken()); event.CustomNotificationData.vmModule = pModule->GetRuntimeModule(); event.CustomNotificationData.classMetadataToken = pCordbClass->MDToken(); event.CustomNotificationData.Enabled = fEnable; @@ -11439,7 +11442,7 @@ HRESULT CordbProcess::SetEnableCustomNotification(ICorDebugClass * pClass, BOOL hr = pProcess->m_cordb->SendIPCEvent(pProcess, &event, sizeof(DebuggerIPCEvent)); lockHolder.Acquire(); - _ASSERTE(event.type == DB_IPCE_DISABLE_OPTS_RESULT); + _ASSERTE(event.type == DB_IPCE_SET_ENABLE_CUSTOM_NOTIFICATION_RESULT); return event.hr; } // CordbProcess::SetEnableCustomNotification diff --git a/src/coreclr/debug/ee/debugger.cpp b/src/coreclr/debug/ee/debugger.cpp index d3a5e8b70fb61..fe9f6836380a3 100644 --- a/src/coreclr/debug/ee/debugger.cpp +++ b/src/coreclr/debug/ee/debugger.cpp @@ -8051,7 +8051,7 @@ BOOL Debugger::ShouldSendCustomNotification(DomainAssembly *pAssembly, mdTypeDef { THROWS; GC_NOTRIGGER; - MODE_COOPERATIVE; + MODE_ANY; } CONTRACTL_END; From aa3ad2022f59bd7a1b727f56f60ffb6ba1ca92e8 Mon Sep 17 00:00:00 2001 From: David Mason Date: Mon, 6 May 2024 14:34:29 -0700 Subject: [PATCH 4/4] Update debugger.h --- src/coreclr/debug/ee/debugger.h | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/coreclr/debug/ee/debugger.h b/src/coreclr/debug/ee/debugger.h index a0616f306ba3d..345a178ee39f5 100644 --- a/src/coreclr/debug/ee/debugger.h +++ b/src/coreclr/debug/ee/debugger.h @@ -635,9 +635,7 @@ class EMPTY_BASES_DECL CustomNotificationSHashTraits : public DefaultSHashTraits public: typedef TypeInModule element_t; typedef TypeInModule key_t; - static const bool s_supports_autoremove = true; static const bool s_NoThrow = false; - static const bool s_RemovePerEntryCleanupAction = true; static BOOL Equals(const TypeInModule &e, const TypeInModule &f) { @@ -651,10 +649,6 @@ class EMPTY_BASES_DECL CustomNotificationSHashTraits : public DefaultSHashTraits { return e.Hash(); } - static bool ShouldDelete(const TypeInModule &e) - { - return e.IsNull(); - } static TypeInModule Null() { TypeInModule tim;