Skip to content

Commit d7a3f76

Browse files
authored
[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.
1 parent abdef75 commit d7a3f76

File tree

9 files changed

+52
-16
lines changed

9 files changed

+52
-16
lines changed

docs/design/datacontracts/Loader.md

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,8 @@ record struct ModuleLookupTables(
2525
TargetPointer MemberRefToDesc,
2626
TargetPointer MethodDefToDesc,
2727
TargetPointer TypeDefToMethodTable,
28-
TargetPointer TypeRefToMethodTable);
28+
TargetPointer TypeRefToMethodTable,
29+
TargetPointer MethodDefToILCodeVersioningState);
2930

3031
internal struct EcmaMetadataSchema
3132
{
@@ -130,6 +131,7 @@ Data descriptors used:
130131
| `Module` | `TypeRefToMethodTableMap` | Mapping table |
131132
| `DynamicMetadata` | `Size` | Size of the dynamic metadata blob (as a 32bit uint) |
132133
| `DynamicMetadata` | `Data` | Start of dynamic metadata data array |
134+
| `ModuleLookupMap` | `TableData` | Start of the mapping table's data |
133135

134136
``` csharp
135137
ModuleHandle GetModuleHandle(TargetPointer modulePointer)
@@ -215,6 +217,8 @@ ModuleLookupTables GetLookupTables(ModuleHandle handle)
215217
MemberRefToDescMap: target.ReadPointer(handle.Address + /* Module::MemberRefToDescMap */),
216218
MethodDefToDescMap: target.ReadPointer(handle.Address + /* Module::MethodDefToDescMap */),
217219
TypeDefToMethodTableMap: target.ReadPointer(handle.Address + /* Module::TypeDefToMethodTableMap */),
218-
TypeRefToMethodTableMap: target.ReadPointer(handle.Address + /* Module::TypeRefToMethodTableMap */));
220+
TypeRefToMethodTableMap: target.ReadPointer(handle.Address + /* Module::TypeRefToMethodTableMap */),
221+
MethodDefToILCodeVersioningState: target.ReadPointer(handle.Address + /*
222+
Module::MethodDefToILCodeVersioningState */));
219223
}
220224
```

src/coreclr/debug/runtimeinfo/datadescriptor.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,13 @@ CDAC_TYPE_FIELD(Module, /*pointer*/, MemberRefToDescMap, cdac_data<Module>::Memb
227227
CDAC_TYPE_FIELD(Module, /*pointer*/, MethodDefToDescMap, cdac_data<Module>::MethodDefToDescMap)
228228
CDAC_TYPE_FIELD(Module, /*pointer*/, TypeDefToMethodTableMap, cdac_data<Module>::TypeDefToMethodTableMap)
229229
CDAC_TYPE_FIELD(Module, /*pointer*/, TypeRefToMethodTableMap, cdac_data<Module>::TypeRefToMethodTableMap)
230+
CDAC_TYPE_FIELD(Module, /*pointer*/, MethodDefToILCodeVersioningStateMap, cdac_data<Module>::MethodDefToILCodeVersioningStateMap)
230231
CDAC_TYPE_END(Module)
231232

233+
CDAC_TYPE_BEGIN(ModuleLookupMap)
234+
CDAC_TYPE_FIELD(ModuleLookupMap, /*pointer*/, TableData, offsetof(LookupMapBase, pTable))
235+
CDAC_TYPE_END(ModuleLookupMap)
236+
232237
// RuntimeTypeSystem
233238

234239
CDAC_TYPE_BEGIN(MethodTable)

src/coreclr/vm/ceeload.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1641,12 +1641,13 @@ struct cdac_data<Module>
16411641
static constexpr size_t DynamicMetadata = offsetof(Module, m_pDynamicMetadata);
16421642

16431643
// Lookup map pointers
1644-
static constexpr size_t FieldDefToDescMap = offsetof(Module, m_FieldDefToDescMap) + offsetof(LookupMap<PTR_FieldDesc>, pTable);
1645-
static constexpr size_t ManifestModuleReferencesMap = offsetof(Module, m_ManifestModuleReferencesMap) + offsetof(LookupMap<PTR_Module>, pTable);
1646-
static constexpr size_t MemberRefToDescMap = offsetof(Module, m_MemberRefMap) + offsetof(LookupMap<TADDR>, pTable);
1647-
static constexpr size_t MethodDefToDescMap = offsetof(Module, m_MethodDefToDescMap) + offsetof(LookupMap<PTR_MethodDesc>, pTable);
1648-
static constexpr size_t TypeDefToMethodTableMap = offsetof(Module, m_TypeDefToMethodTableMap) + offsetof(LookupMap<PTR_MethodTable>, pTable);
1649-
static constexpr size_t TypeRefToMethodTableMap = offsetof(Module, m_TypeRefToMethodTableMap) + offsetof(LookupMap<PTR_TypeRef>, pTable);
1644+
static constexpr size_t FieldDefToDescMap = offsetof(Module, m_FieldDefToDescMap);
1645+
static constexpr size_t ManifestModuleReferencesMap = offsetof(Module, m_ManifestModuleReferencesMap);
1646+
static constexpr size_t MemberRefToDescMap = offsetof(Module, m_MemberRefMap);
1647+
static constexpr size_t MethodDefToDescMap = offsetof(Module, m_MethodDefToDescMap);
1648+
static constexpr size_t TypeDefToMethodTableMap = offsetof(Module, m_TypeDefToMethodTableMap);
1649+
static constexpr size_t TypeRefToMethodTableMap = offsetof(Module, m_TypeRefToMethodTableMap);
1650+
static constexpr size_t MethodDefToILCodeVersioningStateMap = offsetof(Module, m_ILCodeVersioningStateMap);
16501651
};
16511652

16521653
//

src/native/managed/cdacreader/src/Contracts/Loader.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,8 @@ internal record struct ModuleLookupTables(
2929
TargetPointer MemberRefToDesc,
3030
TargetPointer MethodDefToDesc,
3131
TargetPointer TypeDefToMethodTable,
32-
TargetPointer TypeRefToMethodTable);
32+
TargetPointer TypeRefToMethodTable,
33+
TargetPointer MethodDefToILCodeVersioningState);
3334

