Skip to content

Commit 3f0318b

Browse files
barosiakCopilot
andauthored
[cDAC] Implement SetJITCompilerFlags for cDAC (#126595)
##  Summary Implement `SetJITCompilerFlags` on `IXCLRDataModule2` in the cDAC. ##  Changes - ClrDataModule.cs - `SetJITCompilerFlags` implementation - ILoader.cs / Loader_1.cs - added GetDebuggerInfoBits and SetDebuggerInfoBits contract methods with direct target memory read/write - IXCLRData.cs - added DebuggerAssemblyControlFlags enum mirroring cordbpriv.h - Tests - new tests covering get/set/flag-preservation --------- Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
1 parent f21b945 commit 3f0318b

File tree

19 files changed

+514
-52
lines changed

19 files changed

+514
-52
lines changed

docs/design/datacontracts/Loader.md

Lines changed: 66 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,12 @@ readonly struct ModuleHandle
1515
[Flags]
1616
enum ModuleFlags
1717
{
18-
Tenured = 0x00000001, // Set once we know for sure the Module will not be freed until the appdomain itself exits
19-
EditAndContinue = 0x00000008, // Edit and Continue is enabled for this module
20-
ReflectionEmit = 0x00000040, // Reflection.Emit was used to create this module
18+
Tenured = 0x1, // Set once we know for sure the Module will not be freed until the appdomain itself exits
19+
JitOptimizationDisabled = 0x2, // Cached flag: JIT optimizations are disabled
20+
EditAndContinue = 0x8, // Edit and Continue is enabled for this module
21+
ReflectionEmit = 0x40, // Reflection.Emit was used to create this module
22+
ProfDisableOptimizations = 0x80, // Profiler disabled JIT optimizations
23+
EncCapable = 0x200, // Cached flag: module is Edit and Continue capable
2124
}
2225

2326
[Flags]
@@ -90,6 +93,31 @@ TargetPointer GetObjectHandle(TargetPointer loaderAllocatorPointer);
9093
TargetPointer GetILHeader(ModuleHandle handle, uint token);
9194
TargetPointer GetDynamicIL(ModuleHandle handle, uint token);
9295
IReadOnlyDictionary<string, TargetPointer> GetLoaderAllocatorHeaps(TargetPointer loaderAllocatorPointer);
96+
97+
DebuggerAssemblyControlFlags GetDebuggerInfoBits(ModuleHandle handle);
98+
void SetDebuggerInfoBits(ModuleHandle handle, DebuggerAssemblyControlFlags newBits);
99+
```
100+
101+
The `DebuggerAssemblyControlFlags` enum is defined as:
102+
```csharp
103+
[Flags]
104+
enum DebuggerAssemblyControlFlags : uint
105+
{
106+
DACF_NONE = 0x00,
107+
DACF_ALLOW_JIT_OPTS = 0x02,
108+
DACF_ENC_ENABLED = 0x08,
109+
DACF_CONTROL_FLAGS_MASK = 0x2E,
110+
}
111+
```
112+
113+
The `ClrModifiableAssemblies` enum (from `EEConfig::ModifiableAssemblies`) is defined as:
114+
```csharp
115+
enum ClrModifiableAssemblies : uint
116+
{
117+
Unset = 0,
118+
None = 1,
119+
Debug = 2,
120+
}
93121
```
94122

95123
## Version 1
@@ -173,6 +201,7 @@ IReadOnlyDictionary<string, TargetPointer> GetLoaderAllocatorHeaps(TargetPointer
173201
| `DynamicILBlobTable` | `EntrySize` | Size of each table entry |
174202
| `DynamicILBlobTable` | `EntryMethodToken` | Offset of each entry method token from entry address |
175203
| `DynamicILBlobTable` | `EntryIL` | Offset of each entry IL from entry address |
204+
| `EEConfig` | `ModifiableAssemblies` | Controls Edit and Continue support (ClrModifiableAssemblies enum) |
176205

177206

178207

@@ -181,6 +210,7 @@ IReadOnlyDictionary<string, TargetPointer> GetLoaderAllocatorHeaps(TargetPointer
181210
| --- | --- | --- |
182211
| `AppDomain` | TargetPointer | Pointer to the global AppDomain |
183212
| `SystemDomain` | TargetPointer | Pointer to the global SystemDomain |
213+
| `EEConfig` | TargetPointer | Pointer to the global EEConfig (runtime configuration) |
184214

185215

186216
### Contract Constants:
@@ -189,6 +219,9 @@ IReadOnlyDictionary<string, TargetPointer> GetLoaderAllocatorHeaps(TargetPointer
189219
| `ASSEMBLY_NOTIFYFLAGS_PROFILER_NOTIFIED` | uint | Flag in Assembly NotifyFlags indicating the Assembly will notify profilers. | `0x1` |
190220
| `DefaultDomainFriendlyName` | string | Friendly name returned when `AppDomain.FriendlyName` is null (matches native `DEFAULT_DOMAIN_FRIENDLY_NAME`) | `"DefaultDomain"` |
191221
| `MaxWebcilSections` | ushort | Maximum number of COFF sections supported in a Webcil image (must stay in sync with native `WEBCIL_MAX_SECTIONS`) | `16` |
222+
| `DebuggerInfoMask` | uint | Mask for the debugger info bits within the Module's transient flags | `0x0000FC00` |
223+
| `DebuggerInfoShift` | int | Bit shift for the debugger info bits within the Module's transient flags | `10` |
224+
| `DEBUGGER_ALLOW_JIT_OPTS_PRIV` | uint | Debugger allows JIT optimizations (shifted in transient flags) | `0x00000800` |
192225

193226
Contracts used:
194227
| Contract Name |
@@ -817,6 +850,36 @@ TargetPointer GetDynamicIL(ModuleHandle handle, uint token)
817850
Data.DynamicILBlobEntry blobEntry = shashContract.LookupSHash(shash, token);
818851
return /* blob entry IL address */
819852
}
853+
854+
DebuggerAssemblyControlFlags GetDebuggerInfoBits(ModuleHandle handle)
855+
{
856+
uint flags = // read Module::Flags at handle.Address + Flags offset
857+
return (DebuggerAssemblyControlFlags)((flags & DebuggerInfoMask) >> DebuggerInfoShift);
858+
}
859+
860+
void SetDebuggerInfoBits(ModuleHandle handle, DebuggerAssemblyControlFlags newBits)
861+
{
862+
uint currentFlags = // read Module::Flags at handle.Address + Flags offset
863+
uint debuggerInfoBitsMask = DebuggerInfoMask >> DebuggerInfoShift;
864+
uint updated = (currentFlags & ~DebuggerInfoMask) | (((uint)newBits & debuggerInfoBitsMask) << DebuggerInfoShift);
865+
866+
bool jitOptDisabled = (updated & DEBUGGER_ALLOW_JIT_OPTS_PRIV) == 0 || (updated & PROF_DISABLE_OPTIMIZATIONS) != 0;
867+
// Set or clear IS_JIT_OPTIMIZATION_DISABLED accordingly.
868+
869+
if ((updated & IS_ENC_CAPABLE) != 0)
870+
{
871+
ClrModifiableAssemblies modifiable = // read EEConfig::ModifiableAssemblies from g_pConfig
872+
if (modifiable != None)
873+
{
874+
bool encRequested = (newBits & DACF_ENC_ENABLED) != 0;
875+
bool setEnC = encRequested || (modifiable == Debug && jitOptDisabled);
876+
if (setEnC)
877+
updated |= IS_EDIT_AND_CONTINUE;
878+
}
879+
}
880+
881+
// Write updated flags back to handle.Address + Flags offset
882+
}
820883
```
821884

822885
### DacEnumerableHash (EETypeHashTable and InstMethodHashTable)

src/coreclr/debug/daccess/dacdbiimpl.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -879,8 +879,6 @@ HRESULT STDMETHODCALLTYPE DacDbiInterfaceImpl::SetCompilerFlags(VMPTR_DomainAsse
879879
hr = CORDBG_S_NOT_ALL_BITS_SET;
880880
}
881881
}
882-
// Settings from the debugger take precedence over all other settings.
883-
dwBits |= DACF_USER_OVERRIDE;
884882

