| // Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| package com.android.tools.r8.debug; |
| |
| import org.objectweb.asm.ClassWriter; |
| import org.objectweb.asm.Label; |
| import org.objectweb.asm.MethodVisitor; |
| import org.objectweb.asm.Opcodes; |
| |
| public class IincDebugTestDump implements Opcodes { |
| |
| public static final String CLASS_NAME = "IincDebugTest"; |
| public static final String DESCRIPTOR = "L" + CLASS_NAME + ";"; |
| |
| public static byte[] dump(int iRegister, int jRegister, boolean useInc) { |
| |
| ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_FRAMES | ClassWriter.COMPUTE_MAXS); |
| MethodVisitor mv; |
| |
| cw.visit(V1_8, ACC_PUBLIC + ACC_SUPER, CLASS_NAME, null, "java/lang/Object", null); |
| |
| { |
| mv = cw.visitMethod(ACC_PUBLIC + ACC_STATIC, "main", "([Ljava/lang/String;)V", null, null); |
| mv.visitCode(); |
| Label methodStart = new Label(); |
| mv.visitLabel(methodStart); |
| mv.visitLineNumber(12, methodStart); |
| mv.visitInsn(ICONST_1); |
| mv.visitVarInsn(ISTORE, iRegister); |
| Label iStart = new Label(); |
| mv.visitLabel(iStart); |
| mv.visitLineNumber(13, iStart); |
| if (useInc) { |
| assert iRegister == jRegister; |
| mv.visitIincInsn(iRegister, 1); |
| } else { |
| mv.visitVarInsn(ILOAD, iRegister); |
| mv.visitInsn(ICONST_1); |
| mv.visitInsn(IADD); |
| mv.visitVarInsn(ISTORE, jRegister); |
| } |
| Label iEnd = new Label(); |
| mv.visitLabel(iEnd); |
| mv.visitLineNumber(15, iEnd); |
| mv.visitFieldInsn(GETSTATIC, "java/lang/System", "out", "Ljava/io/PrintStream;"); |
| mv.visitVarInsn(ILOAD, jRegister); |
| mv.visitMethodInsn(INVOKEVIRTUAL, "java/io/PrintStream", "println", "(I)V", false); |
| Label l3 = new Label(); |
| mv.visitLabel(l3); |
| mv.visitLineNumber(16, l3); |
| mv.visitInsn(RETURN); |
| Label jEnd = new Label(); |
| mv.visitLabel(jEnd); |
| mv.visitLocalVariable("i", "I", null, iStart, iEnd, iRegister); |
| mv.visitLocalVariable("args", "[Ljava/lang/String;", null, methodStart, jEnd, 0); |
| mv.visitLocalVariable("j", "I", null, iEnd, jEnd, jRegister); |
| mv.visitMaxs(-1, -1); |
| mv.visitEnd(); |
| } |
| cw.visitEnd(); |
| |
| return cw.toByteArray(); |
| } |
| } |