From 243b1332dc4ef934a05a2ed00054ec63b1a1e1b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Sim=C3=B5es?= Date: Sat, 1 Feb 2020 11:35:14 +0000 Subject: [PATCH] Several fixes in signature generation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove wrong entries in Primitives dictionary. - Fix output of method parameters types. - Fix output of dump CLR types. - Add extra output to native MDP dumper (to output IL count for each method). Signed-off-by: José Simões --- .../Tables/nanoSignaturesTable.cs | 9 +---- .../Utility/NativeMethodsCrc.cs | 21 +++++++++- .../Utility/nanoCLR_DataType.cs | 2 +- .../Utility/nanoSerializationType.cs | 2 +- .../nanoDumperGenerator.cs | 7 +++- .../Tools.Parser/AssemblyParserDump.cpp | 40 +++++++++++++++---- 6 files changed, 61 insertions(+), 20 deletions(-) diff --git a/source/MetadataProcessor.Core/Tables/nanoSignaturesTable.cs b/source/MetadataProcessor.Core/Tables/nanoSignaturesTable.cs index 62fafc11..cabd0f9c 100644 --- a/source/MetadataProcessor.Core/Tables/nanoSignaturesTable.cs +++ b/source/MetadataProcessor.Core/Tables/nanoSignaturesTable.cs @@ -46,7 +46,7 @@ public int GetHashCode(byte[] that) static nanoSignaturesTable() { - PrimitiveTypes.Add(typeof(void).FullName, nanoCLR_DataType.DATATYPE_VALUETYPE); + PrimitiveTypes.Add(typeof(void).FullName, nanoCLR_DataType.DATATYPE_VOID); PrimitiveTypes.Add(typeof(sbyte).FullName, nanoCLR_DataType.DATATYPE_I1); PrimitiveTypes.Add(typeof(short).FullName, nanoCLR_DataType.DATATYPE_I2); @@ -69,13 +69,6 @@ static nanoSignaturesTable() PrimitiveTypes.Add(typeof(IntPtr).FullName, nanoCLR_DataType.DATATYPE_VALUETYPE); //PrimitiveTypes.Add(typeof(UIntPtr).FullName, nanoCLR_DataType.DATATYPE_U4); - PrimitiveTypes.Add("System.DateTime", nanoCLR_DataType.DATATYPE_DATETIME); - PrimitiveTypes.Add("System.TimeSpan", nanoCLR_DataType.DATATYPE_TIMESPAN); - - PrimitiveTypes.Add("System.RuntimeTypeHandle", nanoCLR_DataType.DATATYPE_REFLECTION); - PrimitiveTypes.Add("System.RuntimeFieldHandle", nanoCLR_DataType.DATATYPE_REFLECTION); - PrimitiveTypes.Add("System.RuntimeMethodHandle", nanoCLR_DataType.DATATYPE_REFLECTION); - PrimitiveTypes.Add("System.WeakReference", nanoCLR_DataType.DATATYPE_WEAKCLASS); } diff --git a/source/MetadataProcessor.Core/Utility/NativeMethodsCrc.cs b/source/MetadataProcessor.Core/Utility/NativeMethodsCrc.cs index 1c388553..01d6c331 100644 --- a/source/MetadataProcessor.Core/Utility/NativeMethodsCrc.cs +++ b/source/MetadataProcessor.Core/Utility/NativeMethodsCrc.cs @@ -126,7 +126,26 @@ internal static string GetnanoClrTypeName(TypeReference parameterType) nanoCLR_DataType myType; if(nanoSignaturesTable.PrimitiveTypes.TryGetValue(parameterType.FullName, out myType)) { - return myType.ToString(); + if (myType == nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE) + { + return "DATATYPE_STRING"; + } + else if (myType == nanoCLR_DataType.DATATYPE_LAST_NONPOINTER) + { + return "DATATYPE_TIMESPAN"; + } + else if (myType == nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE_TO_MARSHAL) + { + return "DATATYPE_TIMESPAN"; + } + else if (myType == nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE_TO_PRESERVE) + { + return "DATATYPE_R8"; + } + else + { + return myType.ToString(); + } } else { diff --git a/source/MetadataProcessor.Core/Utility/nanoCLR_DataType.cs b/source/MetadataProcessor.Core/Utility/nanoCLR_DataType.cs index aa92c752..f76d0b38 100644 --- a/source/MetadataProcessor.Core/Utility/nanoCLR_DataType.cs +++ b/source/MetadataProcessor.Core/Utility/nanoCLR_DataType.cs @@ -38,7 +38,7 @@ public enum nanoCLR_DataType : byte // All the above types can be marshaled by assignment. #if NANOCLR_NO_ASSEMBLY_STRINGS - DATATYPE_LAST_PRIMITIVE_TO_MARSHAL = DATATYPE_STRING, + DATATYPE_LAST_PRIMITIVE_TO_MARSHAL = DATATYPE_STRING, #else DATATYPE_LAST_PRIMITIVE_TO_MARSHAL = DATATYPE_TIMESPAN, #endif diff --git a/source/MetadataProcessor.Core/Utility/nanoSerializationType.cs b/source/MetadataProcessor.Core/Utility/nanoSerializationType.cs index 050b8018..2826e7bc 100644 --- a/source/MetadataProcessor.Core/Utility/nanoSerializationType.cs +++ b/source/MetadataProcessor.Core/Utility/nanoSerializationType.cs @@ -29,7 +29,7 @@ internal enum nanoSerializationType : byte ELEMENT_TYPE_STRING = 0xe, // every type above PTR will be simple type - ELEMENT_TYPE_PTR = 0xf, // PTR + ELEMENT_TYPE_PTR = 0x0F, // PTR ELEMENT_TYPE_BYREF = 0x10, // BYREF // Please use ELEMENT_TYPE_VALUETYPE. ELEMENT_TYPE_VALUECLASS is deprecated. diff --git a/source/MetadataProcessor.Core/nanoDumperGenerator.cs b/source/MetadataProcessor.Core/nanoDumperGenerator.cs index 7465b934..5abd9b99 100644 --- a/source/MetadataProcessor.Core/nanoDumperGenerator.cs +++ b/source/MetadataProcessor.Core/nanoDumperGenerator.cs @@ -292,10 +292,15 @@ private string PrintSignatureForType(TypeReference type) case nanoCLR_DataType.DATATYPE_U8: case nanoCLR_DataType.DATATYPE_R4: case nanoCLR_DataType.DATATYPE_R8: - case nanoCLR_DataType.DATATYPE_STRING: case nanoCLR_DataType.DATATYPE_BYREF: case nanoCLR_DataType.DATATYPE_OBJECT: return dataType.ToString().Replace("DATATYPE_", ""); + + case nanoCLR_DataType.DATATYPE_LAST_PRIMITIVE: + return "STRING"; + + case nanoCLR_DataType.DATATYPE_REFLECTION: + return type.FullName.Replace(".", ""); } } diff --git a/source/native/Tools.Parser/AssemblyParserDump.cpp b/source/native/Tools.Parser/AssemblyParserDump.cpp index bf4baed5..d70ae7a7 100644 --- a/source/native/Tools.Parser/AssemblyParserDump.cpp +++ b/source/native/Tools.Parser/AssemblyParserDump.cpp @@ -493,36 +493,60 @@ void MetaData::Parser::Dump_EnumTypeDefs( bool fNoByteCode ) const CLR_UINT8* IP = il.Code; const CLR_UINT8* IPend = IP + il.GetCodeSize(); + CLR_UINT16 ilCount = 0; + + // 1st pass: count the number of instructions while(IP < IPend) { CLR_OPCODE op = CLR_ReadNextOpcode( IP ); - fwprintf( m_output, L" %-12S", c_CLR_RT_OpcodeLookup[op].m_name ); - if(IsOpParamToken( c_CLR_RT_OpcodeLookup[op].m_opParam )) { CLR_UINT32 arg; NANOCLR_READ_UNALIGNED_UINT32( arg, IP ); - - fwprintf( m_output, L"[%08x]", arg ); } else { IP = CLR_SkipBodyOfOpcode( IP, op ); } - fwprintf( m_output, L"\n" ); + ilCount++; } + + fwprintf(m_output, L" IL count: %d\n", ilCount); + + IP = il.Code; + IPend = IP + il.GetCodeSize(); + + // 2nd pass: output the instructions + while (IP < IPend) + { + CLR_OPCODE op = CLR_ReadNextOpcode(IP); + + fwprintf(m_output, L" %-12S", c_CLR_RT_OpcodeLookup[op].m_name); + + if (IsOpParamToken(c_CLR_RT_OpcodeLookup[op].m_opParam)) + { + CLR_UINT32 arg; NANOCLR_READ_UNALIGNED_UINT32(arg, IP); + + fwprintf(m_output, L"[%08x]", arg); + } + else + { + IP = CLR_SkipBodyOfOpcode(IP, op); + } + + fwprintf(m_output, L"\n"); + } + } } - - fwprintf( m_output, L"\n" ); } for(mdInterfaceImplListIter it3 = td.m_interfaces.begin(); it3 != td.m_interfaces.end(); it3++) { InterfaceImpl& ii = m_mapDef_Interface[*it3]; - fwprintf( m_output, L" InterfaceImplProps [%08x]: Itf: %08x\n", ii.m_td, ii.m_itf ); + fwprintf( m_output, L" InterfaceImplProps [%08x]: Itf: %08x\n", *it3, ii.m_itf ); } fwprintf( m_output, L"\n" );