Version 2.0.48
Cherry pick: Reland "Retain runtime exception when amending origin information."
CL: https://r8-review.googlesource.com/c/r8/+/49584
Bug: 151041137
Change-Id: Iab6d89b4d90039fda0c993a923ef5046c2387853
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index edc6674..6a23a85 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
// This field is accessed from release scripts using simple pattern matching.
// Therefore, changing this field could break our release scripts.
- public static final String LABEL = "2.0.47";
+ public static final String LABEL = "2.0.48";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/errors/CompilationError.java b/src/main/java/com/android/tools/r8/errors/CompilationError.java
index d165596..ccefc7b 100644
--- a/src/main/java/com/android/tools/r8/errors/CompilationError.java
+++ b/src/main/java/com/android/tools/r8/errors/CompilationError.java
@@ -40,6 +40,14 @@
this.position = position;
}
+ public Origin getOrigin() {
+ return origin;
+ }
+
+ public Position getPosition() {
+ return position;
+ }
+
public CompilationError withAdditionalOriginAndPositionInfo(Origin origin, Position position) {
if (this.origin == Origin.unknown() || this.position == Position.UNKNOWN) {
return new CompilationError(
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 650c757..54d65ab 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -90,6 +90,7 @@
import com.android.tools.r8.shaking.MainDexClasses;
import com.android.tools.r8.utils.CfgPrinter;
import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.ExceptionUtils;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.InternalOptions.OutlineOptions;
import com.android.tools.r8.utils.StringDiagnostic;
@@ -1061,18 +1062,13 @@
private void rewriteCode(
DexEncodedMethod method, OptimizationFeedback feedback, MethodProcessor methodProcessor) {
Origin origin = appView.appInfo().originFor(method.method.holder);
- try {
- rewriteCodeInternal(method, feedback, methodProcessor, origin);
- } catch (CompilationError e) {
- // If rewriting throws a compilation error, attach the origin and method if missing.
- throw e.withAdditionalOriginAndPositionInfo(origin, new MethodPosition(method.method));
- } catch (NullPointerException e) {
- throw new CompilationError(
- "NullPointerException during IR Conversion",
- e,
- origin,
- new MethodPosition(method.method));
- }
+ ExceptionUtils.withOriginAttachmentHandler(
+ origin,
+ new MethodPosition(method.method),
+ () -> {
+ rewriteCodeInternal(method, feedback, methodProcessor, origin);
+ return null;
+ });
}
private void rewriteCodeInternal(
diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java b/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
index 78d47c2..4dc6d48 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
@@ -18,10 +18,16 @@
public class ExceptionDiagnostic extends DiagnosticWithThrowable {
private final Origin origin;
+ private final Position position;
- public ExceptionDiagnostic(Throwable e, Origin origin) {
+ public ExceptionDiagnostic(Throwable e, Origin origin, Position position) {
super(e);
this.origin = origin;
+ this.position = position;
+ }
+
+ public ExceptionDiagnostic(Throwable e, Origin origin) {
+ this(e, origin, Position.UNKNOWN);
}
public ExceptionDiagnostic(ResourceException e) {
@@ -35,7 +41,7 @@
@Override
public Position getPosition() {
- return Position.UNKNOWN;
+ return position;
}
@Override
diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
index d12c2a4..79e3818 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionUtils.java
@@ -11,12 +11,14 @@
import com.android.tools.r8.errors.CompilationError;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
+import com.android.tools.r8.position.Position;
import com.google.common.collect.ObjectArrays;
import java.io.IOException;
import java.nio.file.FileSystemException;
import java.nio.file.Paths;
import java.util.concurrent.ExecutionException;
import java.util.function.Consumer;
+import java.util.function.Supplier;
public abstract class ExceptionUtils {
@@ -68,7 +70,7 @@
} catch (IOException e) {
throw reporter.fatalError(new ExceptionDiagnostic(e, extractIOExceptionOrigin(e)));
} catch (CompilationError e) {
- throw reporter.fatalError(e.toStringDiagnostic());
+ throw reporter.fatalError(new ExceptionDiagnostic(e, e.getOrigin(), e.getPosition()));
} catch (ResourceException e) {
throw reporter.fatalError(new ExceptionDiagnostic(e, e.getOrigin()));
} catch (AssertionError e) {
@@ -132,4 +134,15 @@
throw new RuntimeException(executionException.getMessage(), cause);
}
}
+
+ public static <T> T withOriginAttachmentHandler(
+ Origin origin, Position position, Supplier<T> action) {
+ try {
+ return action.get();
+ } catch (CompilationError e) {
+ throw e.withAdditionalOriginAndPositionInfo(origin, position);
+ } catch (RuntimeException e) {
+ throw new CompilationError(e.getMessage(), e, origin, position);
+ }
+ }
}