Add PrebuiltCompatibility category to properties

If those properties had a different value when the prebuilt dexes were
generated for an imported lib, they must be considered incompatible.

Bug: 33446455

Change-Id: I48c45d625006cd7031a02ee417aa6c6954d3d8c0
diff --git a/jack/src/com/android/jack/Options.java b/jack/src/com/android/jack/Options.java
index 5788ab4..150c1ef 100644
--- a/jack/src/com/android/jack/Options.java
+++ b/jack/src/com/android/jack/Options.java
@@ -197,6 +197,7 @@
           .addDefaultValue(AssertionPolicy.RUNTIME)
           .ignoreCase()
           .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class)
           .addCategory(Carnac.class);
 
   @Nonnull
@@ -218,7 +219,8 @@
   public static final BooleanPropertyId LAMBDA_TO_ANONYMOUS_CONVERTER = BooleanPropertyId
       .create("jack.lambda.anonymous", "Enable lambda support with an anonymous class")
       .addDefaultValue(Boolean.TRUE)
-      .addCategory(DumpInLibrary.class);
+      .addCategory(DumpInLibrary.class)
+      .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
   public static final EnumPropertyId<LambdaGroupingScope> LAMBDA_GROUPING_SCOPE = EnumPropertyId
@@ -267,14 +269,17 @@
           .addCategory(DumpInLibrary.class);
 
   /**
-   * property used to specify the kind of switch enum optimization that is enabled.
-   * See(@link SwitchEnumOptStrategy)
+   * property used to specify the kind of switch enum optimization that is enabled. See(@link
+   * SwitchEnumOptStrategy)
    */
   @Nonnull
   public static final EnumPropertyId<SwitchEnumOptStrategy> OPTIMIZED_ENUM_SWITCH =
-      EnumPropertyId.create("jack.optimization.enum.switch", "Optimize enum switch",
-          SwitchEnumOptStrategy.class)
-      .addDefaultValue(SwitchEnumOptStrategy.NEVER).ignoreCase().addCategory(DumpInLibrary.class);
+      EnumPropertyId.create(
+              "jack.optimization.enum.switch", "Optimize enum switch", SwitchEnumOptStrategy.class)
+          .addDefaultValue(SwitchEnumOptStrategy.NEVER)
+          .ignoreCase()
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
   public static final BooleanPropertyId GENERATE_DEX_IN_LIBRARY = BooleanPropertyId
@@ -652,25 +657,35 @@
       .addDefaultValue(Boolean.FALSE).addCategory(DumpInLibrary.class);
 
   @Nonnull
-  public static final BooleanPropertyId OPTIMIZE_TAIL_RECURSION = BooleanPropertyId.create(
-      "jack.optimization.tail-recursion",
-      "Optimize tail recursive calls")
-      .addDefaultValue(Boolean.FALSE).addCategory(DumpInLibrary.class);
+  public static final BooleanPropertyId OPTIMIZE_TAIL_RECURSION =
+      BooleanPropertyId.create("jack.optimization.tail-recursion", "Optimize tail recursive calls")
+          .addDefaultValue(Boolean.FALSE)
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
-  public static final BooleanPropertyId EMIT_LOCAL_DEBUG_INFO = BooleanPropertyId.create(
-      "jack.dex.debug.vars", "Emit local variable debug info into generated dex")
-      .addDefaultValue(Boolean.FALSE).addCategory(DumpInLibrary.class);
+  public static final BooleanPropertyId EMIT_LOCAL_DEBUG_INFO =
+      BooleanPropertyId.create(
+              "jack.dex.debug.vars", "Emit local variable debug info into generated dex")
+          .addDefaultValue(Boolean.FALSE)
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
-  public static final BooleanPropertyId EMIT_LINE_NUMBER_DEBUG_INFO = BooleanPropertyId.create(
-      "jack.dex.debug.lines", "Emit line number debug info into generated dex")
-      .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+  public static final BooleanPropertyId EMIT_LINE_NUMBER_DEBUG_INFO =
+      BooleanPropertyId.create(
+              "jack.dex.debug.lines", "Emit line number debug info into generated dex")
+          .addDefaultValue(Boolean.TRUE)
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
-  public static final BooleanPropertyId EMIT_SOURCE_FILE_DEBUG_INFO = BooleanPropertyId.create(
-      "jack.dex.debug.source", "Emit source file debug info into generated dex")
-      .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+  public static final BooleanPropertyId EMIT_SOURCE_FILE_DEBUG_INFO =
+      BooleanPropertyId.create(
+              "jack.dex.debug.source", "Emit source file debug info into generated dex")
+          .addDefaultValue(Boolean.TRUE)
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
   public static final PropertyId<AndroidApiLevel> ANDROID_MIN_API_LEVEL = PropertyId
