Skip to content

Commit

Permalink
[cdac] Change Module data descriptor for lookup maps (#106291)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
lambdageek authored Aug 12, 2024
1 parent abdef75 commit d7a3f76
Show file tree
Hide file tree
Showing 9 changed files with 52 additions and 16 deletions.
8 changes: 6 additions & 2 deletions docs/design/datacontracts/Loader.md
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ record struct ModuleLookupTables(
TargetPointer MemberRefToDesc,
TargetPointer MethodDefToDesc,
TargetPointer TypeDefToMethodTable,
TargetPointer TypeRefToMethodTable);
TargetPointer TypeRefToMethodTable,
TargetPointer MethodDefToILCodeVersioningState);

internal struct EcmaMetadataSchema
{
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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 */));
}
```
5 changes: 5 additions & 0 deletions src/coreclr/debug/runtimeinfo/datadescriptor.h
Original file line number Diff line number Diff line change
Expand Up @@ -227,8 +227,13 @@ CDAC_TYPE_FIELD(Module, /*pointer*/, MemberRefToDescMap, cdac_data<Module>::Memb
CDAC_TYPE_FIELD(Module, /*pointer*/, MethodDefToDescMap, cdac_data<Module>::MethodDefToDescMap)
CDAC_TYPE_FIELD(Module, /*pointer*/, TypeDefToMethodTableMap, cdac_data<Module>::TypeDefToMethodTableMap)
CDAC_TYPE_FIELD(Module, /*pointer*/, TypeRefToMethodTableMap, cdac_data<Module>::TypeRefToMethodTableMap)
CDAC_TYPE_FIELD(Module, /*pointer*/, MethodDefToILCodeVersioningStateMap, cdac_data<Module>::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)
Expand Down
13 changes: 7 additions & 6 deletions src/coreclr/vm/ceeload.h
Original file line number Diff line number Diff line change
Expand Up @@ -1641,12 +1641,13 @@ struct cdac_data<Module>
static constexpr size_t DynamicMetadata = offsetof(Module, m_pDynamicMetadata);

// Lookup map pointers
static constexpr size_t FieldDefToDescMap = offsetof(Module, m_FieldDefToDescMap) + offsetof(LookupMap<PTR_FieldDesc>, pTable);
static constexpr size_t ManifestModuleReferencesMap = offsetof(Module, m_ManifestModuleReferencesMap) + offsetof(LookupMap<PTR_Module>, pTable);
static constexpr size_t MemberRefToDescMap = offsetof(Module, m_MemberRefMap) + offsetof(LookupMap<TADDR>, pTable);
static constexpr size_t MethodDefToDescMap = offsetof(Module, m_MethodDefToDescMap) + offsetof(LookupMap<PTR_MethodDesc>, pTable);
static constexpr size_t TypeDefToMethodTableMap = offsetof(Module, m_TypeDefToMethodTableMap) + offsetof(LookupMap<PTR_MethodTable>, pTable);
static constexpr size_t TypeRefToMethodTableMap = offsetof(Module, m_TypeRefToMethodTableMap) + offsetof(LookupMap<PTR_TypeRef>, 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);
};

//
Expand Down
3 changes: 2 additions & 1 deletion src/native/managed/cdacreader/src/Contracts/Loader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ internal record struct ModuleLookupTables(
TargetPointer MemberRefToDesc,
TargetPointer MethodDefToDesc,
TargetPointer TypeDefToMethodTable,
TargetPointer TypeRefToMethodTable);
TargetPointer TypeRefToMethodTable,
TargetPointer MethodDefToILCodeVersioningState);

internal struct EcmaMetadataSchema
{
Expand Down
3 changes: 2 additions & 1 deletion src/native/managed/cdacreader/src/Contracts/Loader_1.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,7 @@ ModuleLookupTables ILoader.GetLookupTables(ModuleHandle handle)
module.MemberRefToDescMap,
module.MethodDefToDescMap,
module.TypeDefToMethodTableMap,
module.TypeRefToMethodTableMap);
module.TypeRefToMethodTableMap,
module.MethodDefToILCodeVersioningStateMap);
}
}
2 changes: 2 additions & 0 deletions src/native/managed/cdacreader/src/Data/Module.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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; }
Expand All @@ -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;
Expand Down
18 changes: 18 additions & 0 deletions src/native/managed/cdacreader/src/Data/ModuleLookupMap.cs
Original file line number Diff line number Diff line change
@@ -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<ModuleLookupMap>
{
static ModuleLookupMap IData<ModuleLookupMap>.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; }
}
1 change: 1 addition & 0 deletions src/native/managed/cdacreader/src/DataType.cs
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ public enum DataType
ExceptionInfo,
RuntimeThreadLocals,
Module,
ModuleLookupMap,
MethodTable,
EEClass,
ArrayClass,
Expand Down
15 changes: 9 additions & 6 deletions src/native/managed/cdacreader/src/Legacy/SOSDacImpl.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down

0 comments on commit d7a3f76

Please sign in to comment.