[cDAC] Implement SetJITCompilerFlags for cDAC#126595
[cDAC] Implement SetJITCompilerFlags for cDAC#126595barosiak wants to merge 2 commits intodotnet:mainfrom
Conversation
|
Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag |
There was a problem hiding this comment.
Pull request overview
Implements IXCLRDataModule2.SetJITCompilerFlags for the managed cDAC by wiring it to the Loader contract’s module transient-flag debugger bits, adding the necessary contract surface and tests to validate read/write behavior.
Changes:
- Implement
IXCLRDataModule2.SetJITCompilerFlagsinClrDataModuleby updating module debugger control bits viaILoader. - Extend
ILoader/Loader_1withGetDebuggerInfoBitsandSetDebuggerInfoBits, and document the new contract surface/constants. - Update cDAC test infrastructure to support target-memory writes and add Loader tests for debugger-bit get/set and flag preservation.
Reviewed changes
Copilot reviewed 10 out of 10 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs | Implements SetJITCompilerFlags using Loader debugger-info bits. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/IXCLRData.cs | Adds managed DebuggerAssemblyControlFlags enum mirroring cordbpriv.h. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Contracts/ILoader.cs | Adds GetDebuggerInfoBits / SetDebuggerInfoBits to the Loader contract. |
| src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs | Implements debugger-info bit get/set by reading/writing Module::Flags. |
| src/native/managed/cdac/tests/TestPlaceholderTarget.cs | Adds write-capable target support for tests. |
| src/native/managed/cdac/tests/MockDescriptors/MockDescriptors.Loader.cs | Allows initializing module transient flags in mocks. |
| src/native/managed/cdac/tests/LoaderTests.cs | Adds new tests for debugger-info bit behavior. |
| docs/design/datacontracts/Loader.md | Documents new Loader contract methods and constants. |
| src/coreclr/vm/ceeload.h | Notes cDAC Loader contract dependency on debugger-info mask/shift constants. |
| src/coreclr/inc/cordbpriv.h | Adds explicit comment that cDAC depends on flag values. |
...native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/Loader_1.cs
Outdated
Show resolved
Hide resolved
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
| int hr = HResults.S_OK; | ||
| try | ||
| { | ||
| if ((flags != CORDEBUG_JIT_DEFAULT) && (flags != CORDEBUG_JIT_DISABLE_OPTIMIZATION)) | ||
| throw new ArgumentException(); | ||
|
|
There was a problem hiding this comment.
IXCLRDataModule2.SetJITCompilerFlags is now implemented, but there doesn’t appear to be any unit/integration test that exercises this COM entrypoint (argument validation and the expected updates to Module::m_dwTransientFlags via Loader.Get/SetDebuggerInfoBits). Adding a focused test that constructs a ClrDataModule over a mock Module, calls SetJITCompilerFlags with both supported values (and an invalid value), and then asserts the shifted debugger bits in target memory would help prevent regressions.
| int hr = HResults.S_OK; | |
| try | |
| { | |
| if ((flags != CORDEBUG_JIT_DEFAULT) && (flags != CORDEBUG_JIT_DISABLE_OPTIMIZATION)) | |
| throw new ArgumentException(); | |
| if ((flags != CORDEBUG_JIT_DEFAULT) && (flags != CORDEBUG_JIT_DISABLE_OPTIMIZATION)) | |
| { | |
| return HResults.E_INVALIDARG; | |
| } | |
| int hr = HResults.S_OK; | |
| try | |
| { |
| void SetDebuggerInfoBits(ModuleHandle handle, uint newBits) | ||
| { | ||
| uint currentFlags = // read Module::Flags (uint32) at handle.Address + Flags offset | ||
| uint updated = (currentFlags & ~DebuggerInfoMask) | (newBits << DebuggerInfoShift); |
There was a problem hiding this comment.
The SetDebuggerInfoBits pseudocode writes (newBits << DebuggerInfoShift) without masking to the available bit-range, but the contract implementation masks newBits to (DebuggerInfoMask >> DebuggerInfoShift) before shifting. Please update the documentation snippet to reflect the masking behavior so callers don’t assume higher bits will be preserved/written.
| uint updated = (currentFlags & ~DebuggerInfoMask) | (newBits << DebuggerInfoShift); | |
| uint updated = (currentFlags & ~DebuggerInfoMask) | ((newBits & (DebuggerInfoMask >> DebuggerInfoShift)) << DebuggerInfoShift); |
Summary
Implement
SetJITCompilerFlagsonIXCLRDataModule2in the cDAC. Changes
SetJITCompilerFlagsimplementation