diff --git a/src/native/managed/cdac/Directory.Build.props b/src/native/managed/cdac/Directory.Build.props index b8fb4646ebd854..52c3827b9fe205 100644 --- a/src/native/managed/cdac/Directory.Build.props +++ b/src/native/managed/cdac/Directory.Build.props @@ -3,11 +3,21 @@ false - false - true + + $(NetCoreAppToolCurrent);net10.0;net9.0;net8.0 - + + <_Parameter1>NETCDAC0001 diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Microsoft.Diagnostics.DataContractReader.Abstractions.csproj b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Microsoft.Diagnostics.DataContractReader.Abstractions.csproj index efb88ae68f76a2..90e2ca650acbe8 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Microsoft.Diagnostics.DataContractReader.Abstractions.csproj +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Abstractions/Microsoft.Diagnostics.DataContractReader.Abstractions.csproj @@ -1,7 +1,7 @@ - $(NetCoreAppToolCurrent) + $(CdacPackageTargetFrameworks) Microsoft.Diagnostics.DataContractReader enable true diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/Context/X86/X86Unwinder.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/Context/X86/X86Unwinder.cs index e7a4c4505ca95d..9aae49fdf49c48 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/Context/X86/X86Unwinder.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Contracts/StackWalk/Context/X86/X86Unwinder.cs @@ -3,7 +3,6 @@ using System; using System.Diagnostics; -using System.Linq; using Microsoft.Diagnostics.DataContractReader.Contracts.Extensions; using static Microsoft.Diagnostics.DataContractReader.Contracts.StackWalkHelpers.X86Context; @@ -487,8 +486,9 @@ private bool UnwindEbpDoubleAlignFrame( if (gcInfo.Header.DoubleAlign && (curEbp & 0x04) != 0) pSavedRegs -= _pointerSize; - foreach (RegMask regMask in registerOrder.Reverse()) + for (int i = registerOrder.Length - 1; i >= 0; i--) { + RegMask regMask = registerOrder[i]; if (regMask == RegMask.EBP) continue; if (!gcInfo.SavedRegsMask.HasFlag(regMask)) continue; @@ -570,8 +570,9 @@ we need to know our exact location to determine the callee-saved registers */ /* Increment "offset" in steps to see which callee-saved registers have been pushed already */ - foreach (RegMask regMask in registerOrder.Reverse()) + for (int i = registerOrder.Length - 1; i >= 0; i--) { + RegMask regMask = registerOrder[i]; if (regMask == RegMask.EBP) continue; if (!gcInfo.SavedRegsMask.HasFlag(regMask)) continue; diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Microsoft.Diagnostics.DataContractReader.Contracts.csproj b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Microsoft.Diagnostics.DataContractReader.Contracts.csproj index bf80c13bbf6212..331df3e011f567 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Microsoft.Diagnostics.DataContractReader.Contracts.csproj +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Contracts/Microsoft.Diagnostics.DataContractReader.Contracts.csproj @@ -1,7 +1,7 @@ - $(NetCoreAppToolCurrent) + $(CdacPackageTargetFrameworks) Microsoft.Diagnostics.DataContractReader enable true diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs index 8fc9d53e7df765..eaadc3eb6a73b2 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ClrDataModule.cs @@ -91,7 +91,9 @@ CustomQueryInterfaceResult ICustomQueryInterface.GetInterface(ref Guid iid, out try { Guid iidMetaDataImport = typeof(IMetaDataImport).GUID; - if (_legacyModulePointer != 0 && Marshal.QueryInterface(_legacyModulePointer, iidMetaDataImport, out nint ppMdi) >= 0) +#pragma warning disable CS9191 // 'ref' is equivalent to 'in' for net9+; net8 requires 'ref' + if (_legacyModulePointer != 0 && Marshal.QueryInterface(_legacyModulePointer, ref iidMetaDataImport, out nint ppMdi) >= 0) +#pragma warning restore CS9191 { legacyImport = ComInterfaceMarshaller.ConvertToManaged((void*)ppMdi); Marshal.Release(ppMdi); diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs index 06c887b7ffd89b..c61df788c17371 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/ISOSDacInterface.cs @@ -758,7 +758,7 @@ public unsafe partial interface ISOSDacInterface // Frames [PreserveSig] - int GetFrameName(ClrDataAddress vtable, uint count, char* frameName, uint* pNeeded); + int GetFrameName(ClrDataAddress vtableAddr, uint count, char* frameName, uint* pNeeded); // PEFiles [PreserveSig] diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Microsoft.Diagnostics.DataContractReader.Legacy.csproj b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Microsoft.Diagnostics.DataContractReader.Legacy.csproj index 3424ce84e341c6..835e3f78ff8ce0 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Microsoft.Diagnostics.DataContractReader.Legacy.csproj +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/Microsoft.Diagnostics.DataContractReader.Legacy.csproj @@ -1,7 +1,7 @@ - $(NetCoreAppToolCurrent) + $(CdacPackageTargetFrameworks) Microsoft.Diagnostics.DataContractReader.Legacy enable true diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs index 2007bb81728a1e..ef5e487d9a53cf 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader.Legacy/SOSDacImpl.cs @@ -1199,15 +1199,15 @@ int ISOSDacInterface.GetFieldDescData(ClrDataAddress fieldDesc, DacpFieldDescDat return hr; } - int ISOSDacInterface.GetFrameName(ClrDataAddress vtable, uint count, char* frameName, uint* pNeeded) + int ISOSDacInterface.GetFrameName(ClrDataAddress vtableAddr, uint count, char* frameName, uint* pNeeded) { int hr = HResults.S_OK; try { - if (vtable == 0) + if (vtableAddr == 0) throw new ArgumentException(); IStackWalk stackWalk = _target.Contracts.StackWalk; - string name = stackWalk.GetFrameName(new(vtable)); + string name = stackWalk.GetFrameName(new(vtableAddr)); if (string.IsNullOrEmpty(name)) throw new ArgumentException(); @@ -1234,7 +1234,7 @@ int ISOSDacInterface.GetFrameName(ClrDataAddress vtable, uint count, char* frame int hrLocal; fixed (char* ptr = nameLocal) { - hrLocal = _legacyImpl.GetFrameName(vtable, count, ptr, &neededLocal); + hrLocal = _legacyImpl.GetFrameName(vtableAddr, count, ptr, &neededLocal); } Debug.ValidateHResult(hr, hrLocal); if (hr == HResults.S_OK) diff --git a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/Microsoft.Diagnostics.DataContractReader.csproj b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/Microsoft.Diagnostics.DataContractReader.csproj index 57a380547b7ae3..82cd4e86bf3694 100644 --- a/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/Microsoft.Diagnostics.DataContractReader.csproj +++ b/src/native/managed/cdac/Microsoft.Diagnostics.DataContractReader/Microsoft.Diagnostics.DataContractReader.csproj @@ -1,7 +1,7 @@ - $(NetCoreAppToolCurrent) + $(CdacPackageTargetFrameworks) Microsoft.Diagnostics.DataContractReader enable true diff --git a/src/native/managed/cdac/gen/Emitter.cs b/src/native/managed/cdac/gen/Emitter.cs index 162d75d2ddcce4..db2994b7e4a434 100644 --- a/src/native/managed/cdac/gen/Emitter.cs +++ b/src/native/managed/cdac/gen/Emitter.cs @@ -262,7 +262,7 @@ private static string ReadExpression(MemberModel member, string baseVar, string }; private static string NameArgs(MemberModel member) - => string.Join(", ", Enumerate(member.Names).Select(n => $"\"{n}\"")); + => "[" + string.Join(", ", Enumerate(member.Names).Select(n => $"\"{n}\"")) + "]"; private static IEnumerable Enumerate(EquatableArray array) { diff --git a/src/native/managed/cdac/gen/LayoutSetSource.cs b/src/native/managed/cdac/gen/LayoutSetSource.cs index d7e7ac962a1997..4d5d450881a01f 100644 --- a/src/native/managed/cdac/gen/LayoutSetSource.cs +++ b/src/native/managed/cdac/gen/LayoutSetSource.cs @@ -55,7 +55,7 @@ public ulong InstanceSize } } - public bool TrySelect(TargetPointer address, out Target.TypeInfo type, out TargetPointer baseAddr, out string name, params ReadOnlySpan names) + public bool TrySelect(TargetPointer address, out Target.TypeInfo type, out TargetPointer baseAddr, out string name, ReadOnlySpan names) { foreach (LazyLayout layout in _layouts) { @@ -73,7 +73,7 @@ public bool TrySelect(TargetPointer address, out Target.TypeInfo type, out Targe return false; } - public void Select(TargetPointer address, out Target.TypeInfo type, out TargetPointer baseAddr, out string name, params ReadOnlySpan names) + public void Select(TargetPointer address, out Target.TypeInfo type, out TargetPointer baseAddr, out string name, ReadOnlySpan names) { if (!TrySelect(address, out type, out baseAddr, out name, names)) { diff --git a/src/native/managed/cdac/tests/TestInfrastructure/DumpInfo.cs b/src/native/managed/cdac/tests/TestInfrastructure/DumpInfo.cs index baf791c5677936..ac47ca5652cd6d 100644 --- a/src/native/managed/cdac/tests/TestInfrastructure/DumpInfo.cs +++ b/src/native/managed/cdac/tests/TestInfrastructure/DumpInfo.cs @@ -95,8 +95,10 @@ public static DumpInfo ForCurrentMachine() System.Runtime.InteropServices.Architecture.X86 => "x86", System.Runtime.InteropServices.Architecture.Arm64 => "arm64", System.Runtime.InteropServices.Architecture.Arm => "arm", +#if NET9_0_OR_GREATER System.Runtime.InteropServices.Architecture.RiscV64 => "riscv64", System.Runtime.InteropServices.Architecture.LoongArch64 => "loongarch64", +#endif _ => "unknown", }; diff --git a/src/native/managed/cdac/tests/TestInfrastructure/Microsoft.Diagnostics.DataContractReader.TestInfrastructure.csproj b/src/native/managed/cdac/tests/TestInfrastructure/Microsoft.Diagnostics.DataContractReader.TestInfrastructure.csproj index 69fbd92b07c39d..f0df3e5ad651a4 100644 --- a/src/native/managed/cdac/tests/TestInfrastructure/Microsoft.Diagnostics.DataContractReader.TestInfrastructure.csproj +++ b/src/native/managed/cdac/tests/TestInfrastructure/Microsoft.Diagnostics.DataContractReader.TestInfrastructure.csproj @@ -1,7 +1,7 @@ - $(NetCoreAppToolCurrent) + $(CdacPackageTargetFrameworks) Microsoft.Diagnostics.DataContractReader enable true diff --git a/src/native/managed/cdac/tests/UnitTests/MetaDataImportImplTests.cs b/src/native/managed/cdac/tests/UnitTests/MetaDataImportImplTests.cs index c951d6b7e4b84e..3f204363eb3f05 100644 --- a/src/native/managed/cdac/tests/UnitTests/MetaDataImportImplTests.cs +++ b/src/native/managed/cdac/tests/UnitTests/MetaDataImportImplTests.cs @@ -983,7 +983,9 @@ public void QueryInterfaceForIMetaDataImport_ReturnsIMetaDataImport2VtableWithEx { // Simulate ClrMD: QI for IMetaDataImport Guid iidImport = typeof(IMetaDataImport).GUID; - int hr = Marshal.QueryInterface(pUnk, in iidImport, out nint pImport); +#pragma warning disable CS9191 // 'ref' is equivalent to 'in' for net9+; net8 requires 'ref' + int hr = Marshal.QueryInterface(pUnk, ref iidImport, out nint pImport); +#pragma warning restore CS9191 Assert.Equal(0, hr); Assert.NotEqual(nint.Zero, pImport); @@ -994,7 +996,9 @@ public void QueryInterfaceForIMetaDataImport_ReturnsIMetaDataImport2VtableWithEx // redirect, this would return the shorter IMetaDataImport vtable (65 slots) and accessing // slot 65 (EnumGenericParams) would AV. Guid iidImportAgain = typeof(IMetaDataImport).GUID; - hr = Marshal.QueryInterface(pImport, in iidImportAgain, out nint pImportAgain); +#pragma warning disable CS9191 // 'ref' is equivalent to 'in' for net9+; net8 requires 'ref' + hr = Marshal.QueryInterface(pImport, ref iidImportAgain, out nint pImportAgain); +#pragma warning restore CS9191 Assert.Equal(0, hr); Assert.NotEqual(nint.Zero, pImportAgain); @@ -1003,7 +1007,9 @@ public void QueryInterfaceForIMetaDataImport_ReturnsIMetaDataImport2VtableWithEx // Verify the returned pointer has IMetaDataImport2 slots accessible. // QI the result for IMetaDataImport2 to verify COM identity is correct. Guid iidImport2 = typeof(IMetaDataImport2).GUID; - hr = Marshal.QueryInterface(pImportAgain, in iidImport2, out nint pImport2); +#pragma warning disable CS9191 // 'ref' is equivalent to 'in' for net9+; net8 requires 'ref' + hr = Marshal.QueryInterface(pImportAgain, ref iidImport2, out nint pImport2); +#pragma warning restore CS9191 Assert.Equal(0, hr); Assert.NotEqual(nint.Zero, pImport2); Marshal.Release(pImport2); diff --git a/src/native/managed/cdac/tests/UnitTests/Microsoft.Diagnostics.DataContractReader.Tests.csproj b/src/native/managed/cdac/tests/UnitTests/Microsoft.Diagnostics.DataContractReader.Tests.csproj index 32fe6fa499a95a..7c2dab88bccd78 100644 --- a/src/native/managed/cdac/tests/UnitTests/Microsoft.Diagnostics.DataContractReader.Tests.csproj +++ b/src/native/managed/cdac/tests/UnitTests/Microsoft.Diagnostics.DataContractReader.Tests.csproj @@ -1,14 +1,24 @@  true - $(NetCoreAppToolCurrent) + $(CdacPackageTargetFrameworks) false - + + + +