Disallow optimization of modeled proto fields
Change-Id: I9767ac2677d68723bf5dce62e6f06b359ff7fa02
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
index b19d297..809f0ad 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedMessageLiteShrinker.java
@@ -14,9 +14,11 @@
import com.android.tools.r8.graph.AccessControl;
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexMember;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.graph.ProgramMember;
import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.ir.analysis.proto.schema.ProtoMessageInfo;
import com.android.tools.r8.ir.analysis.proto.schema.ProtoObject;
@@ -110,6 +112,16 @@
}
});
}
+
+ DexProgramClass rawMessageInfoClass =
+ asProgramClassOrNull(
+ appView.appInfo().definitionForWithoutExistenceAssert(references.rawMessageInfoType));
+ if (rawMessageInfoClass != null) {
+ disallowOptimization(
+ rawMessageInfoClass, references.rawMessageInfoInfoField, dependentMinimumKeepInfo);
+ disallowOptimization(
+ rawMessageInfoClass, references.rawMessageInfoObjectsField, dependentMinimumKeepInfo);
+ }
}
private void disallowSignatureOptimizations(KeepMethodInfo.Joiner methodJoiner) {
@@ -124,6 +136,18 @@
.disallowUnusedReturnValueOptimization();
}
+ private void disallowOptimization(
+ DexProgramClass clazz,
+ DexMember<?, ?> reference,
+ DependentMinimumKeepInfoCollection dependentMinimumKeepInfo) {
+ ProgramMember<?, ?> member = clazz.lookupProgramMember(reference);
+ if (member != null) {
+ dependentMinimumKeepInfo
+ .getOrCreateUnconditionalMinimumKeepInfoFor(reference)
+ .disallowOptimization();
+ }
+ }
+
public void run(IRCode code) {
ProgramMethod method = code.context();
if (references.isDynamicMethod(method.getReference())) {