[MappingCompose] Use original proguard map if map-version not supported
Change-Id: Ibc464813ad412856bea84286a8fbfcd7dabb20f9
diff --git a/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java
index b961f22..0181e06 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/LineNumberOptimizer.java
@@ -20,10 +20,13 @@
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.naming.ClassNameMapper;
+import com.android.tools.r8.naming.MapVersion;
import com.android.tools.r8.naming.MappingComposeException;
import com.android.tools.r8.naming.MappingComposer;
import com.android.tools.r8.naming.ProguardMapSupplier;
import com.android.tools.r8.naming.ProguardMapSupplier.ProguardMapId;
+import com.android.tools.r8.naming.mappinginformation.MapVersionMappingInformation;
+import com.android.tools.r8.naming.mappinginformation.ResidualSignatureMappingInformation;
import com.android.tools.r8.shaking.KeepInfoCollection;
import com.android.tools.r8.utils.AndroidApp;
import com.android.tools.r8.utils.CfLineToMethodMapper;
@@ -44,6 +47,15 @@
OriginalSourceFiles originalSourceFiles,
DebugRepresentationPredicate representation) {
assert appView.options().proguardMapConsumer != null;
+ if (shouldEmitOriginalMappingFile(appView)) {
+ appView.options().reporter.warning(new NotSupportedMapVersionForMappingComposeDiagnostic());
+ timing.begin("Write proguard map");
+ ProguardMapId proguardMapId =
+ ProguardMapSupplier.create(appView.appInfo().app().getProguardMap(), appView.options())
+ .writeProguardMap();
+ timing.end();
+ return proguardMapId;
+ }
// When line number optimization is turned off the identity mapping for line numbers is
// used. We still run the line number optimizer to collect line numbers and inline frame
// information for the mapping file.
@@ -72,6 +84,21 @@
return mapId;
}
+ private static boolean shouldEmitOriginalMappingFile(AppView<?> appView) {
+ if (!appView.options().mappingComposeOptions().enableExperimentalMappingComposition
+ || appView.appInfo().app().getProguardMap() == null) {
+ return false;
+ }
+ MapVersionMappingInformation mapVersionInfo =
+ appView.appInfo().app().getProguardMap().getFirstMapVersionInformation();
+ if (mapVersionInfo == null) {
+ return true;
+ }
+ MapVersion newMapVersion = mapVersionInfo.getMapVersion();
+ return !ResidualSignatureMappingInformation.isSupported(newMapVersion)
+ || newMapVersion.isUnknown();
+ }
+
public static ClassNameMapper run(
AppView<?> appView,
AndroidApp inputApp,
diff --git a/src/main/java/com/android/tools/r8/utils/positions/NotSupportedMapVersionForMappingComposeDiagnostic.java b/src/main/java/com/android/tools/r8/utils/positions/NotSupportedMapVersionForMappingComposeDiagnostic.java
new file mode 100644
index 0000000..285046c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/positions/NotSupportedMapVersionForMappingComposeDiagnostic.java
@@ -0,0 +1,30 @@
+// Copyright (c) 2023, 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.utils.positions;
+
+import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.Keep;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+
+@Keep
+public class NotSupportedMapVersionForMappingComposeDiagnostic implements Diagnostic {
+
+ @Override
+ public Origin getOrigin() {
+ return Origin.unknown();
+ }
+
+ @Override
+ public Position getPosition() {
+ return Position.UNKNOWN;
+ }
+
+ @Override
+ public String getDiagnosticMessage() {
+ return "The input map file version is either unknown or less than version 2.2. For having line "
+ + "numbers optimized by D8 you would need to pass a mapping file of version 2.2. or later.";
+ }
+}