885883
// set flags. This will write back to the target
886884
pModule->SetDebuggerInfoBits((DebuggerAssemblyControlFlags)dwBits);

src/coreclr/debug/daccess/task.cpp

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2798,9 +2798,6 @@ ClrDataModule::SetJITCompilerFlags(
27982798
dwBits |= DACF_ALLOW_JIT_OPTS;
27992799
}
28002800

2801-
// Settings from the debugger take precedence over all other settings.
2802-
dwBits |= DACF_USER_OVERRIDE;
2803-
28042801
// set flags. This will write back to the target
28052802
m_module->SetDebuggerInfoBits((DebuggerAssemblyControlFlags)dwBits);
28062803

src/coreclr/inc/cordbpriv.h

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,6 @@ enum DebuggerControlFlag
3636

3737
DBCF_USER_MASK = 0x00FF,
3838
DBCF_GENERATE_DEBUG_CODE = 0x0001,
39-
DBCF_ALLOW_JIT_OPT = 0x0008,
4039
DBCF_PROFILER_ENABLED = 0x0020,
4140
// DBCF_ACTIVATE_REMOTE_DEBUGGING = 0x0040, Deprecated. DO NOT USE
4241

@@ -50,15 +49,15 @@ enum DebuggerControlFlag
5049
// Flags used to control the debuggable state of modules and
5150
// assemblies.
5251
//
52+
// [cDAC] [Loader]: Contract depends on DACF_NONE, DACF_ALLOW_JIT_OPTS, DACF_ENC_ENABLED, DACF_CONTROL_FLAGS_MASK.
5353
enum DebuggerAssemblyControlFlags
5454
{
5555
DACF_NONE = 0x00,
56-
DACF_USER_OVERRIDE = 0x01,
5756
DACF_ALLOW_JIT_OPTS = 0x02,
5857
DACF_OBSOLETE_TRACK_JIT_INFO = 0x04, // obsolete in V2.0, we're always tracking.
5958
DACF_ENC_ENABLED = 0x08,
6059
DACF_IGNORE_PDBS = 0x20,
61-
DACF_CONTROL_FLAGS_MASK = 0x2F,
60+
DACF_CONTROL_FLAGS_MASK = 0x2E,
6261

6362
DACF_PDBS_COPIED = 0x10,
6463
DACF_MISC_FLAGS_MASK = 0x10,

src/coreclr/vm/ceeload.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -516,6 +516,8 @@ void Module::Initialize(AllocMemTracker *pamTracker, LPCWSTR szName)
516516
m_dwTransientFlags = m_dwTransientFlags | PROF_DISABLE_OPTIMIZATIONS;
517517
}
518518

