Revert "[KeepAnno] Use native interpretation in R8"
This reverts commit 57a02ee85383a73cb9fa077eae6336dcd6bea5bc.
Reason for revert: failures
Change-Id: I7e25d0d755aa8d5ed0ad31bac2d5119256d4db5b
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 2fc05e8..3bd0ac5 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -17,6 +17,9 @@
import com.android.tools.r8.inspector.internal.InspectorImpl;
import com.android.tools.r8.ir.desugar.desugaredlibrary.DesugaredLibrarySpecification;
import com.android.tools.r8.keepanno.annotations.KeepForApi;
+import com.android.tools.r8.keepanno.asm.KeepEdgeReader;
+import com.android.tools.r8.keepanno.ast.KeepDeclaration;
+import com.android.tools.r8.keepanno.keeprules.KeepRuleExtractor;
import com.android.tools.r8.naming.MapConsumer;
import com.android.tools.r8.naming.ProguardMapStringConsumer;
import com.android.tools.r8.naming.SourceFileRewriter;
@@ -62,6 +65,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
+import java.util.Collections;
import java.util.Deque;
import java.util.List;
import java.util.Optional;
@@ -133,7 +137,8 @@
FeatureSplitConfiguration.builder();
private String synthesizedClassPrefix = "";
private boolean enableMissingLibraryApiModeling = false;
- private boolean enableExperimentalKeepAnnotations = false;
+ private boolean enableExperimentalKeepAnnotations =
+ System.getProperty("com.android.tools.r8.enableKeepAnnotations") != null;
public boolean enableStartupLayoutOptimization = true;
private SemanticVersion fakeCompilerVersion = null;
private AndroidResourceProvider androidResourceProvider = null;
@@ -699,6 +704,10 @@
// Add embedded keep rules.
amendWithRulesAndProvidersForInjarsAndMetaInf(reporter, parser);
+
+ // Extract out rules for keep annotations and amend the configuration.
+ // TODO(b/248408342): Remove this and parse annotations as part of R8 root-set & enqueuer.
+ extractKeepAnnotationRules(parser);
ProguardConfiguration configuration = configurationBuilder.build();
getAppBuilder().addFilteredLibraryArchives(configuration.getLibraryjars());
@@ -747,7 +756,6 @@
getSourceFileProvider(),
enableMissingLibraryApiModeling,
enableStartupLayoutOptimization,
- enableExperimentalKeepAnnotations,
getAndroidPlatformBuild(),
getArtProfilesForRewriting(),
getStartupProfileProviders(),
@@ -828,6 +836,35 @@
}
}
+ private void extractKeepAnnotationRules(ProguardConfigurationParser parser) {
+ if (!enableExperimentalKeepAnnotations) {
+ return;
+ }
+ try {
+ for (ProgramResourceProvider provider : getAppBuilder().getProgramResourceProviders()) {
+ for (ProgramResource resource : provider.getProgramResources()) {
+ if (resource.getKind() == Kind.CF) {
+ List<KeepDeclaration> declarations =
+ KeepEdgeReader.readKeepEdges(resource.getBytes());
+ if (!declarations.isEmpty()) {
+ KeepRuleExtractor extractor =
+ new KeepRuleExtractor(
+ rule -> {
+ ProguardConfigurationSourceStrings source =
+ new ProguardConfigurationSourceStrings(
+ Collections.singletonList(rule), null, resource.getOrigin());
+ parser.parse(source);
+ });
+ declarations.forEach(extractor::extract);
+ }
+ }
+ }
+ }
+ } catch (ResourceException e) {
+ throw getAppBuilder().getReporter().fatalError(new ExceptionDiagnostic(e));
+ }
+ }
+
// Internal for-testing method to add post-processors of the proguard configuration.
void addProguardConfigurationConsumerForTesting(Consumer<ProguardConfiguration.Builder> c) {
Consumer<ProguardConfiguration.Builder> oldConsumer = proguardConfigurationConsumerForTesting;
@@ -919,7 +956,6 @@
private final String synthesizedClassPrefix;
private final boolean enableMissingLibraryApiModeling;
private final boolean enableStartupLayoutOptimization;
- private final boolean enableExperimentalKeepAnnotations;
private final AndroidResourceProvider androidResourceProvider;
private final AndroidResourceConsumer androidResourceConsumer;
private final ResourceShrinkerConfiguration resourceShrinkerConfiguration;
@@ -1013,7 +1049,6 @@
SourceFileProvider sourceFileProvider,
boolean enableMissingLibraryApiModeling,
boolean enableStartupLayoutOptimization,
- boolean enableExperimentalKeepAnnotations,
boolean isAndroidPlatformBuild,
List<ArtProfileForRewriting> artProfilesForRewriting,
List<StartupProfileProvider> startupProfileProviders,
@@ -1068,7 +1103,6 @@
this.synthesizedClassPrefix = synthesizedClassPrefix;
this.enableMissingLibraryApiModeling = enableMissingLibraryApiModeling;
this.enableStartupLayoutOptimization = enableStartupLayoutOptimization;
- this.enableExperimentalKeepAnnotations = enableExperimentalKeepAnnotations;
this.androidResourceProvider = androidResourceProvider;
this.androidResourceConsumer = androidResourceConsumer;
this.resourceShrinkerConfiguration = resourceShrinkerConfiguration;
@@ -1097,7 +1131,6 @@
synthesizedClassPrefix = null;
enableMissingLibraryApiModeling = false;
enableStartupLayoutOptimization = true;
- enableExperimentalKeepAnnotations = false;
androidResourceProvider = null;
androidResourceConsumer = null;
resourceShrinkerConfiguration = null;
@@ -1158,10 +1191,6 @@
assert !internal.enableTreeShakingOfLibraryMethodOverrides;
- if (enableExperimentalKeepAnnotations) {
- internal.testing.enableEmbeddedKeepAnnotations = true;
- }
-
if (!internal.isShrinking()) {
// If R8 is not shrinking, there is no point in running various optimizations since the
// optimized classes will still remain in the program (the application size could increase).
diff --git a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
index b4e7eab..8b21c8d 100644
--- a/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/keepanno/KeepAnnoTestBuilder.java
@@ -4,7 +4,6 @@
package com.android.tools.r8.keepanno;
-import static org.junit.Assert.assertEquals;
import com.android.tools.r8.ExternalR8TestBuilder;
import com.android.tools.r8.ProguardTestBuilder;
@@ -190,11 +189,9 @@
TestBase.testForR8(temp, parameters().getBackend())
.enableExperimentalKeepAnnotations()
.setMinApi(parameters());
- builder.getBuilder().setEnableExperimentalKeepAnnotations(isDirect());
- // If the internal reader value does not match we will need to update the extract tests to
- // also strip the annotations.
- builder.addOptionsModification(
- o -> assertEquals(isDirect(), o.testing.enableEmbeddedKeepAnnotations));
+
+ // TODO(b/323816623): Replace the testing flag by the API call.
+ builder.addOptionsModification(o -> o.testing.enableEmbeddedKeepAnnotations = isDirect());
}
private boolean isExtractRules() {