diff --git a/jack/src/com/android/jack/backend/dex/FieldInitializerRemover.java b/jack/src/com/android/jack/backend/dex/FieldInitializerRemover.java
index af9f3d1..aa05ab9 100644
--- a/jack/src/com/android/jack/backend/dex/FieldInitializerRemover.java
+++ b/jack/src/com/android/jack/backend/dex/FieldInitializerRemover.java
@@ -34,6 +34,7 @@
 import com.android.jack.ir.ast.JReferenceType;
 import com.android.jack.ir.ast.JType;
 import com.android.jack.library.DumpInLibrary;
+import com.android.jack.library.PrebuiltCompatibility;
 import com.android.jack.lookup.CommonTypes;
 import com.android.jack.scheduling.filter.SourceTypeFilter;
 import com.android.jack.transformations.request.Remove;
@@ -72,13 +73,15 @@
       BooleanPropertyId
           .create("jack.legacy.dx.initialvalue.class",
               "Emit class literal as initial value of field")
-          .addDefaultValue(Boolean.FALSE).addCategory(DumpInLibrary.class);
+          .addDefaultValue(Boolean.FALSE).addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
   public static final BooleanPropertyId STRING_AS_INITIALVALUE_OF_OBJECT = BooleanPropertyId
       .create("jack.legacy.runtime.initialvalue.string",
           "Emit string literal as initial value of field")
-      .addDefaultValue(Boolean.FALSE).addCategory(DumpInLibrary.class);
+      .addDefaultValue(Boolean.FALSE).addCategory(DumpInLibrary.class)
+      .addCategory(PrebuiltCompatibility.class);
 
   private final boolean allowClassInInitialValue =
       ThreadConfig.get(CLASS_AS_INITIALVALUE).booleanValue();
diff --git a/jack/src/com/android/jack/backend/dex/rop/CodeItemBuilder.java b/jack/src/com/android/jack/backend/dex/rop/CodeItemBuilder.java
index 2644104..b5ed141 100644
--- a/jack/src/com/android/jack/backend/dex/rop/CodeItemBuilder.java
+++ b/jack/src/com/android/jack/backend/dex/rop/CodeItemBuilder.java
@@ -71,6 +71,7 @@
 import com.android.jack.ir.ast.JThis;
 import com.android.jack.ir.ast.marker.ThrownExceptionMarker;
 import com.android.jack.library.DumpInLibrary;
+import com.android.jack.library.PrebuiltCompatibility;
 import com.android.jack.scheduling.filter.TypeWithoutPrebuiltFilter;
 import com.android.jack.scheduling.marker.DexCodeMarker;
 import com.android.jack.transformations.EmptyClinit;