519+
UpdateJitOptimizationDisabledState();
520+
519521
m_pJitInlinerTrackingMap = NULL;
520522
if (ReJitManager::IsReJITInlineTrackingEnabled())
521523
{
@@ -538,6 +540,7 @@ void Module::SetDebuggerInfoBits(DebuggerAssemblyControlFlags newBits)
538540
~DEBUGGER_INFO_MASK_PRIV) == 0);
539541

540542
SetTransientFlagInterlockedWithMask(newBits << DEBUGGER_INFO_SHIFT_PRIV, DEBUGGER_INFO_MASK_PRIV);
543+
UpdateJitOptimizationDisabledState();
541544

542545
#ifdef DEBUGGING_SUPPORTED
543546
if (IsEditAndContinueCapable())
@@ -611,6 +614,7 @@ Module *Module::Create(Assembly *pAssembly, PEAssembly *pPEAssembly, AllocMemTra
611614

612615
void* pMemory = pamTracker->Track(pAssembly->GetHighFrequencyHeap()->AllocMem(S_SIZE_T(sizeof(EditAndContinueModule))));
613616
pModule = new (pMemory) EditAndContinueModule(pAssembly, pPEAssembly);
617+
pModule->SetTransientFlagInterlocked(IS_ENC_CAPABLE);
614618
}
615619
else
616620
#endif // FEATURE_METADATA_UPDATER

src/coreclr/vm/ceeload.h

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -618,10 +618,10 @@ class Module : public ModuleBase
618618

