From d7a3f760fa5e17befe4ac1712e0b7151b9c28ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aleksey=20Kliger=20=28=CE=BBgeek=29?= Date: Mon, 12 Aug 2024 18:50:46 -0400 Subject: [PATCH] [cdac] Change Module data descriptor for lookup maps (#106291) 1. Add the MethodDefToILCodeVersioningState lookup map, too. 2. In future work (for example the SOS GetMethodDescData method) we will need to perform lookups in some of these lookup maps, so we will want the offsets of their Count and Next fields, not just a pointer to the table data. Change the data descriptor to return the offsets of the LookupMap structs themselves, not their `pTable` member 3. Update SOSDacImpl.GetModuleData implementation to manually add the table data offset to the lookup map addresses that are used by that method. --- docs/design/datacontracts/Loader.md | 8 ++++++-- src/coreclr/debug/runtimeinfo/datadescriptor.h | 5 +++++ src/coreclr/vm/ceeload.h | 13 +++++++------ .../managed/cdacreader/src/Contracts/Loader.cs | 3 ++- .../cdacreader/src/Contracts/Loader_1.cs | 3 ++- .../managed/cdacreader/src/Data/Module.cs | 2 ++ .../cdacreader/src/Data/ModuleLookupMap.cs | 18 ++++++++++++++++++ src/native/managed/cdacreader/src/DataType.cs | 1 + .../cdacreader/src/Legacy/SOSDacImpl.cs | 15 +++++++++------ 9 files changed, 52 insertions(+), 16 deletions(-) create mode 100644 src/native/managed/cdacreader/src/Data/ModuleLookupMap.cs diff --git a/docs/design/datacontracts/Loader.md b/docs/design/datacontracts/Loader.md index bc45eaee7a671c..5efe0dc002ff4e 100644 --- a/docs/design/datacontracts/Loader.md +++ b/docs/design/datacontracts/Loader.md @@ -25,7 +25,8 @@ record struct ModuleLookupTables( TargetPointer MemberRefToDesc, TargetPointer MethodDefToDesc, TargetPointer TypeDefToMethodTable, - TargetPointer TypeRefToMethodTable); + TargetPointer TypeRefToMethodTable, + TargetPointer MethodDefToILCodeVersioningState); internal struct EcmaMetadataSchema { @@ -130,6 +131,7 @@ Data descriptors used: | `Module` | `TypeRefToMethodTableMap` | Mapping table | | `DynamicMetadata` | `Size` | Size of the dynamic metadata blob (as a 32bit uint) | | `DynamicMetadata` | `Data` | Start of dynamic metadata data array | +| `ModuleLookupMap` | `TableData` | Start of the mapping table's data | ``` csharp ModuleHandle GetModuleHandle(TargetPointer modulePointer) @@ -215,6 +217,8 @@ ModuleLookupTables GetLookupTables(ModuleHandle handle) MemberRefToDescMap: target.ReadPointer(handle.Address + /* Module::MemberRefToDescMap */), MethodDefToDescMap: target.ReadPointer(handle.Address + /* Module::MethodDefToDescMap */), TypeDefToMethodTableMap: target.ReadPointer(handle.Address + /* Module::TypeDefToMethodTableMap */), - TypeRefToMethodTableMap: target.ReadPointer(handle.Address + /* Module::TypeRefToMethodTableMap */)); + TypeRefToMethodTableMap: target.ReadPointer(handle.Address + /* Module::TypeRefToMethodTableMap */), + MethodDefToILCodeVersioningState: target.ReadPointer(handle.Address + /* + Module::MethodDefToILCodeVersioningState */)); } ``` diff --git a/src/coreclr/debug/runtimeinfo/datadescriptor.h b/src/coreclr/debug/runtimeinfo/datadescriptor.h index e301dc57ee2533..dc7c85c1f055c5 100644 --- a/src/coreclr/debug/runtimeinfo/datadescriptor.h +++ b/src/coreclr/debug/runtimeinfo/datadescriptor.h @@ -227,8 +227,13 @@ CDAC_TYPE_FIELD(Module, /*pointer*/, MemberRefToDescMap, cdac_data::Memb CDAC_TYPE_FIELD(Module, /*pointer*/, MethodDefToDescMap, cdac_data::MethodDefToDescMap) CDAC_TYPE_FIELD(Module, /*pointer*/, TypeDefToMethodTableMap, cdac_data::TypeDefToMethodTableMap) CDAC_TYPE_FIELD(Module, /*pointer*/, TypeRefToMethodTableMap, cdac_data::TypeRefToMethodTableMap) +CDAC_TYPE_FIELD(Module, /*pointer*/, MethodDefToILCodeVersioningStateMap, cdac_data::MethodDefToILCodeVersioningStateMap) CDAC_TYPE_END(Module) +CDAC_TYPE_BEGIN(ModuleLookupMap) +CDAC_TYPE_FIELD(ModuleLookupMap, /*pointer*/, TableData, offsetof(LookupMapBase, pTable)) +CDAC_TYPE_END(ModuleLookupMap) + // RuntimeTypeSystem CDAC_TYPE_BEGIN(MethodTable) diff --git a/src/coreclr/vm/ceeload.h b/src/coreclr/vm/ceeload.h index 5ba8ea1fb4aa54..9ebc0ed9f39e17 100644 --- a/src/coreclr/vm/ceeload.h +++ b/src/coreclr/vm/ceeload.h @@ -1641,12 +1641,13 @@ struct cdac_data static constexpr size_t DynamicMetadata = offsetof(Module, m_pDynamicMetadata); // Lookup map pointers - static constexpr size_t FieldDefToDescMap = offsetof(Module, m_FieldDefToDescMap) + offsetof(LookupMap, pTable); - static constexpr size_t ManifestModuleReferencesMap = offsetof(Module, m_ManifestModuleReferencesMap) + offsetof(LookupMap, pTable); - static constexpr size_t MemberRefToDescMap = offsetof(Module, m_MemberRefMap) + offsetof(LookupMap, pTable); - static constexpr size_t MethodDefToDescMap = offsetof(Module, m_MethodDefToDescMap) + offsetof(LookupMap, pTable); - static constexpr size_t TypeDefToMethodTableMap = offsetof(Module, m_TypeDefToMethodTableMap) + offsetof(LookupMap, pTable); - static constexpr size_t TypeRefToMethodTableMap = offsetof(Module, m_TypeRefToMethodTableMap) + offsetof(LookupMap, pTable); + static constexpr size_t FieldDefToDescMap = offsetof(Module, m_FieldDefToDescMap); + static constexpr size_t ManifestModuleReferencesMap = offsetof(Module, m_ManifestModuleReferencesMap); + static constexpr size_t MemberRefToDescMap = offsetof(Module, m_MemberRefMap); + static constexpr size_t MethodDefToDescMap = offsetof(Module, m_MethodDefToDescMap); + static constexpr size_t TypeDefToMethodTableMap = offsetof(Module, m_TypeDefToMethodTableMap); + static constexpr size_t TypeRefToMethodTableMap = offsetof(Module, m_TypeRefToMethodTableMap); + static constexpr size_t MethodDefToILCodeVersioningStateMap = offsetof(Module, m_ILCodeVersioningStateMap); }; // diff --git a/src/native/managed/cdacreader/src/Contracts/Loader.cs b/src/native/managed/cdacreader/src/Contracts/Loader.cs index 508fd8e56ad836..dbcd9bd37cceeb 100644 --- a/src/native/managed/cdacreader/src/Contracts/Loader.cs +++ b/src/native/managed/cdacreader/src/Contracts/Loader.cs @@ -29,7 +29,8 @@ internal record struct ModuleLookupTables( TargetPointer MemberRefToDesc, TargetPointer MethodDefToDesc, TargetPointer TypeDefToMethodTable, - TargetPointer TypeRefToMethodTable); + TargetPointer TypeRefToMethodTable, + TargetPointer MethodDefToILCodeVersioningState); internal struct EcmaMetadataSchema { diff --git a/src/native/managed/cdacreader/src/Contracts/Loader_1.cs b/src/native/managed/cdacreader/src/Contracts/Loader_1.cs index 2c4aa6677f85c0..bfbf219207c028 100644 --- a/src/native/managed/cdacreader/src/Contracts/Loader_1.cs +++ b/src/native/managed/cdacreader/src/Contracts/Loader_1.cs @@ -95,6 +95,7 @@ ModuleLookupTables ILoader.GetLookupTables(ModuleHandle handle) module.MemberRefToDescMap, module.MethodDefToDescMap, module.TypeDefToMethodTableMap, - module.TypeRefToMethodTableMap); + module.TypeRefToMethodTableMap, + module.MethodDefToILCodeVersioningStateMap); } } diff --git a/src/native/managed/cdacreader/src/Data/Module.cs b/src/native/managed/cdacreader/src/Data/Module.cs index eb8746ea64c8eb..3ceabdad209367 100644 --- a/src/native/managed/cdacreader/src/Data/Module.cs +++ b/src/native/managed/cdacreader/src/Data/Module.cs @@ -30,6 +30,7 @@ public Module(Target target, TargetPointer address) MethodDefToDescMap = target.ReadPointer(address + (ulong)type.Fields[nameof(MethodDefToDescMap)].Offset); TypeDefToMethodTableMap = target.ReadPointer(address + (ulong)type.Fields[nameof(TypeDefToMethodTableMap)].Offset); TypeRefToMethodTableMap = target.ReadPointer(address + (ulong)type.Fields[nameof(TypeRefToMethodTableMap)].Offset); + MethodDefToILCodeVersioningStateMap = target.ReadPointer(address + (ulong)type.Fields[nameof(MethodDefToILCodeVersioningStateMap)].Offset); } public TargetPointer Assembly { get; init; } @@ -45,6 +46,7 @@ public Module(Target target, TargetPointer address) public TargetPointer MethodDefToDescMap { get; init; } public TargetPointer TypeDefToMethodTableMap { get; init; } public TargetPointer TypeRefToMethodTableMap { get; init; } + public TargetPointer MethodDefToILCodeVersioningStateMap { get; init; } private TargetPointer _metadataStart = TargetPointer.Null; private ulong _metadataSize; diff --git a/src/native/managed/cdacreader/src/Data/ModuleLookupMap.cs b/src/native/managed/cdacreader/src/Data/ModuleLookupMap.cs new file mode 100644 index 00000000000000..db69c68fe2c133 --- /dev/null +++ b/src/native/managed/cdacreader/src/Data/ModuleLookupMap.cs @@ -0,0 +1,18 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Microsoft.Diagnostics.DataContractReader.Data; + +internal sealed class ModuleLookupMap : IData +{ + static ModuleLookupMap IData.Create(Target target, TargetPointer address) => new ModuleLookupMap(target, address); + + private ModuleLookupMap(Target target, TargetPointer address) + { + Target.TypeInfo type = target.GetTypeInfo(DataType.ModuleLookupMap); + + TableData = target.ReadPointer(address + (ulong)type.Fields[nameof(TableData)].Offset); + } + + public TargetPointer TableData { get; init; } +} diff --git a/src/native/managed/cdacreader/src/DataType.cs b/src/native/managed/cdacreader/src/DataType.cs index 25f60a2fc8af58..a7efdf5b11f09a 100644 --- a/src/native/managed/cdacreader/src/DataType.cs +++ b/src/native/managed/cdacreader/src/DataType.cs @@ -27,6 +27,7 @@ public enum DataType ExceptionInfo, RuntimeThreadLocals, Module, + ModuleLookupMap, MethodTable, EEClass, ArrayClass, diff --git a/src/native/managed/cdacreader/src/Legacy/SOSDacImpl.cs b/src/native/managed/cdacreader/src/Legacy/SOSDacImpl.cs index 2d00d0a021de56..4bbef214ebb082 100644 --- a/src/native/managed/cdacreader/src/Legacy/SOSDacImpl.cs +++ b/src/native/managed/cdacreader/src/Legacy/SOSDacImpl.cs @@ -275,13 +275,16 @@ public unsafe int GetModuleData(ulong moduleAddr, DacpModuleData* data) data->LoaderAllocator = contract.GetLoaderAllocator(handle); data->ThunkHeap = contract.GetThunkHeap(handle); + Target.TypeInfo lookupMapTypeInfo = _target.GetTypeInfo(DataType.ModuleLookupMap); + ulong tableDataOffset = (ulong)lookupMapTypeInfo.Fields[nameof(Data.ModuleLookupMap.TableData)].Offset; + Contracts.ModuleLookupTables tables = contract.GetLookupTables(handle); - data->FieldDefToDescMap = tables.FieldDefToDesc; - data->ManifestModuleReferencesMap = tables.ManifestModuleReferences; - data->MemberRefToDescMap = tables.MemberRefToDesc; - data->MethodDefToDescMap = tables.MethodDefToDesc; - data->TypeDefToMethodTableMap = tables.TypeDefToMethodTable; - data->TypeRefToMethodTableMap = tables.TypeRefToMethodTable; + data->FieldDefToDescMap = tables.FieldDefToDesc + tableDataOffset; + data->ManifestModuleReferencesMap = tables.ManifestModuleReferences + tableDataOffset; + data->MemberRefToDescMap = tables.MemberRefToDesc + tableDataOffset; + data->MethodDefToDescMap = tables.MethodDefToDesc + tableDataOffset; + data->TypeDefToMethodTableMap = tables.TypeDefToMethodTable + tableDataOffset; + data->TypeRefToMethodTableMap = tables.TypeRefToMethodTable + tableDataOffset; // Always 0 - .NET no longer has these concepts data->dwModuleID = 0;