Skip to content

Remove development-only contract versions - #131790

Merged
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset
Aug 5, 2026
Merged

Remove development-only contract versions#131790
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset

Conversation

@noahfalk

@noahfalknoahfalk commented Aug 4, 2026

Copy link
Copy Markdown
Member

While developing data contracts we've mostly been making in-place breaking changes on v1 contracts but for a few we added multiple versions before our development time versioning policy was decided on. As preparation to lock down contracts we are simplifying by getting rid of contract versions that only existed during unsupported development builds. A follow up PR will renumber all the contract versions to 1 (except StressLog where both contract versions already have use from the StressLogAnalyzer tool). We don't expect to do any renumbering similar to this in the future as the versioning rules will be active even during development.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 5 pipeline(s).
11 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates (“squashes”) several cDAC CoreCLR contract version lines back down to c1 by removing intermediate development-only versions and moving the latest semantics into the remaining c1 implementations, along with corresponding test and documentation updates.

Changes:

  • Remove c2/c3 registrations and implementations for several contracts (e.g., PrecodeStubs, DebugInfo, ExecutionManager, StressLog) and keep a single c1 implementation.
  • Update CoreCLR/NativeAOT data descriptor contract version declarations to match the squashed numbering.
  • Update unit/integration tests and design docs to reflect the new single-version contract surface.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tools/CdacUsageGraph/tests/CdacUsageGraph.Tests/UsageWalkerIntegrationTests.csUpdates usage-walker expectations to target c1 only and assert interpreter-precode reachability under c1.
src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.csCollapses tests to c1 only and adjusts mock descriptors/stub encoding for the new single-version PrecodeStubs behavior.
src/native/managed/cdac/tests/UnitTests/MockDescriptors/MockDescriptors.ExecutionManager.csRemoves c2 nibble map builder selection.
src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.csRemoves “all versions” iteration; now tests only c1.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTests.csSwitches test to NibbleMapTestBuilder_1 to match new c1 algorithm selection.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTestBuilder.csRemoves NibbleMapTestBuilder_2 and updates _1 to implement constant-lookup nibble map behavior.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.csRemoves c2 coverage; now tests only c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StubPrecodeData.csRemoves the _2 data shape and standardizes StubPrecodeData_1 to use SecretParam + Type.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/CoreCLRContracts.csRemoves c2/c3 contract registrations; registers only c1 for the squashed contracts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.csRemoves the old “small” reader path and makes StressLog_1 use the newer message encoding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.csDeletes the c3 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_1.csMoves the newer precode detection/interpreter support behavior into c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csSwitches c1 to the constant-lookup nibble map algorithm.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.csMoves the newer debug-info decoding (fat header, vars, async info, 3-bit source flags) into c1.
src/coreclr/vm/datadescriptor/datadescriptor.incRenumbers several CDAC_GLOBAL_CONTRACT(..., c*) declarations down to c1.
src/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.incRenumbers StressLog contract reference from c2 to c1 for NativeAOT descriptors.
docs/design/datacontracts/StressLog.mdRemoves the old version split and documents the remaining c1 semantics.
docs/design/datacontracts/PrecodeStubs.mdRemoves multi-version diffs and updates the single c1 doc.
docs/design/datacontracts/ExecutionManager.mdUpdates nibble map documentation to the constant-time lookup algorithm under c1.
docs/design/datacontracts/DebugInfo.mdCollapses versioned documentation to a single c1 spec matching the newer encoding/decoding.
docs/design/datacontracts/data-descriptor-meanings.jsonRemoves version-specific wording and aligns meanings with the squashed contract versions.

Comment threaddocs/design/datacontracts/PrecodeStubs.md
Comment threadsrc/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs
Comment threadsrc/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.inc Outdated

@max-charlambmax-charlamb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

Comment threaddocs/design/datacontracts/DebugInfo.md
CopilotAI review requested due to automatic review settings August 5, 2026 00:06
@noahfalk

Copy link
Copy Markdown
MemberAuthor

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

PR is updated to only do the contract removal without the renumbering.

@noahfalknoahfalk changed the title Squash data contract versionsRemove development-only contract versionsAug 5, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 27 out of 27 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:28

  • ThisPtrRetBufPrecode_GetMethodDesc repeats the stub-data address calculation; using GetStubPrecodeData here keeps all stub-precode-data reads consistent and avoids duplication.
 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:15

  • StubPrecode_GetMethodDesc duplicates the stub-data address computation that's already encapsulated in GetStubPrecodeData (used by TryGetKnownPrecodeType). Using the helper here reduces duplication and keeps the address calculation consistent if it ever changes.

This issue also appears on line 27 of the same file.

 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);
return stubPrecodeData.SecretParam;

@noahfalk
noahfalk enabled auto-merge (squash) August 5, 2026 00:20
CopilotAI review requested due to automatic review settings August 5, 2026 05:18
While developing data contracts we've mostly been making in-place breaking changes on v1
contracts but for a few we added multiple versions before our development time versioning
policy was decided on. As preparation to lock down contracts we are simplifying by getting
rid of contract versions that only existed during unsupported development builds. Going
forward we don't expect a numbering reset like this to happen again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ab1b53f7-74ef-44f9-8bdc-95691a2f5138
@noahfalk
noahfalkforce-pushed the feature/cdac-contract-version-reset branch from 9d99cb6 to b5788d1CompareAugust 5, 2026 05:22

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.cs:23

  • StdArchAllVersions() no longer returns “all versions” (it always yields only "c2"), which makes the name misleading and harder to understand when reading the test matrix. Consider renaming it (and all MemberData references) to reflect the single supported version.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.cs:920

  • StdArchAllVersions() now yields only "c2". The helper name implies a version cross-product, but the data set is now single-version, which can confuse future edits (e.g., adding c3 would require revisiting this). Rename the helper and update the MemberData references accordingly.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

CopilotAI review requested due to automatic review settings August 5, 2026 05:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs:192

  • The mocked PrecodeMachineDescriptor layout here doesn’t match the actual CoreCLR layout (e.g., src/coreclr/vm/precode.h includes FixupPrecodeType, FixupCodeOffset, fixed-size FixupBytes/StubBytes arrays, and places ThisPointerRetBufPrecodeType/InterpreterPrecodeType after those arrays). With c1/c2 removed, this test setup can produce field offsets that don’t reflect real targets, so the contract can appear correct under test while reading the wrong offsets on real dumps.