619619
enum {
620620
// These are the values set in m_dwTransientFlags.
621-
// [cDAC] [Loader]: Contract depends on the values of MODULE_IS_TENURED, IS_EDIT_AND_CONTINUE, and IS_REFLECTION_EMIT.
621+
// [cDAC] [Loader]: Contract depends on the values of MODULE_IS_TENURED, IS_EDIT_AND_CONTINUE, IS_REFLECTION_EMIT, IS_JIT_OPTIMIZATION_DISABLED, IS_ENC_CAPABLE, PROF_DISABLE_OPTIMIZATIONS, DEBUGGER_INFO_MASK_PRIV, DEBUGGER_INFO_SHIFT_PRIV.
622622

623623
MODULE_IS_TENURED = 0x00000001, // Set once we know for sure the Module will not be freed until the appdomain itself exits
624-
// unused = 0x00000002,
624+
IS_JIT_OPTIMIZATION_DISABLED= 0x00000002, // Cached result: JIT optimizations are disabled for this module (by debugger or profiler)
625625
CLASSES_FREED = 0x00000004,
626626
IS_EDIT_AND_CONTINUE = 0x00000008, // is EnC Enabled for this module
627627

@@ -632,12 +632,14 @@ class Module : public ModuleBase
632632
PROF_DISABLE_OPTIMIZATIONS = 0x00000080, // indicates if Profiler disabled JIT optimization event mask was set when loaded
633633
PROF_DISABLE_INLINING = 0x00000100, // indicates if Profiler disabled JIT Inlining event mask was set when loaded
634634

635+
IS_ENC_CAPABLE = 0x00000200, // Cached result of IsEditAndContinueCapable() at Module creation
636+
635637
//
636638
// Note: The values below must match the ones defined in
637639
// cordbpriv.h for DebuggerAssemblyControlFlags when shifted
638640
// right DEBUGGER_INFO_SHIFT bits.
639641
//
640-
DEBUGGER_USER_OVERRIDE_PRIV = 0x00000400,
642+
// DEBUGGER_USER_OVERRIDE_PRIV was 0x00000400. Deprecated.
641643
DEBUGGER_ALLOW_JIT_OPTS_PRIV= 0x00000800,
642644
DEBUGGER_TRACK_JIT_INFO_PRIV= 0x00001000,
643645
DEBUGGER_ENC_ENABLED_PRIV = 0x00002000, // this is what was attempted to be set. IS_EDIT_AND_CONTINUE is actual result.
@@ -651,7 +653,6 @@ class Module : public ModuleBase
651653
IS_BEING_UNLOADED = 0x00100000,
652654
};
653655

654-
static_assert(DEBUGGER_USER_OVERRIDE_PRIV >> DEBUGGER_INFO_SHIFT_PRIV == DebuggerAssemblyControlFlags::DACF_USER_OVERRIDE);
655656
static_assert(DEBUGGER_ALLOW_JIT_OPTS_PRIV >> DEBUGGER_INFO_SHIFT_PRIV == DebuggerAssemblyControlFlags::DACF_ALLOW_JIT_OPTS);
656657
static_assert(DEBUGGER_TRACK_JIT_INFO_PRIV >> DEBUGGER_INFO_SHIFT_PRIV == DebuggerAssemblyControlFlags::DACF_OBSOLETE_TRACK_JIT_INFO);
657658
static_assert(DEBUGGER_ENC_ENABLED_PRIV >> DEBUGGER_INFO_SHIFT_PRIV == DebuggerAssemblyControlFlags::DACF_ENC_ENABLED);
@@ -938,27 +939,10 @@ class Module : public ModuleBase
938939

