Browse Source

Using the structured signature

pull/1991/head
Andrew Au 5 years ago
parent
commit
b935b4d065
  1. 38
      ILSpy.ReadyToRun/ReadyToRunLanguage.cs

38
ILSpy.ReadyToRun/ReadyToRunLanguage.cs

@ -22,6 +22,7 @@ using System.ComponentModel.Composition; @@ -22,6 +22,7 @@ using System.ComponentModel.Composition;
using System.Diagnostics;
using System.Linq;
using System.Reflection.Metadata;
using System.Reflection.Metadata.Ecma335;
using System.Reflection.PortableExecutable;
using System.Runtime.CompilerServices;
using Iced.Intel;
@ -128,14 +129,16 @@ namespace ICSharpCode.ILSpy.ReadyToRun @@ -128,14 +129,16 @@ namespace ICSharpCode.ILSpy.ReadyToRun
var tempOutput = new StringOutput();
foreach (var instr in instructions) {
int byteBaseIndex = (int)(instr.IP - address);
foreach (var bound in runtimeFunction.DebugInfo.BoundsList) {
if (bound.NativeOffset == byteBaseIndex) {
if (bound.ILOffset == (uint)DebugInfoBoundsType.Prolog) {
WriteCommentLine(output, "Prolog");
} else if (bound.ILOffset == (uint)DebugInfoBoundsType.Epilog) {
WriteCommentLine(output, "Epilog");
} else {
WriteCommentLine(output, $"IL_{bound.ILOffset:x4}");
if (runtimeFunction.DebugInfo != null) {
foreach (var bound in runtimeFunction.DebugInfo.BoundsList) {
if (bound.NativeOffset == byteBaseIndex) {
if (bound.ILOffset == (uint)DebugInfoBoundsType.Prolog) {
WriteCommentLine(output, "Prolog");
} else if (bound.ILOffset == (uint)DebugInfoBoundsType.Epilog) {
WriteCommentLine(output, "Epilog");
} else {
WriteCommentLine(output, $"IL_{bound.ILOffset:x4}");
}
}
}
}
@ -150,11 +153,22 @@ namespace ICSharpCode.ILSpy.ReadyToRun @@ -150,11 +153,22 @@ namespace ICSharpCode.ILSpy.ReadyToRun
output.Write(" ");
output.Write(" ");
output.Write(tempOutput.ToStringAndReset());
if (instr.IsCallNearIndirect && reader.ImportCellNames.ContainsKey((int)instr.IPRelativeMemoryAddress)) {
int importCellAddress = (int)instr.IPRelativeMemoryAddress;
if (instr.IsCallNearIndirect && reader.ImportCellNames.ContainsKey(importCellAddress)) {
output.Write(" ;");
// TODO: Get the right PEFile
// TODO: Get the right method def token
output.WriteReference(method.ParentModule.PEFile, System.Reflection.Metadata.Ecma335.MetadataTokens.Handle(0x06001e24), reader.ImportCellNames[(int)instr.IPRelativeMemoryAddress]);
ReadyToRunSignature signature = reader.ImportSignatures[(int)instr.IPRelativeMemoryAddress];
string formattedSignatureString = reader.ImportCellNames[importCellAddress];
MethodDefEntrySignature methodDefSignature = signature as MethodDefEntrySignature;
MethodRefEntrySignature methodRefSignature = signature as MethodRefEntrySignature;
if (methodDefSignature != null) {
int methodDefToken = unchecked((int)methodDefSignature.MethodDefToken);
output.WriteReference(method.ParentModule.PEFile, MetadataTokens.Handle(methodDefToken), formattedSignatureString);
} else if (methodRefSignature != null) {
int methodRefToken = unchecked((int)methodRefSignature.MethodRefToken);
output.WriteReference(method.ParentModule.PEFile, MetadataTokens.Handle(methodRefToken), formattedSignatureString);
} else {
output.WriteLine(formattedSignatureString);
}
output.WriteLine();
} else {
output.WriteLine();

Loading…
Cancel
Save