Don't use reflective lookups for art profile rewriting in compiledump
Bug: b/377606434
Change-Id: I87d70c812be7bc96486c5901e910600e2ec27154
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java b/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java
index 12e971a..54f2ff4 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpBase.java
@@ -4,6 +4,8 @@
package com.android.tools.r8.utils;
+import com.android.tools.r8.BaseCompilerCommand;
+import com.android.tools.r8.utils.compiledump.ArtProfileDumpUtils;
import java.io.IOException;
import java.lang.reflect.Method;
import java.nio.file.Files;
@@ -12,6 +14,7 @@
import java.util.Collection;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.function.Consumer;
import java.util.function.Function;
@@ -34,26 +37,14 @@
.accept(new Object[] {isolatedSplits});
}
- static void addArtProfilesForRewriting(Object builder, Map<Path, Path> artProfileFiles) {
- try {
- Class<?> artProfileProviderClass =
- Class.forName("com.android.tools.r8.profile.art.ArtProfileProvider");
- Class<?> artProfileConsumerClass =
- Class.forName("com.android.tools.r8.profile.art.ArtProfileConsumer");
- artProfileFiles.forEach(
- (artProfile, residualArtProfile) ->
- getReflectiveBuilderMethod(
- builder,
- "addArtProfileForRewriting",
- artProfileProviderClass,
- artProfileConsumerClass)
- .accept(
- new Object[] {
- createArtProfileProvider(artProfile),
- createResidualArtProfileConsumer(residualArtProfile)
- }));
- } catch (ClassNotFoundException e) {
- // Ignore.
+ static void addArtProfilesForRewriting(
+ BaseCompilerCommand.Builder<?, ?> builder, Map<Path, Path> artProfileFiles) {
+ for (Entry<Path, Path> inputOutput : artProfileFiles.entrySet()) {
+ runIgnoreMissing(
+ () ->
+ ArtProfileDumpUtils.addArtProfileForRewriting(
+ inputOutput.getKey(), inputOutput.getValue(), builder),
+ "Unable to setup art profile rewriting for " + inputOutput.getKey());
}
}
@@ -62,36 +53,6 @@
.accept(new Object[] {createStartupProfileProviders(startupProfileFiles)});
}
- static Object callReflectiveDumpUtilsMethodWithPath(Path path, String method) {
- Object[] returnObject = new Object[1];
- boolean found =
- callReflectiveUtilsMethod(
- method,
- new Class<?>[] {Path.class},
- fn -> returnObject[0] = fn.apply(new Object[] {path}));
- if (!found) {
- System.out.println(
- "Unable to call invoke method on path "
- + path
- + ". "
- + "Method "
- + method
- + "() was not found.");
- return null;
- }
- return returnObject[0];
- }
-
- static Object createArtProfileProvider(Path artProfile) {
- return callReflectiveDumpUtilsMethodWithPath(
- artProfile, "createArtProfileProviderFromDumpFile");
- }
-
- static Object createResidualArtProfileConsumer(Path residualArtProfile) {
- return callReflectiveDumpUtilsMethodWithPath(
- residualArtProfile, "createResidualArtProfileConsumerFromDumpFile");
- }
-
static Collection<Object> createStartupProfileProviders(List<Path> startupProfileFiles) {
List<Object> startupProfileProviders = new ArrayList<>();
for (Path startupProfileFile : startupProfileFiles) {
@@ -169,4 +130,12 @@
return content;
}
+
+ protected static void runIgnoreMissing(Runnable runnable, String onMissing) {
+ try {
+ runnable.run();
+ } catch (NoClassDefFoundError | NoSuchMethodError e) {
+ System.out.println(onMissing);
+ }
+ }
}
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
index e9e8ae5..023d8e1 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpCompatR8.java
@@ -283,12 +283,4 @@
R8.run(command);
}
}
-
- private static void runIgnoreMissing(Runnable runnable, String onMissing) {
- try {
- runnable.run();
- } catch (NoClassDefFoundError | NoSuchMethodError e) {
- System.out.println(onMissing);
- }
- }
}
diff --git a/src/main/java/com/android/tools/r8/utils/CompileDumpUtils.java b/src/main/java/com/android/tools/r8/utils/CompileDumpUtils.java
index 4356671..c2e3592 100644
--- a/src/main/java/com/android/tools/r8/utils/CompileDumpUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/CompileDumpUtils.java
@@ -7,10 +7,6 @@
import com.android.tools.r8.KeepMethodForCompileDump;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.profile.art.ArtProfileConsumer;
-import com.android.tools.r8.profile.art.ArtProfileConsumerUtils;
-import com.android.tools.r8.profile.art.ArtProfileProvider;
-import com.android.tools.r8.profile.art.ArtProfileProviderUtils;
import com.android.tools.r8.references.MethodReference;
import com.android.tools.r8.references.Reference;
import com.android.tools.r8.startup.StartupProfileBuilder;
@@ -24,16 +20,6 @@
class CompileDumpUtils {
@KeepMethodForCompileDump
- static ArtProfileProvider createArtProfileProviderFromDumpFile(Path artProfile) {
- return ArtProfileProviderUtils.createFromHumanReadableArtProfile(artProfile);
- }
-
- @KeepMethodForCompileDump
- static ArtProfileConsumer createResidualArtProfileConsumerFromDumpFile(Path residualArtProfile) {
- return ArtProfileConsumerUtils.create(residualArtProfile);
- }
-
- @KeepMethodForCompileDump
static StartupProfileProvider createStartupProfileProviderFromDumpFile(Path path) {
return new StartupProfileProvider() {
diff --git a/src/main/java/com/android/tools/r8/utils/compiledump/ArtProfileDumpUtils.java b/src/main/java/com/android/tools/r8/utils/compiledump/ArtProfileDumpUtils.java
new file mode 100644
index 0000000..51935bb
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/compiledump/ArtProfileDumpUtils.java
@@ -0,0 +1,19 @@
+// Copyright (c) 2024, 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.compiledump;
+
+import com.android.tools.r8.BaseCompilerCommand;
+import com.android.tools.r8.profile.art.ArtProfileConsumerUtils;
+import com.android.tools.r8.profile.art.ArtProfileProviderUtils;
+import java.nio.file.Path;
+
+public class ArtProfileDumpUtils {
+ public static void addArtProfileForRewriting(
+ Path input, Path output, BaseCompilerCommand.Builder<?, ?> builder) {
+ builder.addArtProfileForRewriting(
+ ArtProfileProviderUtils.createFromHumanReadableArtProfile(input),
+ ArtProfileConsumerUtils.create(output));
+ }
+}