939940
BOOL AreJITOptimizationsDisabled() const
940941
{
941-
WRAPPER_NO_CONTRACT;
942+
LIMITED_METHOD_CONTRACT;
942943
SUPPORTS_DAC;
943944

944-
#ifdef DEBUGGING_SUPPORTED
945-
// check if debugger has disallowed JIT optimizations
946-
auto dwDebuggerBits = GetDebuggerInfoBits();
947-
if (!CORDebuggerAllowJITOpts(dwDebuggerBits))
948-
{
949-
return TRUE;
950-
}
951-
#endif // DEBUGGING_SUPPORTED
952-
953-
#if defined(PROFILING_SUPPORTED) || defined(PROFILING_SUPPORTED_DATA)
954-
// check if profiler had disabled JIT optimizations when module was loaded
955-
if (m_dwTransientFlags & PROF_DISABLE_OPTIMIZATIONS)
956-
{
957-
return TRUE;
958-
}
959-
#endif // defined(PROFILING_SUPPORTED) || defined(PROFILING_SUPPORTED_DATA)
960-
961-
return FALSE;
945+
return (m_dwTransientFlags & IS_JIT_OPTIMIZATION_DISABLED) != 0;
962946
}
963947

964948
#ifdef FEATURE_METADATA_UPDATER
@@ -976,6 +960,17 @@ class Module : public ModuleBase
976960
SetTransientFlagInterlocked(IS_EDIT_AND_CONTINUE);
977961
}
978962

