Skip to content

Commit 7c14f71

Browse files
Add support for the ISOSDacInterface14 api (#100364)
* Add support for the ISOSDacInterface14 api - This is a split out of the diagnostics changes associated with PR #99183 - This will allow the removal of the useability of the DomainLocalModule apis from ISOSDacInterface without changing the functionality of the interface by allowing consumers to move to the new apis - NOTE, the SOS_BREAKING_CHANGE number is expected to move from 4 to 5 at that point, so users of ISOSDacInterface which understand ISOSDacInterface14 should indicate that they understand version 5.
1 parent 71177d9 commit 7c14f71

File tree

10 files changed

+270
-24
lines changed

10 files changed

+270
-24
lines changed

src/coreclr/debug/daccess/daccess.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -3231,6 +3231,10 @@ ClrDataAccess::QueryInterface(THIS_
32313231
{
32323232
ifaceRet = static_cast<ISOSDacInterface13*>(this);
32333233
}
3234+
else if (IsEqualIID(interfaceId, __uuidof(ISOSDacInterface14)))
3235+
{
3236+
ifaceRet = static_cast<ISOSDacInterface14*>(this);
3237+
}
32343238
else
32353239
{
32363240
*iface = NULL;

src/coreclr/debug/daccess/dacdbiimpl.cpp

+2-10
Original file line numberDiff line numberDiff line change
@@ -1577,16 +1577,8 @@ void DacDbiInterfaceImpl::GetStaticsBases(TypeHandle thExact,
15771577
PTR_BYTE * ppNonGCStaticsBase)
15781578
{
15791579
MethodTable * pMT = thExact.GetMethodTable();
1580-
Module * pModuleForStatics = pMT->GetModuleForStatics();
1581-
if (pModuleForStatics != NULL)
1582-
{
1583-
PTR_DomainLocalModule pLocalModule = pModuleForStatics->GetDomainLocalModule();
1584-
if (pLocalModule != NULL)
1585-
{
1586-
*ppGCStaticsBase = pLocalModule->GetGCStaticsBasePointer(pMT);
1587-
*ppNonGCStaticsBase = pLocalModule->GetNonGCStaticsBasePointer(pMT);
1588-
}
1589-
}
1580+
*ppGCStaticsBase = pMT->GetGCStaticsBasePointer();
1581+
*ppNonGCStaticsBase = pMT->GetNonGCStaticsBasePointer();
15901582
} // DacDbiInterfaceImpl::GetStaticsBases
15911583

15921584
//-----------------------------------------------------------------------------

src/coreclr/debug/daccess/dacimpl.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -816,7 +816,8 @@ class ClrDataAccess
816816
public ISOSDacInterface10,
817817
public ISOSDacInterface11,
818818
public ISOSDacInterface12,
819-
public ISOSDacInterface13
819+
public ISOSDacInterface13,
820+
public ISOSDacInterface14
820821
{
821822
public:
822823
ClrDataAccess(ICorDebugDataTarget * pTarget, ICLRDataTarget * pLegacyTarget=0);
@@ -1216,6 +1217,11 @@ class ClrDataAccess
12161217
virtual HRESULT STDMETHODCALLTYPE GetGCFreeRegions(ISOSMemoryEnum **ppEnum);
12171218
virtual HRESULT STDMETHODCALLTYPE LockedFlush();
12181219

1220+
// ISOSDacInterface14
1221+
virtual HRESULT STDMETHODCALLTYPE GetStaticBaseAddress(CLRDATA_ADDRESS methodTable, CLRDATA_ADDRESS *nonGCStaticsAddress, CLRDATA_ADDRESS *GCStaticsAddress);
1222+
virtual HRESULT STDMETHODCALLTYPE GetThreadStaticBaseAddress(CLRDATA_ADDRESS methodTable, CLRDATA_ADDRESS thread, CLRDATA_ADDRESS *nonGCStaticsAddress, CLRDATA_ADDRESS *GCStaticsAddress);
1223+
virtual HRESULT STDMETHODCALLTYPE GetMethodTableInitializationFlags(CLRDATA_ADDRESS methodTable, MethodTableInitializationFlags *initializationStatus);
1224+
12191225
//
12201226
// ClrDataAccess.
12211227
//

src/coreclr/debug/daccess/request.cpp

+116
Original file line numberDiff line numberDiff line change
@@ -5401,3 +5401,119 @@ HRESULT ClrDataAccess::LockedFlush()
54015401
SOSDacLeave();
54025402
return hr;
54035403
}
5404+
5405+
HRESULT STDMETHODCALLTYPE ClrDataAccess::GetStaticBaseAddress(CLRDATA_ADDRESS methodTable, CLRDATA_ADDRESS *nonGCStaticsAddress, CLRDATA_ADDRESS *GCStaticsAddress)
5406+
{
5407+
if (!nonGCStaticsAddress && !GCStaticsAddress)
5408+
return E_POINTER;
5409+
5410+
if (!methodTable)
5411+
return E_INVALIDARG;
5412+
5413+
SOSDacEnter();
5414+
5415+
PTR_MethodTable mTable = PTR_MethodTable(TO_TADDR(methodTable));
5416+
5417+
BOOL bIsFree = FALSE;
5418+
if (!DacValidateMethodTable(mTable, bIsFree))
5419+
{
5420+
hr = E_INVALIDARG;
5421+
}
5422+
else
5423+
{
5424+
if (GCStaticsAddress != NULL)
5425+
{
5426+
*GCStaticsAddress = PTR_CDADDR(mTable->GetGCStaticsBasePointer());
5427+
}
5428+
if (nonGCStaticsAddress != NULL)
5429+
{
5430+
*nonGCStaticsAddress = PTR_CDADDR(mTable->GetNonGCStaticsBasePointer());
5431+
}
5432+
}
5433+
5434+
SOSDacLeave();
5435+
return hr;
5436+
}
5437+
5438+
5439+
HRESULT STDMETHODCALLTYPE ClrDataAccess::GetThreadStaticBaseAddress(CLRDATA_ADDRESS methodTable, CLRDATA_ADDRESS threadPtr, CLRDATA_ADDRESS *nonGCStaticsAddress, CLRDATA_ADDRESS *GCStaticsAddress)
5440+
{
5441+
if (!nonGCStaticsAddress && !GCStaticsAddress)
5442+
return E_POINTER;
5443+
5444+
if (!methodTable)
5445+
return E_INVALIDARG;
5446+
5447+
if (!threadPtr)
5448+
return E_INVALIDARG;
5449+
5450+
SOSDacEnter();
5451+
5452+
PTR_MethodTable mTable = PTR_MethodTable(TO_TADDR(methodTable));
5453+
PTR_Thread thread = PTR_Thread(TO_TADDR(threadPtr));
5454+
5455+
5456+
BOOL bIsFree = FALSE;
5457+
if (!DacValidateMethodTable(mTable, bIsFree))
5458+
{
5459+
hr = E_INVALIDARG;
5460+
}
5461+
else
5462+
{
5463+
if (mTable->GetClass()->GetNumThreadStaticFields() == 0)
5464+
{
5465+
if (GCStaticsAddress != NULL)
5466+
{
5467+
*GCStaticsAddress = 0;
5468+
}
5469+
if (nonGCStaticsAddress != NULL)
5470+
{
5471+
*nonGCStaticsAddress = 0;
5472+
}
5473+
}
5474+
else
5475+
{
5476+
if (GCStaticsAddress != NULL)
5477+
{
5478+
*GCStaticsAddress = PTR_CDADDR(mTable->GetGCThreadStaticsBasePointer(thread));
5479+
}
5480+
if (nonGCStaticsAddress != NULL)
5481+
{
5482+
*nonGCStaticsAddress = PTR_CDADDR(mTable->GetNonGCThreadStaticsBasePointer(thread));
5483+
}
5484+
}
5485+
}
5486+
5487+
SOSDacLeave();
5488+
return hr;
5489+
}
5490+
5491+
HRESULT STDMETHODCALLTYPE ClrDataAccess::GetMethodTableInitializationFlags(CLRDATA_ADDRESS methodTable, MethodTableInitializationFlags *initializationStatus)
5492+
{
5493+
if (!methodTable)
5494+
return E_INVALIDARG;
5495+
5496+
if (!initializationStatus)
5497+
return E_POINTER;
5498+
5499+
SOSDacEnter();
5500+
5501+
*initializationStatus = (MethodTableInitializationFlags)0;
5502+
PTR_MethodTable mTable = PTR_MethodTable(TO_TADDR(methodTable));
5503+
BOOL bIsFree = FALSE;
5504+
if (!DacValidateMethodTable(mTable, bIsFree))
5505+
{
5506+
hr = E_INVALIDARG;
5507+
}
5508+
else
5509+
{
5510+
*initializationStatus = mTable->IsClassInited() ? MethodTableInitialized : (MethodTableInitializationFlags)0;
5511+
if (mTable->IsInitError())
5512+
{
5513+
*initializationStatus = (MethodTableInitializationFlags)(*initializationStatus | MethodTableInitializationFailed);
5514+
}
5515+
}
5516+
5517+
SOSDacLeave();
5518+
return hr;
5519+
}

src/coreclr/inc/sospriv.idl

+14
Original file line numberDiff line numberDiff line change
@@ -43,12 +43,14 @@ typedef unsigned int size_t;
4343
typedef int ModuleMapType;
4444
typedef int VCSHeapType;
4545
typedef int LoaderHeapKind;
46+
typedef int MethodTableInitializationFlags;
4647
cpp_quote("#endif")
4748

4849

4950
cpp_quote("typedef enum { TYPEDEFTOMETHODTABLE, TYPEREFTOMETHODTABLE } ModuleMapType;")
5051
cpp_quote("typedef enum {IndcellHeap, LookupHeap, ResolveHeap, DispatchHeap, CacheEntryHeap, VtableHeap} VCSHeapType;")
5152
cpp_quote("typedef enum {LoaderHeapKindNormal = 0, LoaderHeapKindExplicitControl = 1} LoaderHeapKind;")
53+
cpp_quote("typedef enum {MethodTableInitialized = 1, MethodTableInitializationFailed = 2} MethodTableInitializationFlags;")
5254
cpp_quote("typedef enum {FreeUnknownRegion = 0, FreeGlobalHugeRegion = 1, FreeGlobalRegion = 2, FreeRegion = 3, FreeSohSegment = 4, FreeUohSegment = 5 } FreeRegionKind;")
5355

5456
typedef void (*MODULEMAPTRAVERSE)(UINT index, CLRDATA_ADDRESS methodTable,LPVOID token);
@@ -505,3 +507,15 @@ interface ISOSDacInterface13 : IUnknown
505507
HRESULT GetGCFreeRegions(ISOSMemoryEnum **ppEnum);
506508
HRESULT LockedFlush();
507509
}
510+
511+
[
512+
object,
513+
local,
514+
uuid(9aa22aca-6dc6-4a0c-b4e0-70d2416b9837)
515+
]
516+
interface ISOSDacInterface14 : IUnknown
517+
{
518+
HRESULT GetStaticBaseAddress(CLRDATA_ADDRESS methodTable, CLRDATA_ADDRESS *nonGCStaticsAddress, CLRDATA_ADDRESS *GCStaticsAddress);
519+
HRESULT GetThreadStaticBaseAddress(CLRDATA_ADDRESS methodTable, CLRDATA_ADDRESS thread, CLRDATA_ADDRESS *nonGCStaticsAddress, CLRDATA_ADDRESS *GCStaticsAddress);
520+
HRESULT GetMethodTableInitializationFlags(CLRDATA_ADDRESS methodTable, MethodTableInitializationFlags *initializationStatus);
521+
}

src/coreclr/pal/prebuilt/idl/sospriv_i.cpp

+5-4
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,9 @@
55
/* link this file in with the server and any clients */
66

77

8-
/* File created by MIDL compiler version 8.01.0622 */
9-
/* at Mon Jan 18 19:14:07 2038
10-
*/
8+
/* File created by MIDL compiler version 8.01.0628 */
119
/* Compiler settings for sospriv.idl:
12-
Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0622
10+
Oicf, W1, Zp8, env=Win64 (32b run), target_arch=AMD64 8.01.0628
1311
protocol : dce , ms_ext, c_ext, robust
1412
error checks: allocation ref bounds_check enum stub_data
1513
VC __declspec() decoration level:
@@ -120,6 +118,9 @@ MIDL_DEFINE_GUID(IID, IID_ISOSDacInterface12,0x1b93bacc,0x8ca4,0x432d,0x94,0x3a,
120118

121119
MIDL_DEFINE_GUID(IID, IID_ISOSDacInterface13,0x3176a8ed,0x597b,0x4f54,0xa7,0x1f,0x83,0x69,0x5c,0x6a,0x8c,0x5e);
122120

121+
122+
MIDL_DEFINE_GUID(IID, IID_ISOSDacInterface14,0x9aa22aca,0x6dc6,0x4a0c,0xb4,0xe0,0x70,0xd2,0x41,0x6b,0x98,0x37);
123+
123124
#undef MIDL_DEFINE_GUID
124125

125126
#ifdef __cplusplus

src/coreclr/pal/prebuilt/inc/sospriv.h

+114
Original file line numberDiff line numberDiff line change
@@ -205,6 +205,7 @@ typedef int VCSHeapType;
205205
typedef enum { TYPEDEFTOMETHODTABLE, TYPEREFTOMETHODTABLE } ModuleMapType;
206206
typedef enum {IndcellHeap, LookupHeap, ResolveHeap, DispatchHeap, CacheEntryHeap, VtableHeap} VCSHeapType;
207207
typedef enum {LoaderHeapKindNormal = 0, LoaderHeapKindExplicitControl = 1} LoaderHeapKind;
208+
typedef enum {MethodTableInitialized = 1, MethodTableInitializationFailed = 2} MethodTableInitializationFlags;
208209
typedef enum {FreeUnknownRegion = 0, FreeGlobalHugeRegion = 1, FreeGlobalRegion = 2, FreeRegion = 3, FreeSohSegment = 4, FreeUohSegment = 5 } FreeRegionKind;
209210
typedef void ( *MODULEMAPTRAVERSE )(
210211
UINT index,
@@ -3343,6 +3344,118 @@ EXTERN_C const IID IID_ISOSDacInterface13;
33433344
#endif /* __ISOSDacInterface13_INTERFACE_DEFINED__ */
33443345

33453346

3347+
#ifndef __ISOSDacInterface14_INTERFACE_DEFINED__
3348+
#define __ISOSDacInterface14_INTERFACE_DEFINED__
3349+
3350+
/* interface ISOSDacInterface14 */
3351+
/* [uuid][local][object] */
3352+
3353+
3354+
EXTERN_C const IID IID_ISOSDacInterface14;
3355+
3356+
#if defined(__cplusplus) && !defined(CINTERFACE)
3357+
3358+
MIDL_INTERFACE("9aa22aca-6dc6-4a0c-b4e0-70d2416b9837")
3359+
ISOSDacInterface14 : public IUnknown
3360+
{
3361+
public:
3362+
virtual HRESULT STDMETHODCALLTYPE GetStaticBaseAddress(
3363+
CLRDATA_ADDRESS methodTable,
3364+
CLRDATA_ADDRESS *nonGCStaticsAddress,
3365+
CLRDATA_ADDRESS *GCStaticsAddress) = 0;
3366+
3367+
virtual HRESULT STDMETHODCALLTYPE GetThreadStaticBaseAddress(
3368+
CLRDATA_ADDRESS methodTable,
3369+
CLRDATA_ADDRESS thread,
3370+
CLRDATA_ADDRESS *nonGCStaticsAddress,
3371+
CLRDATA_ADDRESS *GCStaticsAddress) = 0;
3372+
3373+
virtual HRESULT STDMETHODCALLTYPE GetMethodTableInitializationFlags(
3374+
CLRDATA_ADDRESS methodTable,
3375+
MethodTableInitializationFlags *initializationStatus) = 0;
3376+
3377+
};
3378+
3379+
3380+
#else /* C style interface */
3381+
3382+
typedef struct ISOSDacInterface14Vtbl
3383+
{
3384+
BEGIN_INTERFACE
3385+
3386+
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
3387+
ISOSDacInterface14 * This,
3388+
/* [in] */ REFIID riid,
3389+
/* [annotation][iid_is][out] */
3390+
_COM_Outptr_ void **ppvObject);
3391+
3392+
ULONG ( STDMETHODCALLTYPE *AddRef )(
3393+
ISOSDacInterface14 * This);
3394+
3395+
ULONG ( STDMETHODCALLTYPE *Release )(
3396+
ISOSDacInterface14 * This);
3397+
3398+
HRESULT ( STDMETHODCALLTYPE *GetStaticBaseAddress )(
3399+
ISOSDacInterface14 * This,
3400+
CLRDATA_ADDRESS methodTable,
3401+
CLRDATA_ADDRESS *nonGCStaticsAddress,
3402+
CLRDATA_ADDRESS *GCStaticsAddress);
3403+
3404+
HRESULT ( STDMETHODCALLTYPE *GetThreadStaticBaseAddress )(
3405+
ISOSDacInterface14 * This,
3406+
CLRDATA_ADDRESS methodTable,
3407+
CLRDATA_ADDRESS thread,
3408+
CLRDATA_ADDRESS *nonGCStaticsAddress,
3409+
CLRDATA_ADDRESS *GCStaticsAddress);
3410+
3411+
HRESULT ( STDMETHODCALLTYPE *GetMethodTableInitializationFlags )(
3412+
ISOSDacInterface14 * This,
3413+
CLRDATA_ADDRESS methodTable,
3414+
MethodTableInitializationFlags *initializationStatus);
3415+
3416+
END_INTERFACE
3417+
} ISOSDacInterface14Vtbl;
3418+
3419+
interface ISOSDacInterface14
3420+
{
3421+
CONST_VTBL struct ISOSDacInterface14Vtbl *lpVtbl;
3422+
};
3423+
3424+
3425+
3426+
#ifdef COBJMACROS
3427+
3428+
3429+
#define ISOSDacInterface14_QueryInterface(This,riid,ppvObject) \
3430+
( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
3431+
3432+
#define ISOSDacInterface14_AddRef(This) \
3433+
( (This)->lpVtbl -> AddRef(This) )
3434+
3435+
#define ISOSDacInterface14_Release(This) \
3436+
( (This)->lpVtbl -> Release(This) )
3437+
3438+
3439+
#define ISOSDacInterface14_GetStaticBaseAddress(This,methodTable,nonGCStaticsAddress,GCStaticsAddress) \
3440+
( (This)->lpVtbl -> GetStaticBaseAddress(This,methodTable,nonGCStaticsAddress,GCStaticsAddress) )
3441+
3442+
#define ISOSDacInterface14_GetThreadStaticBaseAddress(This,methodTable,thread,nonGCStaticsAddress,GCStaticsAddress) \
3443+
( (This)->lpVtbl -> GetThreadStaticBaseAddress(This,methodTable,thread,nonGCStaticsAddress,GCStaticsAddress) )
3444+
3445+
#define ISOSDacInterface14_GetMethodTableInitializationFlags(This,methodTable,initializationStatus) \
3446+
( (This)->lpVtbl -> GetMethodTableInitializationFlags(This,methodTable,initializationStatus) )
3447+
3448+
#endif /* COBJMACROS */
3449+
3450+
3451+
#endif /* C style interface */
3452+
3453+
3454+
3455+
3456+
#endif /* __ISOSDacInterface14_INTERFACE_DEFINED__ */
3457+
3458+
33463459
/* Additional Prototypes for ALL interfaces */
33473460

33483461
/* end of Additional Prototypes */
@@ -3353,3 +3466,4 @@ EXTERN_C const IID IID_ISOSDacInterface13;
33533466

33543467
#endif
33553468

3469+

src/coreclr/vm/methodtable.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -366,7 +366,6 @@ BOOL MethodTable::ValidateWithPossibleAV()
366366
(pEEClass && (pEEClass->GetMethodTableWithPossibleAV()->GetClassWithPossibleAV() == pEEClass))));
367367
}
368368

369-
#ifndef DACCESS_COMPILE
370369

371370
//==========================================================================================
372371
BOOL MethodTable::IsClassInited()
@@ -379,7 +378,7 @@ BOOL MethodTable::IsClassInited()
379378
if (IsSharedByGenericInstantiations())
380379
return FALSE;
381380

382-
DomainLocalModule *pLocalModule = GetDomainLocalModule();
381+
PTR_DomainLocalModule pLocalModule = GetDomainLocalModule();
383382

384383
_ASSERTE(pLocalModule != NULL);
385384

@@ -391,12 +390,13 @@ BOOL MethodTable::IsInitError()
391390
{
392391
WRAPPER_NO_CONTRACT;
393392

394-
DomainLocalModule *pLocalModule = GetDomainLocalModule();
393+
PTR_DomainLocalModule pLocalModule = GetDomainLocalModule();
395394
_ASSERTE(pLocalModule != NULL);
396395

397396
return pLocalModule->IsClassInitError(this);
398397
}
399398

399+
#ifndef DACCESS_COMPILE
400400
//==========================================================================================
401401
// mark the class as having its .cctor run
402402
void MethodTable::SetClassInited()

0 commit comments

Comments
 (0)