From 051ac447590e4f9eed216d4e58b1eb58f29a6a44 Mon Sep 17 00:00:00 2001 From: Dmitry Petrov Date: Mon, 3 Jul 2017 11:58:39 +0300 Subject: [PATCH] Verify bytecode after mandatory transformations and after optimizations --- .../codegen/optimization/MethodVerifier.kt | 32 +++++++++++++++++++ .../optimization/OptimizationMethodVisitor.kt | 8 +++-- 2 files changed, 38 insertions(+), 2 deletions(-) create mode 100644 compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/MethodVerifier.kt diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/MethodVerifier.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/MethodVerifier.kt new file mode 100644 index 00000000000..27354d1e6fa --- /dev/null +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/MethodVerifier.kt @@ -0,0 +1,32 @@ +/* + * Copyright 2010-2017 JetBrains s.r.o. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.codegen.optimization + +import org.jetbrains.kotlin.codegen.optimization.transformer.MethodTransformer +import org.jetbrains.org.objectweb.asm.tree.MethodNode +import org.jetbrains.org.objectweb.asm.tree.analysis.BasicVerifier + +class MethodVerifier(private val checkPoint: String) : MethodTransformer() { + override fun transform(internalClassName: String, methodNode: MethodNode) { + try { + analyze(internalClassName, methodNode, BasicVerifier()) + } + catch (e: Throwable) { + throw AssertionError("$checkPoint: incorrect bytecode", e) + } + } +} diff --git a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt index 3deb32fde70..33c62a48c77 100644 --- a/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt +++ b/compiler/backend/src/org/jetbrains/kotlin/codegen/optimization/OptimizationMethodVisitor.kt @@ -47,7 +47,10 @@ class OptimizationMethodVisitor( companion object { private val MEMORY_LIMIT_BY_METHOD_MB = 50 - private val MANDATORY_METHOD_TRANSFORMER = FixStackWithLabelNormalizationMethodTransformer() + private val MANDATORY_METHOD_TRANSFORMER = CompositeMethodTransformer( + FixStackWithLabelNormalizationMethodTransformer(), + MethodVerifier("AFTER mandatory stack transformations") + ) private val OPTIMIZATION_TRANSFORMER = CompositeMethodTransformer( CapturedVarsOptimizationMethodTransformer(), @@ -59,7 +62,8 @@ class OptimizationMethodVisitor( PopBackwardPropagationTransformer(), DeadCodeEliminationMethodTransformer(), RedundantGotoMethodTransformer(), - RedundantNopsCleanupMethodTransformer() + RedundantNopsCleanupMethodTransformer(), + MethodVerifier("AFTER optimizations") ) fun canBeOptimized(node: MethodNode): Boolean {