| // Copyright (c) 2020, 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.graph; |
| |
| import com.android.tools.r8.cf.code.CfInstruction; |
| import com.android.tools.r8.origin.Origin; |
| |
| public class CfCodeStackMapValidatingException extends RuntimeException { |
| |
| private CfCodeStackMapValidatingException(String message) { |
| super(message); |
| } |
| |
| public static CfCodeStackMapValidatingException error(String message) { |
| return new CfCodeStackMapValidatingException(message); |
| } |
| |
| public static CfCodeDiagnostics unexpectedStackMapFrame( |
| Origin origin, DexMethod method, AppView<?> appView) { |
| StringBuilder sb = new StringBuilder("Unexpected stack map frame without target"); |
| if (appView.enableWholeProgramOptimizations()) { |
| sb.append(" In later version of R8, the method may be assumed not reachable."); |
| } |
| return new CfCodeDiagnostics(origin, method, sb.toString()); |
| } |
| |
| public static CfCodeDiagnostics multipleFramesForLabel( |
| Origin origin, DexMethod method, AppView<?> appView) { |
| StringBuilder sb = new StringBuilder("Multiple frames for label"); |
| if (appView.enableWholeProgramOptimizations()) { |
| sb.append(" In later version of R8, the method may be assumed not reachable."); |
| } |
| return new CfCodeDiagnostics(origin, method, sb.toString()); |
| } |
| |
| public static CfCodeDiagnostics noFramesForMethodWithJumps( |
| Origin origin, DexMethod method, AppView<?> appView) { |
| StringBuilder sb = |
| new StringBuilder("Expected stack map table for method with non-linear control flow."); |
| if (appView.enableWholeProgramOptimizations()) { |
| sb.append(" In later version of R8, the method may be assumed not reachable."); |
| } |
| return new CfCodeDiagnostics(origin, method, sb.toString()); |
| } |
| |
| public static CfCodeDiagnostics toDiagnostics( |
| Origin origin, |
| DexMethod method, |
| int instructionIndex, |
| CfInstruction instruction, |
| String detailMessage, |
| AppView<?> appView) { |
| StringBuilder sb = |
| new StringBuilder("Invalid stack map table at ") |
| .append(instructionIndex) |
| .append(": ") |
| .append(instruction) |
| .append(", error: ") |
| .append(detailMessage) |
| .append("."); |
| if (appView.enableWholeProgramOptimizations()) { |
| sb.append(" In later version of R8, the method may be assumed not reachable."); |
| } |
| return new CfCodeDiagnostics(origin, method, sb.toString()); |
| } |
| } |