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);
+    }
+  }
 }