963+
// Recompute and cache the IS_JIT_OPTIMIZATION_DISABLED bit from the debugger and profiler source bits.
964+
// Must be called after any change to DEBUGGER_ALLOW_JIT_OPTS_PRIV or PROF_DISABLE_OPTIMIZATIONS.
965+
void UpdateJitOptimizationDisabledState()
966+
{
967+
LIMITED_METHOD_CONTRACT;
968+
969+
DWORD flags = m_dwTransientFlags;
970+
bool disabled = !(flags & DEBUGGER_ALLOW_JIT_OPTS_PRIV) || (flags & PROF_DISABLE_OPTIMIZATIONS);
971+
SetTransientFlagInterlockedWithMask(disabled ? IS_JIT_OPTIMIZATION_DISABLED : 0, IS_JIT_OPTIMIZATION_DISABLED);
972+
}
973+
979974
public:
980975
BOOL IsTenured()
981976
{

src/coreclr/vm/datadescriptor/datadescriptor.inc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1278,6 +1278,11 @@ CDAC_TYPE_FIELD(AuxiliarySymbolInfo, T_POINTER, Address, offsetof(VMAUXILIARYSYM
12781278
CDAC_TYPE_FIELD(AuxiliarySymbolInfo, T_POINTER, Name, offsetof(VMAUXILIARYSYMBOLDEF, name))
12791279
CDAC_TYPE_END(AuxiliarySymbolInfo)
12801280

1281+
CDAC_TYPE_BEGIN(EEConfig)
1282+
CDAC_TYPE_INDETERMINATE(EEConfig)
1283+
CDAC_TYPE_FIELD(EEConfig, T_UINT32, ModifiableAssemblies, cdac_data<EEConfig>::ModifiableAssemblies)
1284+
CDAC_TYPE_END(EEConfig)
1285+
12811286
CDAC_TYPES_END()
12821287

12831288
CDAC_GLOBALS_BEGIN()
@@ -1328,6 +1333,7 @@ CDAC_GLOBAL_POINTER(SystemDomain, cdac_data<SystemDomain>::SystemDomainPtr)
13281333
CDAC_GLOBAL_POINTER(ThreadStore, &ThreadStore::s_pThreadStore)
13291334
CDAC_GLOBAL_POINTER(FinalizerThread, &::g_pFinalizerThread)
13301335
CDAC_GLOBAL_POINTER(GCThread, &::g_pSuspensionThread)
1336+
CDAC_GLOBAL_POINTER(EEConfig, &::g_pConfig)
13311337
#if defined(DEBUGGING_SUPPORTED) && !defined(TARGET_WASM)
13321338
CDAC_GLOBAL_POINTER(Debugger, &::g_pDebugger)
13331339
CDAC_GLOBAL_POINTER(CLRJitAttachState, &::CLRJitAttachState)

src/coreclr/vm/eeconfig.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ enum { OPT_BLENDED,
4343
OPT_RANDOM,
4444
OPT_DEFAULT = OPT_BLENDED };
4545

46+
// [cDAC] [Loader]: Contract depends on these values.
4647
enum ClrModifiableAssemblies {
4748
/* modifiable assemblies are implicitly disabled */
4849
MODIFIABLE_ASSM_UNSET = 0,
@@ -59,6 +60,7 @@ enum ParseCtl {
5960

6061
class EEConfig
6162
{
63+
friend struct ::cdac_data<EEConfig>;
6264
public:
6365
static HRESULT Setup();
6466

@@ -715,6 +717,11 @@ class EEConfig
715717
{ return dwSleepOnExit; }
716718
};
717719

720+
template<>
721+
struct cdac_data<EEConfig>
722+
{
723+
static constexpr size_t ModifiableAssemblies = offsetof(EEConfig, modifiableAssemblies);
724+
};
718725

719726

720727
#ifdef _DEBUG_IMPL

src/coreclr/vm/vars.hpp

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -546,14 +546,8 @@ inline bool CORDebuggerAttached()
546546
return (g_CORDebuggerControlFlags & DBCF_ATTACHED) && !IsAtProcessExit();
547547
}
548548

549-
// This only check debugger bits. However JIT optimizations can be disabled by other ways on a module
550-
// In most cases Module::AreJITOptimizationsDisabled() should be the prefered for checking if JIT optimizations
551-
// are disabled for a module (it does check both debugger bits and profiler jit deoptimization flag)
552549
#define CORDebuggerAllowJITOpts(dwDebuggerBits) \
553-
(((dwDebuggerBits) & DACF_ALLOW_JIT_OPTS) \
554-
|| \
555-
((g_CORDebuggerControlFlags & DBCF_ALLOW_JIT_OPT) && \
556-
!((dwDebuggerBits) & DACF_USER_OVERRIDE)))
550+
(((dwDebuggerBits) & DACF_ALLOW_JIT_OPTS) != 0)
557551

558552
#define CORDebuggerEnCMode(dwDebuggerBits) \
559553
((dwDebuggerBits) & DACF_ENC_ENABLED)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,28 @@ public ModuleHandle(TargetPointer address)
1919
[Flags]
2020
public enum ModuleFlags
2121
{
22-
Tenured = 0x1, // Set once we know for sure the Module will not be freed until the appdomain itself exits
23-
EditAndContinue = 0x8, // Edit and Continue is enabled for this module
24-
ReflectionEmit = 0x40, // Reflection.Emit was used to create this module
22+
Tenured = 0x1, // Set once we know for sure the Module will not be freed until the appdomain itself exits
23+
JitOptimizationDisabled = 0x2, // Cached flag: JIT optimizations are disabled
24+
EditAndContinue = 0x8, // Edit and Continue is enabled for this module
25+
ReflectionEmit = 0x40, // Reflection.Emit was used to create this module
26+
ProfDisableOptimizations = 0x80, // Profiler disabled JIT optimizations
27+
EncCapable = 0x200, // Cached flag: module is Edit and Continue capable
28+
}
29+
30+
[Flags]
31+
public enum DebuggerAssemblyControlFlags : uint
32+
{
33+
DACF_NONE = 0x00,
34+
DACF_ALLOW_JIT_OPTS = 0x02,
35+
DACF_ENC_ENABLED = 0x08,
36+
DACF_CONTROL_FLAGS_MASK = 0x2E,
37+
}
38+
39+
public enum ClrModifiableAssemblies : uint
40+
{
41+
Unset = 0,
42+
None = 1,
43+
Debug = 2,
2544
}
2645

2746
[Flags]
@@ -98,6 +117,9 @@ public interface ILoader : IContract
98117
TargetPointer GetObjectHandle(TargetPointer loaderAllocatorPointer) => throw new NotImplementedException();
99118
TargetPointer GetDynamicIL(ModuleHandle handle, uint token) => throw new NotImplementedException();
100119
IReadOnlyDictionary<string, TargetPointer> GetLoaderAllocatorHeaps(TargetPointer loaderAllocatorPointer) => throw new NotImplementedException();
120+
121+
DebuggerAssemblyControlFlags GetDebuggerInfoBits(ModuleHandle handle) => throw new NotImplementedException();
122+
void SetDebuggerInfoBits(ModuleHandle handle, DebuggerAssemblyControlFlags newBits) => throw new NotImplementedException();
101123
}
102124

103125
public readonly struct Loader : ILoader

0 commit comments

Comments
 (0)