From 362c66462a00adf9dee647487ac33242b93c98f5 Mon Sep 17 00:00:00 2001 From: Tomas Date: Mon, 22 Feb 2021 02:44:36 +0100 Subject: [PATCH 1/2] Initial implementation of JIT assembly name helpers --- .../tools/Common/JitInterface/CorInfoImpl.cs | 39 +++++++++++++++++-- 1 file changed, 36 insertions(+), 3 deletions(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index cb7e7000b1076a..48d98c539eb22d 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -7,6 +7,7 @@ using System.Diagnostics; using System.IO; using System.Text; +using System.Text.Encodings; using System.Reflection.Metadata; using System.Runtime.CompilerServices; using System.Runtime.ExceptionServices; @@ -1636,11 +1637,43 @@ private bool isStructRequiringStackAllocRetBuf(CORINFO_CLASS_STRUCT_* cls) } private CORINFO_MODULE_STRUCT_* getClassModule(CORINFO_CLASS_STRUCT_* cls) - { throw new NotImplementedException("getClassModule"); } + { + TypeDesc type = HandleToObject(cls).GetTypeDefinition(); + foreach (MethodDesc method in type.GetAllMethods()) + { + MethodIL methodIL = _compilation.GetMethodIL(method); + if (methodIL != null) + { + return ObjectToHandle(methodIL); + } + } + return null; + } + private CORINFO_ASSEMBLY_STRUCT_* getModuleAssembly(CORINFO_MODULE_STRUCT_* mod) - { throw new NotImplementedException("getModuleAssembly"); } + { + MethodIL methodIL = HandleToObject(mod); + EcmaMethod method = methodIL.OwningMethod.GetTypicalMethodDefinition() as EcmaMethod; + IAssemblyDesc assembly = method?.Module.Assembly; + + return (CORINFO_ASSEMBLY_STRUCT_*)ObjectToHandle(assembly); + } + + private Dictionary _assemblyNameCache = new Dictionary(); + private UTF8Encoding _assemblyNameEncoding = new UTF8Encoding(); + private byte* getAssemblyName(CORINFO_ASSEMBLY_STRUCT_* assem) - { throw new NotImplementedException("getAssemblyName"); } + { + IAssemblyDesc assembly = (IAssemblyDesc)HandleToObject((IntPtr)assem); + string assemblyName = assembly.GetName().Name; + if (!_assemblyNameCache.TryGetValue(assemblyName, out IntPtr pinnedAssemblyName)) + { + byte[] encodedName = _assemblyNameEncoding.GetBytes(assemblyName); + pinnedAssemblyName = GetPin(encodedName); + _assemblyNameCache.Add(assemblyName, pinnedAssemblyName); + } + return (byte *)pinnedAssemblyName; + } private void* LongLifetimeMalloc(UIntPtr sz) { From 6c607bad9b854eb975d09a2f46c6cdd427f6e768 Mon Sep 17 00:00:00 2001 From: Tomas Date: Mon, 22 Feb 2021 23:49:06 +0100 Subject: [PATCH 2/2] Remove assembly name cache per JanK's PR feedback --- src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs index 48d98c539eb22d..25e3aec1712752 100644 --- a/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs +++ b/src/coreclr/tools/Common/JitInterface/CorInfoImpl.cs @@ -1659,20 +1659,10 @@ private bool isStructRequiringStackAllocRetBuf(CORINFO_CLASS_STRUCT_* cls) return (CORINFO_ASSEMBLY_STRUCT_*)ObjectToHandle(assembly); } - private Dictionary _assemblyNameCache = new Dictionary(); - private UTF8Encoding _assemblyNameEncoding = new UTF8Encoding(); - private byte* getAssemblyName(CORINFO_ASSEMBLY_STRUCT_* assem) { IAssemblyDesc assembly = (IAssemblyDesc)HandleToObject((IntPtr)assem); - string assemblyName = assembly.GetName().Name; - if (!_assemblyNameCache.TryGetValue(assemblyName, out IntPtr pinnedAssemblyName)) - { - byte[] encodedName = _assemblyNameEncoding.GetBytes(assemblyName); - pinnedAssemblyName = GetPin(encodedName); - _assemblyNameCache.Add(assemblyName, pinnedAssemblyName); - } - return (byte *)pinnedAssemblyName; + return (byte *)GetPin(StringToUTF8(assembly.GetName().Name)); } private void* LongLifetimeMalloc(UIntPtr sz)