private static void DumpCil(DevirtualisationContext context, VirtualisedMethod method) { var methodBody = method.CallerMethod.CilMethodBody; var formatter = new CilInstructionFormatter(methodBody); using (var fs = File.CreateText(Path.Combine(context.Options.OutputOptions.CilDumpsDirectory, $"function_{method.Function.EntrypointAddress:X4}.il"))) { WriteBasicInfo(fs, method); // Dump variables. var variables = ((LocalVariableSignature)methodBody.Signature?.Signature)?.Variables ?? Array.Empty <VariableSignature>(); if (variables.Count > 0) { fs.WriteLine("// Variables: "); for (int i = 0; i < variables.Count; i++) { var variable = variables[i]; fs.WriteLine($"// {i}: {variable.VariableType}"); } fs.WriteLine(); } // Dump EHs. if (methodBody.ExceptionHandlers.Count > 0) { fs.WriteLine("// Exception handlers:"); for (int i = 0; i < methodBody.ExceptionHandlers.Count; i++) { var eh = methodBody.ExceptionHandlers[i]; fs.WriteLine( "// {0, 2}: EHType: {1, -10} TryStart: {2, -10} TryEnd: {3, -10} HandlerStart: {4, -10} HandlerEnd: {5, -10} FilterStart: {6, -10} CatchType: {7}", i.ToString(), eh.HandlerType, eh.TryStart != null ? $"IL_{eh.TryStart.Offset:X4}" : "<null>", eh.TryEnd != null ? $"IL_{eh.TryEnd.Offset:X4}" : "<null>", eh.HandlerStart != null ? $"IL_{eh.HandlerStart.Offset:X4}" : "<null>", eh.HandlerEnd != null ? $"IL_{eh.HandlerEnd.Offset:X4}" : "<null>", eh.FilterStart != null ? $"IL_{eh.FilterStart.Offset:X4}" : "<null>", eh.CatchType?.FullName ?? "<null>"); } fs.WriteLine(); } // Dump instructions. foreach (var instruction in methodBody.Instructions) { fs.WriteLine(formatter.FormatInstruction(instruction)); } } }
public ShortAstFormatter(CilInstructionFormatter formatter) { _formatter = formatter; }
public CilAstFormatter(CilMethodBody methodBody) { _formatter = new CilInstructionFormatter(methodBody); }