Browse Source

Show header size in IL output.

pull/2491/head
Siegfried Pammer 4 years ago
parent
commit
48adb52489
  1. 16
      ICSharpCode.Decompiler/Disassembler/ILParser.cs
  2. 9
      ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs

16
ICSharpCode.Decompiler/Disassembler/ILParser.cs

@ -107,5 +107,21 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -107,5 +107,21 @@ namespace ICSharpCode.Decompiler.Disassembler
{
return opCode == ILOpCode.Ret || opCode == ILOpCode.Endfilter || opCode == ILOpCode.Endfinally;
}
public static int GetHeaderSize(BlobReader bodyBlockReader)
{
byte header = bodyBlockReader.ReadByte();
if ((header & 3) == 3)
{
// fat
ushort largeHeader = (ushort)((bodyBlockReader.ReadByte() << 8) | header);
return (byte)(largeHeader >> 12) * 4;
}
else
{
// tiny
return 1;
}
}
}
}

9
ICSharpCode.Decompiler/Disassembler/MethodBodyDisassembler.cs

@ -90,15 +90,18 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -90,15 +90,18 @@ namespace ICSharpCode.Decompiler.Disassembler
output.WriteLine("// Method begins at RVA 0x{0:x4}", methodDefinition.RelativeVirtualAddress);
if (methodDefinition.RelativeVirtualAddress == 0)
{
output.WriteLine("// Code size {0} (0x{0:x})", 0);
output.WriteLine("// Header size: {0}", 0);
output.WriteLine("// Code size: {0} (0x{0:x})", 0);
output.WriteLine(".maxstack {0}", 0);
output.WriteLine();
return;
}
MethodBodyBlock body;
BlobReader bodyBlockReader;
try
{
body = module.Reader.GetMethodBody(methodDefinition.RelativeVirtualAddress);
bodyBlockReader = module.Reader.GetSectionData(methodDefinition.RelativeVirtualAddress).GetReader();
}
catch (BadImageFormatException ex)
{
@ -106,7 +109,9 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -106,7 +109,9 @@ namespace ICSharpCode.Decompiler.Disassembler
return;
}
var blob = body.GetILReader();
output.WriteLine("// Code size {0} (0x{0:x})", blob.Length);
int headerSize = ILParser.GetHeaderSize(bodyBlockReader);
output.WriteLine("// Header size: {0}", headerSize);
output.WriteLine("// Code size: {0} (0x{0:x})", blob.Length);
output.WriteLine(".maxstack {0}", body.MaxStack);
var entrypointHandle = MetadataTokens.MethodDefinitionHandle(module.Reader.PEHeaders.CorHeader.EntryPointTokenOrRelativeVirtualAddress);

Loading…
Cancel
Save