Consider updating the mock Target.TypeInfo layouts in this method to mirror the data-descriptor/native struct layouts (including “unused” intermediate fields and realistic fixed array sizes), so offsets for fields the contract reads are representative.

 layout = targetTestHelpers.LayoutFields([
new(nameof(Data.PrecodeMachineDescriptor.StubCodePageSize), DataType.uint32),
new(nameof(Data.PrecodeMachineDescriptor.InvalidPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.StubPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.ThisPointerRetBufPrecodeType), DataType.uint8),

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/ba-g build monitor is having issues

@noahfalk
noahfalk merged commit c36f112 into dotnet:mainAug 5, 2026
73 of 75 checks passed
noahfalk added a commit that referenced this pull request Aug 6, 2026
Follow up to #131790 to renumber
the contracts starting from 1.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-rc1 milestone Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@noahfalk@hoyosjs@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Remove development-only contract versions by noahfalk · Pull Request #131790 · dotnet/runtime · GitHub
Skip to content

Remove development-only contract versions - #131790

Merged
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset
Aug 5, 2026
Merged

Remove development-only contract versions#131790
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset

Conversation

@noahfalk

@noahfalknoahfalk commented Aug 4, 2026

Copy link
Copy Markdown
Member

While developing data contracts we've mostly been making in-place breaking changes on v1 contracts but for a few we added multiple versions before our development time versioning policy was decided on. As preparation to lock down contracts we are simplifying by getting rid of contract versions that only existed during unsupported development builds. A follow up PR will renumber all the contract versions to 1 (except StressLog where both contract versions already have use from the StressLogAnalyzer tool). We don't expect to do any renumbering similar to this in the future as the versioning rules will be active even during development.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 5 pipeline(s).
11 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates (“squashes”) several cDAC CoreCLR contract version lines back down to c1 by removing intermediate development-only versions and moving the latest semantics into the remaining c1 implementations, along with corresponding test and documentation updates.

Changes:

  • Remove c2/c3 registrations and implementations for several contracts (e.g., PrecodeStubs, DebugInfo, ExecutionManager, StressLog) and keep a single c1 implementation.
  • Update CoreCLR/NativeAOT data descriptor contract version declarations to match the squashed numbering.
  • Update unit/integration tests and design docs to reflect the new single-version contract surface.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tools/CdacUsageGraph/tests/CdacUsageGraph.Tests/UsageWalkerIntegrationTests.csUpdates usage-walker expectations to target c1 only and assert interpreter-precode reachability under c1.
src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.csCollapses tests to c1 only and adjusts mock descriptors/stub encoding for the new single-version PrecodeStubs behavior.
src/native/managed/cdac/tests/UnitTests/MockDescriptors/MockDescriptors.ExecutionManager.csRemoves c2 nibble map builder selection.
src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.csRemoves “all versions” iteration; now tests only c1.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTests.csSwitches test to NibbleMapTestBuilder_1 to match new c1 algorithm selection.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTestBuilder.csRemoves NibbleMapTestBuilder_2 and updates _1 to implement constant-lookup nibble map behavior.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.csRemoves c2 coverage; now tests only c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StubPrecodeData.csRemoves the _2 data shape and standardizes StubPrecodeData_1 to use SecretParam + Type.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/CoreCLRContracts.csRemoves c2/c3 contract registrations; registers only c1 for the squashed contracts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.csRemoves the old “small” reader path and makes StressLog_1 use the newer message encoding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.csDeletes the c3 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_1.csMoves the newer precode detection/interpreter support behavior into c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csSwitches c1 to the constant-lookup nibble map algorithm.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.csMoves the newer debug-info decoding (fat header, vars, async info, 3-bit source flags) into c1.
src/coreclr/vm/datadescriptor/datadescriptor.incRenumbers several CDAC_GLOBAL_CONTRACT(..., c*) declarations down to c1.
src/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.incRenumbers StressLog contract reference from c2 to c1 for NativeAOT descriptors.
docs/design/datacontracts/StressLog.mdRemoves the old version split and documents the remaining c1 semantics.
docs/design/datacontracts/PrecodeStubs.mdRemoves multi-version diffs and updates the single c1 doc.
docs/design/datacontracts/ExecutionManager.mdUpdates nibble map documentation to the constant-time lookup algorithm under c1.
docs/design/datacontracts/DebugInfo.mdCollapses versioned documentation to a single c1 spec matching the newer encoding/decoding.
docs/design/datacontracts/data-descriptor-meanings.jsonRemoves version-specific wording and aligns meanings with the squashed contract versions.

Comment threaddocs/design/datacontracts/PrecodeStubs.md
Comment threadsrc/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs
Comment threadsrc/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.inc Outdated

@max-charlambmax-charlamb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

Comment threaddocs/design/datacontracts/DebugInfo.md
CopilotAI review requested due to automatic review settings August 5, 2026 00:06
@noahfalk

Copy link
Copy Markdown
MemberAuthor

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

PR is updated to only do the contract removal without the renumbering.

@noahfalknoahfalk changed the title Squash data contract versionsRemove development-only contract versionsAug 5, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 27 out of 27 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:28

  • ThisPtrRetBufPrecode_GetMethodDesc repeats the stub-data address calculation; using GetStubPrecodeData here keeps all stub-precode-data reads consistent and avoids duplication.
 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:15

  • StubPrecode_GetMethodDesc duplicates the stub-data address computation that's already encapsulated in GetStubPrecodeData (used by TryGetKnownPrecodeType). Using the helper here reduces duplication and keeps the address calculation consistent if it ever changes.

This issue also appears on line 27 of the same file.

 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);
return stubPrecodeData.SecretParam;

@noahfalk
noahfalk enabled auto-merge (squash) August 5, 2026 00:20
CopilotAI review requested due to automatic review settings August 5, 2026 05:18
While developing data contracts we've mostly been making in-place breaking changes on v1
contracts but for a few we added multiple versions before our development time versioning
policy was decided on. As preparation to lock down contracts we are simplifying by getting
rid of contract versions that only existed during unsupported development builds. Going
forward we don't expect a numbering reset like this to happen again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ab1b53f7-74ef-44f9-8bdc-95691a2f5138
@noahfalk
noahfalkforce-pushed the feature/cdac-contract-version-reset branch from 9d99cb6 to b5788d1CompareAugust 5, 2026 05:22

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.cs:23

  • StdArchAllVersions() no longer returns “all versions” (it always yields only "c2"), which makes the name misleading and harder to understand when reading the test matrix. Consider renaming it (and all MemberData references) to reflect the single supported version.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.cs:920

  • StdArchAllVersions() now yields only "c2". The helper name implies a version cross-product, but the data set is now single-version, which can confuse future edits (e.g., adding c3 would require revisiting this). Rename the helper and update the MemberData references accordingly.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

CopilotAI review requested due to automatic review settings August 5, 2026 05:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs:192

  • The mocked PrecodeMachineDescriptor layout here doesn’t match the actual CoreCLR layout (e.g., src/coreclr/vm/precode.h includes FixupPrecodeType, FixupCodeOffset, fixed-size FixupBytes/StubBytes arrays, and places ThisPointerRetBufPrecodeType/InterpreterPrecodeType after those arrays). With c1/c2 removed, this test setup can produce field offsets that don’t reflect real targets, so the contract can appear correct under test while reading the wrong offsets on real dumps.

Consider updating the mock Target.TypeInfo layouts in this method to mirror the data-descriptor/native struct layouts (including “unused” intermediate fields and realistic fixed array sizes), so offsets for fields the contract reads are representative.

 layout = targetTestHelpers.LayoutFields([
new(nameof(Data.PrecodeMachineDescriptor.StubCodePageSize), DataType.uint32),
new(nameof(Data.PrecodeMachineDescriptor.InvalidPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.StubPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.ThisPointerRetBufPrecodeType), DataType.uint8),

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/ba-g build monitor is having issues

@noahfalk
noahfalk merged commit c36f112 into dotnet:mainAug 5, 2026
73 of 75 checks passed
noahfalk added a commit that referenced this pull request Aug 6, 2026
Follow up to #131790 to renumber
the contracts starting from 1.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-rc1 milestone Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@noahfalk@hoyosjs@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Remove development-only contract versions by noahfalk · Pull Request #131790 · dotnet/runtime · GitHub
Skip to content

Remove development-only contract versions - #131790

Merged
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset
Aug 5, 2026
Merged

Remove development-only contract versions#131790
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset

Conversation

@noahfalk

@noahfalknoahfalk commented Aug 4, 2026

Copy link
Copy Markdown
Member

While developing data contracts we've mostly been making in-place breaking changes on v1 contracts but for a few we added multiple versions before our development time versioning policy was decided on. As preparation to lock down contracts we are simplifying by getting rid of contract versions that only existed during unsupported development builds. A follow up PR will renumber all the contract versions to 1 (except StressLog where both contract versions already have use from the StressLogAnalyzer tool). We don't expect to do any renumbering similar to this in the future as the versioning rules will be active even during development.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 5 pipeline(s).
11 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates (“squashes”) several cDAC CoreCLR contract version lines back down to c1 by removing intermediate development-only versions and moving the latest semantics into the remaining c1 implementations, along with corresponding test and documentation updates.

Changes:

  • Remove c2/c3 registrations and implementations for several contracts (e.g., PrecodeStubs, DebugInfo, ExecutionManager, StressLog) and keep a single c1 implementation.
  • Update CoreCLR/NativeAOT data descriptor contract version declarations to match the squashed numbering.
  • Update unit/integration tests and design docs to reflect the new single-version contract surface.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tools/CdacUsageGraph/tests/CdacUsageGraph.Tests/UsageWalkerIntegrationTests.csUpdates usage-walker expectations to target c1 only and assert interpreter-precode reachability under c1.
src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.csCollapses tests to c1 only and adjusts mock descriptors/stub encoding for the new single-version PrecodeStubs behavior.
src/native/managed/cdac/tests/UnitTests/MockDescriptors/MockDescriptors.ExecutionManager.csRemoves c2 nibble map builder selection.
src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.csRemoves “all versions” iteration; now tests only c1.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTests.csSwitches test to NibbleMapTestBuilder_1 to match new c1 algorithm selection.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTestBuilder.csRemoves NibbleMapTestBuilder_2 and updates _1 to implement constant-lookup nibble map behavior.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.csRemoves c2 coverage; now tests only c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StubPrecodeData.csRemoves the _2 data shape and standardizes StubPrecodeData_1 to use SecretParam + Type.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/CoreCLRContracts.csRemoves c2/c3 contract registrations; registers only c1 for the squashed contracts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.csRemoves the old “small” reader path and makes StressLog_1 use the newer message encoding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.csDeletes the c3 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_1.csMoves the newer precode detection/interpreter support behavior into c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csSwitches c1 to the constant-lookup nibble map algorithm.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.csMoves the newer debug-info decoding (fat header, vars, async info, 3-bit source flags) into c1.
src/coreclr/vm/datadescriptor/datadescriptor.incRenumbers several CDAC_GLOBAL_CONTRACT(..., c*) declarations down to c1.
src/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.incRenumbers StressLog contract reference from c2 to c1 for NativeAOT descriptors.
docs/design/datacontracts/StressLog.mdRemoves the old version split and documents the remaining c1 semantics.
docs/design/datacontracts/PrecodeStubs.mdRemoves multi-version diffs and updates the single c1 doc.
docs/design/datacontracts/ExecutionManager.mdUpdates nibble map documentation to the constant-time lookup algorithm under c1.
docs/design/datacontracts/DebugInfo.mdCollapses versioned documentation to a single c1 spec matching the newer encoding/decoding.
docs/design/datacontracts/data-descriptor-meanings.jsonRemoves version-specific wording and aligns meanings with the squashed contract versions.

Comment threaddocs/design/datacontracts/PrecodeStubs.md
Comment threadsrc/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs
Comment threadsrc/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.inc Outdated

@max-charlambmax-charlamb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

Comment threaddocs/design/datacontracts/DebugInfo.md
CopilotAI review requested due to automatic review settings August 5, 2026 00:06
@noahfalk

Copy link
Copy Markdown
MemberAuthor

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

PR is updated to only do the contract removal without the renumbering.

@noahfalknoahfalk changed the title Squash data contract versionsRemove development-only contract versionsAug 5, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 27 out of 27 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:28

  • ThisPtrRetBufPrecode_GetMethodDesc repeats the stub-data address calculation; using GetStubPrecodeData here keeps all stub-precode-data reads consistent and avoids duplication.
 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:15

  • StubPrecode_GetMethodDesc duplicates the stub-data address computation that's already encapsulated in GetStubPrecodeData (used by TryGetKnownPrecodeType). Using the helper here reduces duplication and keeps the address calculation consistent if it ever changes.

This issue also appears on line 27 of the same file.

 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);
return stubPrecodeData.SecretParam;

@noahfalk
noahfalk enabled auto-merge (squash) August 5, 2026 00:20
CopilotAI review requested due to automatic review settings August 5, 2026 05:18
While developing data contracts we've mostly been making in-place breaking changes on v1
contracts but for a few we added multiple versions before our development time versioning
policy was decided on. As preparation to lock down contracts we are simplifying by getting
rid of contract versions that only existed during unsupported development builds. Going
forward we don't expect a numbering reset like this to happen again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ab1b53f7-74ef-44f9-8bdc-95691a2f5138
@noahfalk
noahfalkforce-pushed the feature/cdac-contract-version-reset branch from 9d99cb6 to b5788d1CompareAugust 5, 2026 05:22

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.cs:23

  • StdArchAllVersions() no longer returns “all versions” (it always yields only "c2"), which makes the name misleading and harder to understand when reading the test matrix. Consider renaming it (and all MemberData references) to reflect the single supported version.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.cs:920

  • StdArchAllVersions() now yields only "c2". The helper name implies a version cross-product, but the data set is now single-version, which can confuse future edits (e.g., adding c3 would require revisiting this). Rename the helper and update the MemberData references accordingly.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

CopilotAI review requested due to automatic review settings August 5, 2026 05:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs:192

  • The mocked PrecodeMachineDescriptor layout here doesn’t match the actual CoreCLR layout (e.g., src/coreclr/vm/precode.h includes FixupPrecodeType, FixupCodeOffset, fixed-size FixupBytes/StubBytes arrays, and places ThisPointerRetBufPrecodeType/InterpreterPrecodeType after those arrays). With c1/c2 removed, this test setup can produce field offsets that don’t reflect real targets, so the contract can appear correct under test while reading the wrong offsets on real dumps.

Consider updating the mock Target.TypeInfo layouts in this method to mirror the data-descriptor/native struct layouts (including “unused” intermediate fields and realistic fixed array sizes), so offsets for fields the contract reads are representative.

 layout = targetTestHelpers.LayoutFields([
new(nameof(Data.PrecodeMachineDescriptor.StubCodePageSize), DataType.uint32),
new(nameof(Data.PrecodeMachineDescriptor.InvalidPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.StubPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.ThisPointerRetBufPrecodeType), DataType.uint8),

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/ba-g build monitor is having issues

@noahfalk
noahfalk merged commit c36f112 into dotnet:mainAug 5, 2026
73 of 75 checks passed
noahfalk added a commit that referenced this pull request Aug 6, 2026
Follow up to #131790 to renumber
the contracts starting from 1.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-rc1 milestone Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@noahfalk@hoyosjs@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Remove development-only contract versions by noahfalk · Pull Request #131790 · dotnet/runtime · GitHub
Skip to content

Remove development-only contract versions - #131790

Merged
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset
Aug 5, 2026
Merged

Remove development-only contract versions#131790
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset

Conversation

@noahfalk

@noahfalknoahfalk commented Aug 4, 2026

Copy link
Copy Markdown
Member

While developing data contracts we've mostly been making in-place breaking changes on v1 contracts but for a few we added multiple versions before our development time versioning policy was decided on. As preparation to lock down contracts we are simplifying by getting rid of contract versions that only existed during unsupported development builds. A follow up PR will renumber all the contract versions to 1 (except StressLog where both contract versions already have use from the StressLogAnalyzer tool). We don't expect to do any renumbering similar to this in the future as the versioning rules will be active even during development.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 5 pipeline(s).
11 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates (“squashes”) several cDAC CoreCLR contract version lines back down to c1 by removing intermediate development-only versions and moving the latest semantics into the remaining c1 implementations, along with corresponding test and documentation updates.

Changes:

  • Remove c2/c3 registrations and implementations for several contracts (e.g., PrecodeStubs, DebugInfo, ExecutionManager, StressLog) and keep a single c1 implementation.
  • Update CoreCLR/NativeAOT data descriptor contract version declarations to match the squashed numbering.
  • Update unit/integration tests and design docs to reflect the new single-version contract surface.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tools/CdacUsageGraph/tests/CdacUsageGraph.Tests/UsageWalkerIntegrationTests.csUpdates usage-walker expectations to target c1 only and assert interpreter-precode reachability under c1.
src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.csCollapses tests to c1 only and adjusts mock descriptors/stub encoding for the new single-version PrecodeStubs behavior.
src/native/managed/cdac/tests/UnitTests/MockDescriptors/MockDescriptors.ExecutionManager.csRemoves c2 nibble map builder selection.
src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.csRemoves “all versions” iteration; now tests only c1.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTests.csSwitches test to NibbleMapTestBuilder_1 to match new c1 algorithm selection.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTestBuilder.csRemoves NibbleMapTestBuilder_2 and updates _1 to implement constant-lookup nibble map behavior.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.csRemoves c2 coverage; now tests only c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StubPrecodeData.csRemoves the _2 data shape and standardizes StubPrecodeData_1 to use SecretParam + Type.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/CoreCLRContracts.csRemoves c2/c3 contract registrations; registers only c1 for the squashed contracts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.csRemoves the old “small” reader path and makes StressLog_1 use the newer message encoding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.csDeletes the c3 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_1.csMoves the newer precode detection/interpreter support behavior into c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csSwitches c1 to the constant-lookup nibble map algorithm.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.csMoves the newer debug-info decoding (fat header, vars, async info, 3-bit source flags) into c1.
src/coreclr/vm/datadescriptor/datadescriptor.incRenumbers several CDAC_GLOBAL_CONTRACT(..., c*) declarations down to c1.
src/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.incRenumbers StressLog contract reference from c2 to c1 for NativeAOT descriptors.
docs/design/datacontracts/StressLog.mdRemoves the old version split and documents the remaining c1 semantics.
docs/design/datacontracts/PrecodeStubs.mdRemoves multi-version diffs and updates the single c1 doc.
docs/design/datacontracts/ExecutionManager.mdUpdates nibble map documentation to the constant-time lookup algorithm under c1.
docs/design/datacontracts/DebugInfo.mdCollapses versioned documentation to a single c1 spec matching the newer encoding/decoding.
docs/design/datacontracts/data-descriptor-meanings.jsonRemoves version-specific wording and aligns meanings with the squashed contract versions.

Comment threaddocs/design/datacontracts/PrecodeStubs.md
Comment threadsrc/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs
Comment threadsrc/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.inc Outdated

@max-charlambmax-charlamb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

Comment threaddocs/design/datacontracts/DebugInfo.md
CopilotAI review requested due to automatic review settings August 5, 2026 00:06
@noahfalk

Copy link
Copy Markdown
MemberAuthor

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

PR is updated to only do the contract removal without the renumbering.

@noahfalknoahfalk changed the title Squash data contract versionsRemove development-only contract versionsAug 5, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 27 out of 27 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:28

  • ThisPtrRetBufPrecode_GetMethodDesc repeats the stub-data address calculation; using GetStubPrecodeData here keeps all stub-precode-data reads consistent and avoids duplication.
 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:15

  • StubPrecode_GetMethodDesc duplicates the stub-data address computation that's already encapsulated in GetStubPrecodeData (used by TryGetKnownPrecodeType). Using the helper here reduces duplication and keeps the address calculation consistent if it ever changes.

This issue also appears on line 27 of the same file.

 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);
return stubPrecodeData.SecretParam;

@noahfalk
noahfalk enabled auto-merge (squash) August 5, 2026 00:20
CopilotAI review requested due to automatic review settings August 5, 2026 05:18
While developing data contracts we've mostly been making in-place breaking changes on v1
contracts but for a few we added multiple versions before our development time versioning
policy was decided on. As preparation to lock down contracts we are simplifying by getting
rid of contract versions that only existed during unsupported development builds. Going
forward we don't expect a numbering reset like this to happen again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ab1b53f7-74ef-44f9-8bdc-95691a2f5138
@noahfalk
noahfalkforce-pushed the feature/cdac-contract-version-reset branch from 9d99cb6 to b5788d1CompareAugust 5, 2026 05:22

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.cs:23

  • StdArchAllVersions() no longer returns “all versions” (it always yields only "c2"), which makes the name misleading and harder to understand when reading the test matrix. Consider renaming it (and all MemberData references) to reflect the single supported version.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.cs:920

  • StdArchAllVersions() now yields only "c2". The helper name implies a version cross-product, but the data set is now single-version, which can confuse future edits (e.g., adding c3 would require revisiting this). Rename the helper and update the MemberData references accordingly.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

CopilotAI review requested due to automatic review settings August 5, 2026 05:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs:192

  • The mocked PrecodeMachineDescriptor layout here doesn’t match the actual CoreCLR layout (e.g., src/coreclr/vm/precode.h includes FixupPrecodeType, FixupCodeOffset, fixed-size FixupBytes/StubBytes arrays, and places ThisPointerRetBufPrecodeType/InterpreterPrecodeType after those arrays). With c1/c2 removed, this test setup can produce field offsets that don’t reflect real targets, so the contract can appear correct under test while reading the wrong offsets on real dumps.

Consider updating the mock Target.TypeInfo layouts in this method to mirror the data-descriptor/native struct layouts (including “unused” intermediate fields and realistic fixed array sizes), so offsets for fields the contract reads are representative.

 layout = targetTestHelpers.LayoutFields([
new(nameof(Data.PrecodeMachineDescriptor.StubCodePageSize), DataType.uint32),
new(nameof(Data.PrecodeMachineDescriptor.InvalidPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.StubPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.ThisPointerRetBufPrecodeType), DataType.uint8),

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/ba-g build monitor is having issues

@noahfalk
noahfalk merged commit c36f112 into dotnet:mainAug 5, 2026
73 of 75 checks passed
noahfalk added a commit that referenced this pull request Aug 6, 2026
Follow up to #131790 to renumber
the contracts starting from 1.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-rc1 milestone Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@noahfalk@hoyosjs@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' Remove development-only contract versions by noahfalk · Pull Request #131790 · dotnet/runtime · GitHub
Skip to content

Remove development-only contract versions - #131790

Merged
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset
Aug 5, 2026
Merged

Remove development-only contract versions#131790
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset

Conversation

@noahfalk

@noahfalknoahfalk commented Aug 4, 2026

Copy link
Copy Markdown
Member

While developing data contracts we've mostly been making in-place breaking changes on v1 contracts but for a few we added multiple versions before our development time versioning policy was decided on. As preparation to lock down contracts we are simplifying by getting rid of contract versions that only existed during unsupported development builds. A follow up PR will renumber all the contract versions to 1 (except StressLog where both contract versions already have use from the StressLogAnalyzer tool). We don't expect to do any renumbering similar to this in the future as the versioning rules will be active even during development.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 5 pipeline(s).
11 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates (“squashes”) several cDAC CoreCLR contract version lines back down to c1 by removing intermediate development-only versions and moving the latest semantics into the remaining c1 implementations, along with corresponding test and documentation updates.

Changes:

  • Remove c2/c3 registrations and implementations for several contracts (e.g., PrecodeStubs, DebugInfo, ExecutionManager, StressLog) and keep a single c1 implementation.
  • Update CoreCLR/NativeAOT data descriptor contract version declarations to match the squashed numbering.
  • Update unit/integration tests and design docs to reflect the new single-version contract surface.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tools/CdacUsageGraph/tests/CdacUsageGraph.Tests/UsageWalkerIntegrationTests.csUpdates usage-walker expectations to target c1 only and assert interpreter-precode reachability under c1.
src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.csCollapses tests to c1 only and adjusts mock descriptors/stub encoding for the new single-version PrecodeStubs behavior.
src/native/managed/cdac/tests/UnitTests/MockDescriptors/MockDescriptors.ExecutionManager.csRemoves c2 nibble map builder selection.
src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.csRemoves “all versions” iteration; now tests only c1.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTests.csSwitches test to NibbleMapTestBuilder_1 to match new c1 algorithm selection.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTestBuilder.csRemoves NibbleMapTestBuilder_2 and updates _1 to implement constant-lookup nibble map behavior.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.csRemoves c2 coverage; now tests only c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StubPrecodeData.csRemoves the _2 data shape and standardizes StubPrecodeData_1 to use SecretParam + Type.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/CoreCLRContracts.csRemoves c2/c3 contract registrations; registers only c1 for the squashed contracts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.csRemoves the old “small” reader path and makes StressLog_1 use the newer message encoding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.csDeletes the c3 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_1.csMoves the newer precode detection/interpreter support behavior into c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csSwitches c1 to the constant-lookup nibble map algorithm.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.csMoves the newer debug-info decoding (fat header, vars, async info, 3-bit source flags) into c1.
src/coreclr/vm/datadescriptor/datadescriptor.incRenumbers several CDAC_GLOBAL_CONTRACT(..., c*) declarations down to c1.
src/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.incRenumbers StressLog contract reference from c2 to c1 for NativeAOT descriptors.
docs/design/datacontracts/StressLog.mdRemoves the old version split and documents the remaining c1 semantics.
docs/design/datacontracts/PrecodeStubs.mdRemoves multi-version diffs and updates the single c1 doc.
docs/design/datacontracts/ExecutionManager.mdUpdates nibble map documentation to the constant-time lookup algorithm under c1.
docs/design/datacontracts/DebugInfo.mdCollapses versioned documentation to a single c1 spec matching the newer encoding/decoding.
docs/design/datacontracts/data-descriptor-meanings.jsonRemoves version-specific wording and aligns meanings with the squashed contract versions.

Comment threaddocs/design/datacontracts/PrecodeStubs.md
Comment threadsrc/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs
Comment threadsrc/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.inc Outdated

@max-charlambmax-charlamb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

Comment threaddocs/design/datacontracts/DebugInfo.md
CopilotAI review requested due to automatic review settings August 5, 2026 00:06
@noahfalk

Copy link
Copy Markdown
MemberAuthor

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

PR is updated to only do the contract removal without the renumbering.

@noahfalknoahfalk changed the title Squash data contract versionsRemove development-only contract versionsAug 5, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 27 out of 27 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:28

  • ThisPtrRetBufPrecode_GetMethodDesc repeats the stub-data address calculation; using GetStubPrecodeData here keeps all stub-precode-data reads consistent and avoids duplication.
 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:15

  • StubPrecode_GetMethodDesc duplicates the stub-data address computation that's already encapsulated in GetStubPrecodeData (used by TryGetKnownPrecodeType). Using the helper here reduces duplication and keeps the address calculation consistent if it ever changes.

This issue also appears on line 27 of the same file.

 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);
return stubPrecodeData.SecretParam;

@noahfalk
noahfalk enabled auto-merge (squash) August 5, 2026 00:20
CopilotAI review requested due to automatic review settings August 5, 2026 05:18
While developing data contracts we've mostly been making in-place breaking changes on v1
contracts but for a few we added multiple versions before our development time versioning
policy was decided on. As preparation to lock down contracts we are simplifying by getting
rid of contract versions that only existed during unsupported development builds. Going
forward we don't expect a numbering reset like this to happen again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ab1b53f7-74ef-44f9-8bdc-95691a2f5138
@noahfalk
noahfalkforce-pushed the feature/cdac-contract-version-reset branch from 9d99cb6 to b5788d1CompareAugust 5, 2026 05:22

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.cs:23

  • StdArchAllVersions() no longer returns “all versions” (it always yields only "c2"), which makes the name misleading and harder to understand when reading the test matrix. Consider renaming it (and all MemberData references) to reflect the single supported version.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.cs:920

  • StdArchAllVersions() now yields only "c2". The helper name implies a version cross-product, but the data set is now single-version, which can confuse future edits (e.g., adding c3 would require revisiting this). Rename the helper and update the MemberData references accordingly.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

CopilotAI review requested due to automatic review settings August 5, 2026 05:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs:192

  • The mocked PrecodeMachineDescriptor layout here doesn’t match the actual CoreCLR layout (e.g., src/coreclr/vm/precode.h includes FixupPrecodeType, FixupCodeOffset, fixed-size FixupBytes/StubBytes arrays, and places ThisPointerRetBufPrecodeType/InterpreterPrecodeType after those arrays). With c1/c2 removed, this test setup can produce field offsets that don’t reflect real targets, so the contract can appear correct under test while reading the wrong offsets on real dumps.

Consider updating the mock Target.TypeInfo layouts in this method to mirror the data-descriptor/native struct layouts (including “unused” intermediate fields and realistic fixed array sizes), so offsets for fields the contract reads are representative.

 layout = targetTestHelpers.LayoutFields([
new(nameof(Data.PrecodeMachineDescriptor.StubCodePageSize), DataType.uint32),
new(nameof(Data.PrecodeMachineDescriptor.InvalidPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.StubPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.ThisPointerRetBufPrecodeType), DataType.uint8),

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/ba-g build monitor is having issues

@noahfalk
noahfalk merged commit c36f112 into dotnet:mainAug 5, 2026
73 of 75 checks passed
noahfalk added a commit that referenced this pull request Aug 6, 2026
Follow up to #131790 to renumber
the contracts starting from 1.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-rc1 milestone Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@noahfalk@hoyosjs@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Remove development-only contract versions by noahfalk · Pull Request #131790 · dotnet/runtime · GitHub
Skip to content

Remove development-only contract versions - #131790

Merged
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset
Aug 5, 2026
Merged

Remove development-only contract versions#131790
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset

Conversation

@noahfalk

@noahfalknoahfalk commented Aug 4, 2026

Copy link
Copy Markdown
Member

While developing data contracts we've mostly been making in-place breaking changes on v1 contracts but for a few we added multiple versions before our development time versioning policy was decided on. As preparation to lock down contracts we are simplifying by getting rid of contract versions that only existed during unsupported development builds. A follow up PR will renumber all the contract versions to 1 (except StressLog where both contract versions already have use from the StressLogAnalyzer tool). We don't expect to do any renumbering similar to this in the future as the versioning rules will be active even during development.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 5 pipeline(s).
11 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates (“squashes”) several cDAC CoreCLR contract version lines back down to c1 by removing intermediate development-only versions and moving the latest semantics into the remaining c1 implementations, along with corresponding test and documentation updates.

Changes:

  • Remove c2/c3 registrations and implementations for several contracts (e.g., PrecodeStubs, DebugInfo, ExecutionManager, StressLog) and keep a single c1 implementation.
  • Update CoreCLR/NativeAOT data descriptor contract version declarations to match the squashed numbering.
  • Update unit/integration tests and design docs to reflect the new single-version contract surface.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tools/CdacUsageGraph/tests/CdacUsageGraph.Tests/UsageWalkerIntegrationTests.csUpdates usage-walker expectations to target c1 only and assert interpreter-precode reachability under c1.
src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.csCollapses tests to c1 only and adjusts mock descriptors/stub encoding for the new single-version PrecodeStubs behavior.
src/native/managed/cdac/tests/UnitTests/MockDescriptors/MockDescriptors.ExecutionManager.csRemoves c2 nibble map builder selection.
src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.csRemoves “all versions” iteration; now tests only c1.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTests.csSwitches test to NibbleMapTestBuilder_1 to match new c1 algorithm selection.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTestBuilder.csRemoves NibbleMapTestBuilder_2 and updates _1 to implement constant-lookup nibble map behavior.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.csRemoves c2 coverage; now tests only c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StubPrecodeData.csRemoves the _2 data shape and standardizes StubPrecodeData_1 to use SecretParam + Type.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/CoreCLRContracts.csRemoves c2/c3 contract registrations; registers only c1 for the squashed contracts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.csRemoves the old “small” reader path and makes StressLog_1 use the newer message encoding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.csDeletes the c3 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_1.csMoves the newer precode detection/interpreter support behavior into c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csSwitches c1 to the constant-lookup nibble map algorithm.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.csMoves the newer debug-info decoding (fat header, vars, async info, 3-bit source flags) into c1.
src/coreclr/vm/datadescriptor/datadescriptor.incRenumbers several CDAC_GLOBAL_CONTRACT(..., c*) declarations down to c1.
src/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.incRenumbers StressLog contract reference from c2 to c1 for NativeAOT descriptors.
docs/design/datacontracts/StressLog.mdRemoves the old version split and documents the remaining c1 semantics.
docs/design/datacontracts/PrecodeStubs.mdRemoves multi-version diffs and updates the single c1 doc.
docs/design/datacontracts/ExecutionManager.mdUpdates nibble map documentation to the constant-time lookup algorithm under c1.
docs/design/datacontracts/DebugInfo.mdCollapses versioned documentation to a single c1 spec matching the newer encoding/decoding.
docs/design/datacontracts/data-descriptor-meanings.jsonRemoves version-specific wording and aligns meanings with the squashed contract versions.

Comment threaddocs/design/datacontracts/PrecodeStubs.md
Comment threadsrc/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs
Comment threadsrc/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.inc Outdated

@max-charlambmax-charlamb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

Comment threaddocs/design/datacontracts/DebugInfo.md
CopilotAI review requested due to automatic review settings August 5, 2026 00:06
@noahfalk

Copy link
Copy Markdown
MemberAuthor

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

PR is updated to only do the contract removal without the renumbering.

@noahfalknoahfalk changed the title Squash data contract versionsRemove development-only contract versionsAug 5, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 27 out of 27 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:28

  • ThisPtrRetBufPrecode_GetMethodDesc repeats the stub-data address calculation; using GetStubPrecodeData here keeps all stub-precode-data reads consistent and avoids duplication.
 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:15

  • StubPrecode_GetMethodDesc duplicates the stub-data address computation that's already encapsulated in GetStubPrecodeData (used by TryGetKnownPrecodeType). Using the helper here reduces duplication and keeps the address calculation consistent if it ever changes.

This issue also appears on line 27 of the same file.

 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);
return stubPrecodeData.SecretParam;

@noahfalk
noahfalk enabled auto-merge (squash) August 5, 2026 00:20
CopilotAI review requested due to automatic review settings August 5, 2026 05:18
While developing data contracts we've mostly been making in-place breaking changes on v1
contracts but for a few we added multiple versions before our development time versioning
policy was decided on. As preparation to lock down contracts we are simplifying by getting
rid of contract versions that only existed during unsupported development builds. Going
forward we don't expect a numbering reset like this to happen again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ab1b53f7-74ef-44f9-8bdc-95691a2f5138
@noahfalk
noahfalkforce-pushed the feature/cdac-contract-version-reset branch from 9d99cb6 to b5788d1CompareAugust 5, 2026 05:22

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.cs:23

  • StdArchAllVersions() no longer returns “all versions” (it always yields only "c2"), which makes the name misleading and harder to understand when reading the test matrix. Consider renaming it (and all MemberData references) to reflect the single supported version.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.cs:920

  • StdArchAllVersions() now yields only "c2". The helper name implies a version cross-product, but the data set is now single-version, which can confuse future edits (e.g., adding c3 would require revisiting this). Rename the helper and update the MemberData references accordingly.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

CopilotAI review requested due to automatic review settings August 5, 2026 05:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs:192

  • The mocked PrecodeMachineDescriptor layout here doesn’t match the actual CoreCLR layout (e.g., src/coreclr/vm/precode.h includes FixupPrecodeType, FixupCodeOffset, fixed-size FixupBytes/StubBytes arrays, and places ThisPointerRetBufPrecodeType/InterpreterPrecodeType after those arrays). With c1/c2 removed, this test setup can produce field offsets that don’t reflect real targets, so the contract can appear correct under test while reading the wrong offsets on real dumps.

Consider updating the mock Target.TypeInfo layouts in this method to mirror the data-descriptor/native struct layouts (including “unused” intermediate fields and realistic fixed array sizes), so offsets for fields the contract reads are representative.

 layout = targetTestHelpers.LayoutFields([
new(nameof(Data.PrecodeMachineDescriptor.StubCodePageSize), DataType.uint32),
new(nameof(Data.PrecodeMachineDescriptor.InvalidPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.StubPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.ThisPointerRetBufPrecodeType), DataType.uint8),

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/ba-g build monitor is having issues

@noahfalk
noahfalk merged commit c36f112 into dotnet:mainAug 5, 2026
73 of 75 checks passed
noahfalk added a commit that referenced this pull request Aug 6, 2026
Follow up to #131790 to renumber
the contracts starting from 1.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-rc1 milestone Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@noahfalk@hoyosjs@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' Remove development-only contract versions by noahfalk · Pull Request #131790 · dotnet/runtime · GitHub
Skip to content

Remove development-only contract versions - #131790

Merged
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset
Aug 5, 2026
Merged

Remove development-only contract versions#131790
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset

Conversation

@noahfalk

@noahfalknoahfalk commented Aug 4, 2026

Copy link
Copy Markdown
Member

While developing data contracts we've mostly been making in-place breaking changes on v1 contracts but for a few we added multiple versions before our development time versioning policy was decided on. As preparation to lock down contracts we are simplifying by getting rid of contract versions that only existed during unsupported development builds. A follow up PR will renumber all the contract versions to 1 (except StressLog where both contract versions already have use from the StressLogAnalyzer tool). We don't expect to do any renumbering similar to this in the future as the versioning rules will be active even during development.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 5 pipeline(s).
11 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates (“squashes”) several cDAC CoreCLR contract version lines back down to c1 by removing intermediate development-only versions and moving the latest semantics into the remaining c1 implementations, along with corresponding test and documentation updates.

Changes:

  • Remove c2/c3 registrations and implementations for several contracts (e.g., PrecodeStubs, DebugInfo, ExecutionManager, StressLog) and keep a single c1 implementation.
  • Update CoreCLR/NativeAOT data descriptor contract version declarations to match the squashed numbering.
  • Update unit/integration tests and design docs to reflect the new single-version contract surface.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tools/CdacUsageGraph/tests/CdacUsageGraph.Tests/UsageWalkerIntegrationTests.csUpdates usage-walker expectations to target c1 only and assert interpreter-precode reachability under c1.
src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.csCollapses tests to c1 only and adjusts mock descriptors/stub encoding for the new single-version PrecodeStubs behavior.
src/native/managed/cdac/tests/UnitTests/MockDescriptors/MockDescriptors.ExecutionManager.csRemoves c2 nibble map builder selection.
src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.csRemoves “all versions” iteration; now tests only c1.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTests.csSwitches test to NibbleMapTestBuilder_1 to match new c1 algorithm selection.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTestBuilder.csRemoves NibbleMapTestBuilder_2 and updates _1 to implement constant-lookup nibble map behavior.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.csRemoves c2 coverage; now tests only c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StubPrecodeData.csRemoves the _2 data shape and standardizes StubPrecodeData_1 to use SecretParam + Type.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/CoreCLRContracts.csRemoves c2/c3 contract registrations; registers only c1 for the squashed contracts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.csRemoves the old “small” reader path and makes StressLog_1 use the newer message encoding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.csDeletes the c3 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_1.csMoves the newer precode detection/interpreter support behavior into c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csSwitches c1 to the constant-lookup nibble map algorithm.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.csMoves the newer debug-info decoding (fat header, vars, async info, 3-bit source flags) into c1.
src/coreclr/vm/datadescriptor/datadescriptor.incRenumbers several CDAC_GLOBAL_CONTRACT(..., c*) declarations down to c1.
src/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.incRenumbers StressLog contract reference from c2 to c1 for NativeAOT descriptors.
docs/design/datacontracts/StressLog.mdRemoves the old version split and documents the remaining c1 semantics.
docs/design/datacontracts/PrecodeStubs.mdRemoves multi-version diffs and updates the single c1 doc.
docs/design/datacontracts/ExecutionManager.mdUpdates nibble map documentation to the constant-time lookup algorithm under c1.
docs/design/datacontracts/DebugInfo.mdCollapses versioned documentation to a single c1 spec matching the newer encoding/decoding.
docs/design/datacontracts/data-descriptor-meanings.jsonRemoves version-specific wording and aligns meanings with the squashed contract versions.

Comment threaddocs/design/datacontracts/PrecodeStubs.md
Comment threadsrc/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs
Comment threadsrc/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.inc Outdated

@max-charlambmax-charlamb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

Comment threaddocs/design/datacontracts/DebugInfo.md
CopilotAI review requested due to automatic review settings August 5, 2026 00:06
@noahfalk

Copy link
Copy Markdown
MemberAuthor

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

PR is updated to only do the contract removal without the renumbering.

@noahfalknoahfalk changed the title Squash data contract versionsRemove development-only contract versionsAug 5, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 27 out of 27 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:28

  • ThisPtrRetBufPrecode_GetMethodDesc repeats the stub-data address calculation; using GetStubPrecodeData here keeps all stub-precode-data reads consistent and avoids duplication.
 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:15

  • StubPrecode_GetMethodDesc duplicates the stub-data address computation that's already encapsulated in GetStubPrecodeData (used by TryGetKnownPrecodeType). Using the helper here reduces duplication and keeps the address calculation consistent if it ever changes.

This issue also appears on line 27 of the same file.

 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);
return stubPrecodeData.SecretParam;

@noahfalk
noahfalk enabled auto-merge (squash) August 5, 2026 00:20
CopilotAI review requested due to automatic review settings August 5, 2026 05:18
While developing data contracts we've mostly been making in-place breaking changes on v1
contracts but for a few we added multiple versions before our development time versioning
policy was decided on. As preparation to lock down contracts we are simplifying by getting
rid of contract versions that only existed during unsupported development builds. Going
forward we don't expect a numbering reset like this to happen again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ab1b53f7-74ef-44f9-8bdc-95691a2f5138
@noahfalk
noahfalkforce-pushed the feature/cdac-contract-version-reset branch from 9d99cb6 to b5788d1CompareAugust 5, 2026 05:22

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.cs:23

  • StdArchAllVersions() no longer returns “all versions” (it always yields only "c2"), which makes the name misleading and harder to understand when reading the test matrix. Consider renaming it (and all MemberData references) to reflect the single supported version.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.cs:920

  • StdArchAllVersions() now yields only "c2". The helper name implies a version cross-product, but the data set is now single-version, which can confuse future edits (e.g., adding c3 would require revisiting this). Rename the helper and update the MemberData references accordingly.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

CopilotAI review requested due to automatic review settings August 5, 2026 05:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs:192

  • The mocked PrecodeMachineDescriptor layout here doesn’t match the actual CoreCLR layout (e.g., src/coreclr/vm/precode.h includes FixupPrecodeType, FixupCodeOffset, fixed-size FixupBytes/StubBytes arrays, and places ThisPointerRetBufPrecodeType/InterpreterPrecodeType after those arrays). With c1/c2 removed, this test setup can produce field offsets that don’t reflect real targets, so the contract can appear correct under test while reading the wrong offsets on real dumps.

Consider updating the mock Target.TypeInfo layouts in this method to mirror the data-descriptor/native struct layouts (including “unused” intermediate fields and realistic fixed array sizes), so offsets for fields the contract reads are representative.

 layout = targetTestHelpers.LayoutFields([
new(nameof(Data.PrecodeMachineDescriptor.StubCodePageSize), DataType.uint32),
new(nameof(Data.PrecodeMachineDescriptor.InvalidPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.StubPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.ThisPointerRetBufPrecodeType), DataType.uint8),

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/ba-g build monitor is having issues

@noahfalk
noahfalk merged commit c36f112 into dotnet:mainAug 5, 2026
73 of 75 checks passed
noahfalk added a commit that referenced this pull request Aug 6, 2026
Follow up to #131790 to renumber
the contracts starting from 1.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-rc1 milestone Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@noahfalk@hoyosjs@max-charlamb
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); Remove development-only contract versions by noahfalk · Pull Request #131790 · dotnet/runtime · GitHub
Skip to content

Remove development-only contract versions - #131790

Merged
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset
Aug 5, 2026
Merged

Remove development-only contract versions#131790
noahfalk merged 3 commits into
dotnet:mainfrom
noahfalk:feature/cdac-contract-version-reset

Conversation

@noahfalk

@noahfalknoahfalk commented Aug 4, 2026

Copy link
Copy Markdown
Member

While developing data contracts we've mostly been making in-place breaking changes on v1 contracts but for a few we added multiple versions before our development time versioning policy was decided on. As preparation to lock down contracts we are simplifying by getting rid of contract versions that only existed during unsupported development builds. A follow up PR will renumber all the contract versions to 1 (except StressLog where both contract versions already have use from the StressLogAnalyzer tool). We don't expect to do any renumbering similar to this in the future as the versioning rules will be active even during development.

@azure-pipelines

Copy link
Copy Markdown
Azure Pipelines:
Successfully started running 5 pipeline(s).
11 pipeline(s) were filtered out due to trigger conditions.
There may be pipelines that require an authorized user to comment /azp run to run.

@dotnet-policy-service

Copy link
Copy Markdown
Contributor

Tagging subscribers to this area: @steveisok, @tommcdon, @dotnet/dotnet-diag
See info in area-owners.md if you want to be subscribed.

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

This PR consolidates (“squashes”) several cDAC CoreCLR contract version lines back down to c1 by removing intermediate development-only versions and moving the latest semantics into the remaining c1 implementations, along with corresponding test and documentation updates.

Changes:

  • Remove c2/c3 registrations and implementations for several contracts (e.g., PrecodeStubs, DebugInfo, ExecutionManager, StressLog) and keep a single c1 implementation.
  • Update CoreCLR/NativeAOT data descriptor contract version declarations to match the squashed numbering.
  • Update unit/integration tests and design docs to reflect the new single-version contract surface.

Reviewed changes

Copilot reviewed 24 out of 24 changed files in this pull request and generated 2 comments.

Show a summary per file
FileDescription
src/native/managed/cdac/tools/CdacUsageGraph/tests/CdacUsageGraph.Tests/UsageWalkerIntegrationTests.csUpdates usage-walker expectations to target c1 only and assert interpreter-precode reachability under c1.
src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.csCollapses tests to c1 only and adjusts mock descriptors/stub encoding for the new single-version PrecodeStubs behavior.
src/native/managed/cdac/tests/UnitTests/MockDescriptors/MockDescriptors.ExecutionManager.csRemoves c2 nibble map builder selection.
src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.csRemoves “all versions” iteration; now tests only c1.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTests.csSwitches test to NibbleMapTestBuilder_1 to match new c1 algorithm selection.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/NibbleMapTestBuilder.csRemoves NibbleMapTestBuilder_2 and updates _1 to implement constant-lookup nibble map behavior.
src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.csRemoves c2 coverage; now tests only c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Data/StubPrecodeData.csRemoves the _2 data shape and standardizes StubPrecodeData_1 to use SecretParam + Type.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/CoreCLRContracts.csRemoves c2/c3 contract registrations; registers only c1 for the squashed contracts.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StressLog.csRemoves the old “small” reader path and makes StressLog_1 use the newer message encoding.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.csDeletes the c3 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_1.csMoves the newer precode detection/interpreter support behavior into c1.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/ExecutionManager/ExecutionManager_1.csSwitches c1 to the constant-lookup nibble map algorithm.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_2.csDeletes the c2 implementation.
src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/DebugInfo/DebugInfo_1.csMoves the newer debug-info decoding (fat header, vars, async info, 3-bit source flags) into c1.
src/coreclr/vm/datadescriptor/datadescriptor.incRenumbers several CDAC_GLOBAL_CONTRACT(..., c*) declarations down to c1.
src/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.incRenumbers StressLog contract reference from c2 to c1 for NativeAOT descriptors.
docs/design/datacontracts/StressLog.mdRemoves the old version split and documents the remaining c1 semantics.
docs/design/datacontracts/PrecodeStubs.mdRemoves multi-version diffs and updates the single c1 doc.
docs/design/datacontracts/ExecutionManager.mdUpdates nibble map documentation to the constant-time lookup algorithm under c1.
docs/design/datacontracts/DebugInfo.mdCollapses versioned documentation to a single c1 spec matching the newer encoding/decoding.
docs/design/datacontracts/data-descriptor-meanings.jsonRemoves version-specific wording and aligns meanings with the squashed contract versions.

Comment threaddocs/design/datacontracts/PrecodeStubs.md
Comment threadsrc/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs
Comment threadsrc/coreclr/nativeaot/Runtime/datadescriptor/datadescriptor.inc Outdated

@max-charlambmax-charlamb left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

Comment threaddocs/design/datacontracts/DebugInfo.md
CopilotAI review requested due to automatic review settings August 5, 2026 00:06
@noahfalk

Copy link
Copy Markdown
MemberAuthor

Would it be possible to do this in two parts to reduce the diff? We could remove all but the highest version contract, then have a second PR that renames the contracts to 1.

PR is updated to only do the contract removal without the renumbering.

@noahfalknoahfalk changed the title Squash data contract versionsRemove development-only contract versionsAug 5, 2026

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 27 out of 27 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:28

  • ThisPtrRetBufPrecode_GetMethodDesc repeats the stub-data address calculation; using GetStubPrecodeData here keeps all stub-precode-data reads consistent and avoids duplication.
 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);

src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/PrecodeStubs_3.cs:15

  • StubPrecode_GetMethodDesc duplicates the stub-data address computation that's already encapsulated in GetStubPrecodeData (used by TryGetKnownPrecodeType). Using the helper here reduces duplication and keeps the address calculation consistent if it ever changes.

This issue also appears on line 27 of the same file.

 TargetPointer stubPrecodeDataAddress = instrPointer + precodeMachineDescriptor.StubCodePageSize;
Data.StubPrecodeData_2 stubPrecodeData = target.ProcessedData.GetOrAdd<Data.StubPrecodeData_2>(stubPrecodeDataAddress);
return stubPrecodeData.SecretParam;

@noahfalk
noahfalk enabled auto-merge (squash) August 5, 2026 00:20
CopilotAI review requested due to automatic review settings August 5, 2026 05:18
While developing data contracts we've mostly been making in-place breaking changes on v1
contracts but for a few we added multiple versions before our development time versioning
policy was decided on. As preparation to lock down contracts we are simplifying by getting
rid of contract versions that only existed during unsupported development builds. Going
forward we don't expect a numbering reset like this to happen again.
Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
Copilot-Session: ab1b53f7-74ef-44f9-8bdc-95691a2f5138
@noahfalk
noahfalkforce-pushed the feature/cdac-contract-version-reset branch from 9d99cb6 to b5788d1CompareAugust 5, 2026 05:22

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (2)

src/native/managed/cdac/tests/UnitTests/FunctionTableAccessTests.cs:23

  • StdArchAllVersions() no longer returns “all versions” (it always yields only "c2"), which makes the name misleading and harder to understand when reading the test matrix. Consider renaming it (and all MemberData references) to reflect the single supported version.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

src/native/managed/cdac/tests/UnitTests/ExecutionManager/ExecutionManagerTests.cs:920

  • StdArchAllVersions() now yields only "c2". The helper name implies a version cross-product, but the data set is now single-version, which can confuse future edits (e.g., adding c3 would require revisiting this). Rename the helper and update the MemberData references accordingly.
 public static IEnumerable<object[]> StdArchAllVersions()
{
foreach (object[] arr in new MockTarget.StdArch())
{
MockTarget.Architecture arch = (MockTarget.Architecture)arr[0];
yield return new object[] { "c2", arch };
}

CopilotAI review requested due to automatic review settings August 5, 2026 05:25

CopilotAI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Copilot reviewed 25 out of 25 changed files in this pull request and generated no new comments.

Suppressed comments (1)

src/native/managed/cdac/tests/UnitTests/PrecodeStubsTests.cs:192

  • The mocked PrecodeMachineDescriptor layout here doesn’t match the actual CoreCLR layout (e.g., src/coreclr/vm/precode.h includes FixupPrecodeType, FixupCodeOffset, fixed-size FixupBytes/StubBytes arrays, and places ThisPointerRetBufPrecodeType/InterpreterPrecodeType after those arrays). With c1/c2 removed, this test setup can produce field offsets that don’t reflect real targets, so the contract can appear correct under test while reading the wrong offsets on real dumps.

Consider updating the mock Target.TypeInfo layouts in this method to mirror the data-descriptor/native struct layouts (including “unused” intermediate fields and realistic fixed array sizes), so offsets for fields the contract reads are representative.

 layout = targetTestHelpers.LayoutFields([
new(nameof(Data.PrecodeMachineDescriptor.StubCodePageSize), DataType.uint32),
new(nameof(Data.PrecodeMachineDescriptor.InvalidPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.StubPrecodeType), DataType.uint8),
new(nameof(Data.PrecodeMachineDescriptor.ThisPointerRetBufPrecodeType), DataType.uint8),

@noahfalk

Copy link
Copy Markdown
MemberAuthor

/ba-g build monitor is having issues

@noahfalk
noahfalk merged commit c36f112 into dotnet:mainAug 5, 2026
73 of 75 checks passed
noahfalk added a commit that referenced this pull request Aug 6, 2026
Follow up to #131790 to renumber
the contracts starting from 1.
@dotnet-milestone-botdotnet-milestone-botBot added this to the 11.0-rc1 milestone Aug 6, 2026
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@noahfalk@hoyosjs@max-charlamb