@@ -159,25 +160,35 @@
 public class CodeItemBuilder implements RunnableSchedulable<JMethod> {
 
   @Nonnull
-  public static final BooleanPropertyId EMIT_SYNTHETIC_LOCAL_DEBUG_INFO = BooleanPropertyId
-      .create("jack.dex.debug.vars.synthetic",
-          "Emit synthetic local variable debug info into generated dex")
-      .addDefaultValue(Boolean.FALSE).addCategory(DumpInLibrary.class);
+  public static final BooleanPropertyId EMIT_SYNTHETIC_LOCAL_DEBUG_INFO =
+      BooleanPropertyId.create(
+              "jack.dex.debug.vars.synthetic",
+              "Emit synthetic local variable debug info into generated dex")
+          .addDefaultValue(Boolean.FALSE)
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
-  public static final BooleanPropertyId DEX_OPTIMIZE = BooleanPropertyId.create(
-      "jack.dex.optimize", "Define if Dex optimizations are activated")
-      .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+  public static final BooleanPropertyId DEX_OPTIMIZE =
+      BooleanPropertyId.create("jack.dex.optimize", "Define if Dex optimizations are activated")
+          .addDefaultValue(Boolean.TRUE)
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
-  public static final BooleanPropertyId FORCE_JUMBO = BooleanPropertyId.create(
-      "jack.dex.forcejumbo", "Force string opcodes to be emitted as jumbo in dex")
-      .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+  public static final BooleanPropertyId FORCE_JUMBO =
+      BooleanPropertyId.create(
+              "jack.dex.forcejumbo", "Force string opcodes to be emitted as jumbo in dex")
+          .addDefaultValue(Boolean.TRUE)
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
-  public static final BooleanPropertyId OPTIMIZE_BRANCHES = BooleanPropertyId.create(
-      "jack.dex.optimizebranches", "Remove redundant branches in dex")
-      .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+  public static final BooleanPropertyId OPTIMIZE_BRANCHES =
+      BooleanPropertyId.create("jack.dex.optimizebranches", "Remove redundant branches in dex")
+          .addDefaultValue(Boolean.TRUE)
+          .addCategory(DumpInLibrary.class)
+          .addCategory(PrebuiltCompatibility.class);
 
   @Nonnull
   private final com.android.jack.util.filter.Filter<JMethod> filter =
diff --git a/jack/src/com/android/jack/optimizations/Optimizations.java b/jack/src/com/android/jack/optimizations/Optimizations.java
index c139f2c..e3eb4f8 100644
--- a/jack/src/com/android/jack/optimizations/Optimizations.java
+++ b/jack/src/com/android/jack/optimizations/Optimizations.java
@@ -40,9 +40,11 @@
   @Description("Optimize def/use chain")
   public static class DefUseSimplifier implements Feature {
     @Nonnull
-    public static final BooleanPropertyId ENABLE = BooleanPropertyId
-        .create("jack.optimization.def-use-simplifier", "Optimize def/use chain")
-        .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+    public static final BooleanPropertyId ENABLE =
+        BooleanPropertyId.create("jack.optimization.def-use-simplifier", "Optimize def/use chain")
+            .addDefaultValue(Boolean.TRUE)
+            .addCategory(DumpInLibrary.class)
+            .addCategory(PrebuiltCompatibility.class);
   }
 
   /**
@@ -52,9 +54,11 @@
   @Description("Optimize use/def chain")
   public static class UseDefSimplifier implements Feature {
     @Nonnull
-    public static final BooleanPropertyId ENABLE = BooleanPropertyId
-        .create("jack.optimization.use-def-simplifier", "Optimize use/def chain")
-        .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+    public static final BooleanPropertyId ENABLE =
+        BooleanPropertyId.create("jack.optimization.use-def-simplifier", "Optimize use/def chain")
+            .addDefaultValue(Boolean.TRUE)
+            .addCategory(DumpInLibrary.class)
+            .addCategory(PrebuiltCompatibility.class);
   }
 
   /**
@@ -64,10 +68,12 @@
   @Description("Optimize expressions using constants")
   public static class ExpressionSimplifier implements Feature {
     @Nonnull
-    public static final BooleanPropertyId ENABLE = BooleanPropertyId
-        .create("jack.optimization.expression-simplifier",
-            "Optimize expressions using constants")
-        .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+    public static final BooleanPropertyId ENABLE =
+        BooleanPropertyId.create(
+                "jack.optimization.expression-simplifier", "Optimize expressions using constants")
+            .addDefaultValue(Boolean.TRUE)
+            .addCategory(DumpInLibrary.class)
+            .addCategory(PrebuiltCompatibility.class);
   }
 
   /**
@@ -77,10 +83,13 @@
   @Description("Optimize 'if' expressions using a boolean constant")
   public static class IfSimplifier implements Feature {
     @Nonnull
-    public static final BooleanPropertyId ENABLE = BooleanPropertyId
-        .create("jack.optimization.if-simplifier",
-            "Optimize 'if' expressions using a boolean constant")
-        .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+    public static final BooleanPropertyId ENABLE =
+        BooleanPropertyId.create(
+                "jack.optimization.if-simplifier",
+                "Optimize 'if' expressions using a boolean constant")
+            .addDefaultValue(Boolean.TRUE)
+            .addCategory(DumpInLibrary.class)
+            .addCategory(PrebuiltCompatibility.class);
   }
 
   /**
@@ -92,7 +101,9 @@
     @Nonnull
     public static final BooleanPropertyId ENABLE =
         BooleanPropertyId.create("jack.optimization.not-simplifier", "Optimize '!' operator")
-            .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+            .addDefaultValue(Boolean.TRUE)
+            .addCategory(DumpInLibrary.class)
+            .addCategory(PrebuiltCompatibility.class);
   }
 
   /**
diff --git a/jack/src/com/android/jack/transformations/VisibilityBridgeAdder.java b/jack/src/com/android/jack/transformations/VisibilityBridgeAdder.java
index 71d4730..a87c906 100644
--- a/jack/src/com/android/jack/transformations/VisibilityBridgeAdder.java
+++ b/jack/src/com/android/jack/transformations/VisibilityBridgeAdder.java
@@ -37,6 +37,7 @@
 import com.android.jack.ir.ast.JThisRef;
 import com.android.jack.ir.sourceinfo.SourceInfo;
 import com.android.jack.library.DumpInLibrary;
+import com.android.jack.library.PrebuiltCompatibility;
 import com.android.jack.lookup.JMethodLookupException;
 import com.android.jack.scheduling.feature.VisibilityBridge;
 import com.android.jack.scheduling.filter.SourceTypeFilter;
@@ -77,7 +78,7 @@
   @Nonnull
   public static final BooleanPropertyId VISIBILITY_BRIDGE = BooleanPropertyId.create(
       "jack.legacy.runtime.visibilitybridges", "Generate visibility bridges").addDefaultValue(
-      Boolean.TRUE).addCategory(DumpInLibrary.class);
+      Boolean.TRUE).addCategory(DumpInLibrary.class).addCategory(PrebuiltCompatibility.class);
 
   @Override
   public synchronized void run(@Nonnull JDefinedClassOrInterface declaredType) {
diff --git a/jack/src/com/android/jack/transformations/ast/SynchronizeTransformer.java b/jack/src/com/android/jack/transformations/ast/SynchronizeTransformer.java
index f1f570a..45f81a1 100644
--- a/jack/src/com/android/jack/transformations/ast/SynchronizeTransformer.java
+++ b/jack/src/com/android/jack/transformations/ast/SynchronizeTransformer.java
@@ -42,6 +42,7 @@
 import com.android.jack.ir.ast.JVisitor;
 import com.android.jack.ir.sourceinfo.SourceInfo;
 import com.android.jack.library.DumpInLibrary;
+import com.android.jack.library.PrebuiltCompatibility;
 import com.android.jack.lookup.CommonTypes;
 import com.android.jack.scheduling.filter.TypeWithoutPrebuiltFilter;
 import com.android.jack.transformations.LocalVarCreator;
@@ -93,7 +94,9 @@
   public static final BooleanPropertyId REUSE_SYNC_VARIABLE = BooleanPropertyId.create(
       "jack.transformation.reusesyncvariable",
       "Reduce the 'get class' usage in static synchronized methods by reusing a local variable")
-      .addDefaultValue(Boolean.TRUE).addCategory(DumpInLibrary.class);
+      .addDefaultValue(Boolean.TRUE)
+      .addCategory(DumpInLibrary.class)
+      .addCategory(PrebuiltCompatibility.class);
 
   private final boolean reuseSyncVariable = ThreadConfig.get(REUSE_SYNC_VARIABLE).booleanValue();