Ejemplo n.º 1
0
        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));
                }
            }
        }
Ejemplo n.º 2
0
 public ShortAstFormatter(CilInstructionFormatter formatter)
 {
     _formatter = formatter;
 }
Ejemplo n.º 3
0
 public CilAstFormatter(CilMethodBody methodBody)
 {
     _formatter = new CilInstructionFormatter(methodBody);
 }