3435
internal struct EcmaMetadataSchema
3536
{

src/native/managed/cdacreader/src/Contracts/Loader_1.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,7 @@ ModuleLookupTables ILoader.GetLookupTables(ModuleHandle handle)
9595
module.MemberRefToDescMap,
9696
module.MethodDefToDescMap,
9797
module.TypeDefToMethodTableMap,
98-
module.TypeRefToMethodTableMap);
98+
module.TypeRefToMethodTableMap,
99+
module.MethodDefToILCodeVersioningStateMap);
99100
}
100101
}

src/native/managed/cdacreader/src/Data/Module.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ public Module(Target target, TargetPointer address)
3030
MethodDefToDescMap = target.ReadPointer(address + (ulong)type.Fields[nameof(MethodDefToDescMap)].Offset);
3131
TypeDefToMethodTableMap = target.ReadPointer(address + (ulong)type.Fields[nameof(TypeDefToMethodTableMap)].Offset);
3232
TypeRefToMethodTableMap = target.ReadPointer(address + (ulong)type.Fields[nameof(TypeRefToMethodTableMap)].Offset);
33+
MethodDefToILCodeVersioningStateMap = target.ReadPointer(address + (ulong)type.Fields[nameof(MethodDefToILCodeVersioningStateMap)].Offset);
3334
}
3435

3536
public TargetPointer Assembly { get; init; }
@@ -45,6 +46,7 @@ public Module(Target target, TargetPointer address)
4546
public TargetPointer MethodDefToDescMap { get; init; }
4647
public TargetPointer TypeDefToMethodTableMap { get; init; }
4748
public TargetPointer TypeRefToMethodTableMap { get; init; }
49+
public TargetPointer MethodDefToILCodeVersioningStateMap { get; init; }
4850

4951
private TargetPointer _metadataStart = TargetPointer.Null;
5052
private ulong _metadataSize;
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
// Licensed to the .NET Foundation under one or more agreements.
2+
// The .NET Foundation licenses this file to you under the MIT license.
3+
4+
namespace Microsoft.Diagnostics.DataContractReader.Data;
5+
6+
internal sealed class ModuleLookupMap : IData<ModuleLookupMap>
7+
{
8+
static ModuleLookupMap IData<ModuleLookupMap>.Create(Target target, TargetPointer address) => new ModuleLookupMap(target, address);
9+
10+
private ModuleLookupMap(Target target, TargetPointer address)
11+
{
12+
Target.TypeInfo type = target.GetTypeInfo(DataType.ModuleLookupMap);
13+
14+
TableData = target.ReadPointer(address + (ulong)type.Fields[nameof(TableData)].Offset);
15+
}
16+
17+
public TargetPointer TableData { get; init; }
18+
}

src/native/managed/cdacreader/src/DataType.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public enum DataType
2727
ExceptionInfo,
2828
RuntimeThreadLocals,
2929
Module,
30+
ModuleLookupMap,
3031
MethodTable,
3132
EEClass,
3233
ArrayClass,

src/native/managed/cdacreader/src/Legacy/SOSDacImpl.cs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -275,13 +275,16 @@ public unsafe int GetModuleData(ulong moduleAddr, DacpModuleData* data)
275275
data->LoaderAllocator = contract.GetLoaderAllocator(handle);
276276
data->ThunkHeap = contract.GetThunkHeap(handle);
277277

278+
Target.TypeInfo lookupMapTypeInfo = _target.GetTypeInfo(DataType.ModuleLookupMap);
279+
ulong tableDataOffset = (ulong)lookupMapTypeInfo.Fields[nameof(Data.ModuleLookupMap.TableData)].Offset;
280+
278281
Contracts.ModuleLookupTables tables = contract.GetLookupTables(handle);
279-
data->FieldDefToDescMap = tables.FieldDefToDesc;
280-
data->ManifestModuleReferencesMap = tables.ManifestModuleReferences;
281-
data->MemberRefToDescMap = tables.MemberRefToDesc;
282-
data->MethodDefToDescMap = tables.MethodDefToDesc;
283-
data->TypeDefToMethodTableMap = tables.TypeDefToMethodTable;
284-
data->TypeRefToMethodTableMap = tables.TypeRefToMethodTable;
282+
data->FieldDefToDescMap = tables.FieldDefToDesc + tableDataOffset;
283+
data->ManifestModuleReferencesMap = tables.ManifestModuleReferences + tableDataOffset;
284+
data->MemberRefToDescMap = tables.MemberRefToDesc + tableDataOffset;
285+
data->MethodDefToDescMap = tables.MethodDefToDesc + tableDataOffset;
286+
data->TypeDefToMethodTableMap = tables.TypeDefToMethodTable + tableDataOffset;
287+
data->TypeRefToMethodTableMap = tables.TypeRefToMethodTable + tableDataOffset;
285288

286289
// Always 0 - .NET no longer has these concepts
287290
data->dwModuleID = 0;

0 commit comments

Comments
 (0)