Move DispatchMap pointer to MethodTable (#85698)
authorMichal Strehovský <MichalStrehovsky@users.noreply.github.com>
Wed, 3 May 2023 13:49:18 +0000 (22:49 +0900)
committerGitHub <noreply@github.com>
Wed, 3 May 2023 13:49:18 +0000 (06:49 -0700)
commitb412b6b83a36d02e11fb5987fa815c3eb43afda9
tree91d19e7dfaa0507b788fb8d044320db8c8b93c2e
parentedd6d6326f853be985172c3b7514acf33675ec82
Move DispatchMap pointer to MethodTable (#85698)

Sending this for consideration. The old approach also had an advantage. Wouldn't be the end of the world if we keep that.

Before this PR, accessing dispatch map involved:
* Reading optional fields to find the field with the right tag
* The optional field contained an integer index into a table
* The index was used to index into a dispatch map table to find a pointer to the actual dispatch map
* We then followed the pointer to get to the dispatch map.

The advantage of this scheme is smaller working set (MethodTable is smaller), but this assumes the MethodTable has other optional fields (because we still need a pointer to the optional fields). Turns out most MethodTables only need optional fields pointer because of the dispatch map and if we move them to MethodTable, we no longer need an optional field pointer.

This PR simply moves the dispatch map pointer to MethodTable.

I'm seeing another 15 kB saving on BasicMinimalApi. Plus the code looks simpler.
13 files changed:
src/coreclr/nativeaot/Common/src/Internal/Runtime/MethodTable.cs
src/coreclr/nativeaot/Common/src/Internal/Runtime/TypeManagerHandle.cs
src/coreclr/nativeaot/Runtime/TypeManager.cpp
src/coreclr/nativeaot/Runtime/TypeManager.h
src/coreclr/nativeaot/Runtime/inc/ModuleHeaders.h
src/coreclr/nativeaot/System.Private.TypeLoader/src/Internal/Runtime/TypeLoader/EETypeCreator.cs
src/coreclr/tools/Common/Internal/Runtime/MethodTable.Constants.cs
src/coreclr/tools/Common/Internal/Runtime/ModuleHeaders.cs
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/CanonicalEETypeNode.cs
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/ConstructedEETypeNode.cs
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/EETypeNode.cs
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/InterfaceDispatchMapNode.cs
src/coreclr/tools/aot/ILCompiler.Compiler/Compiler/DependencyAnalysis/NodeFactory.cs