Merge "Add support for splitting non-code resources in dex splitter."
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 9a44dde..a6032e4 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -32,7 +32,7 @@
import com.android.tools.r8.ir.code.ValueNumberGenerator;
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.Inliner.Reason;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import com.android.tools.r8.ir.synthetic.ForwardMethodSourceCode;
@@ -57,6 +57,7 @@
* <p>
* We also use this enum to encode under what constraints a method may be inlined.
*/
+ // TODO(b/111080693): Need to extend this to a state with the context.
public enum CompilationState {
/**
* Has not been processed, yet.
@@ -72,7 +73,7 @@
*/
PROCESSED_INLINING_CANDIDATE_ANY,
/**
- * Code also contains instructions that access protected entities that reside in a differnt
+ * Code also contains instructions that access protected entities that reside in a different
* package and hence require subclass relationship to be visible.
*/
PROCESSED_INLINING_CANDIDATE_SUBCLASS,
@@ -96,6 +97,8 @@
public DexAnnotationSet annotations;
public ParameterAnnotationsList parameterAnnotationsList;
private Code code;
+ // TODO(b/111080693): towards finer-grained inlining constraints,
+ // we need to maintain a set of states with (potentially different) contexts.
private CompilationState compilationState = CompilationState.NOT_PROCESSED;
private OptimizationInfo optimizationInfo = DefaultOptimizationInfo.DEFAULT;
private int classFileVersion = -1;
@@ -208,6 +211,7 @@
assert isInliningCandidate(containerType, Reason.SIMPLE, appInfo);
return true;
}
+ // TODO(b/111080693): inlining candidate should satisfy all states if multiple states are there.
switch (compilationState) {
case PROCESSED_INLINING_CANDIDATE_ANY:
return true;
@@ -222,9 +226,9 @@
}
}
- public boolean markProcessed(Constraint state) {
+ public boolean markProcessed(ConstraintWithTarget state) {
CompilationState prevCompilationState = compilationState;
- switch (state) {
+ switch (state.constraint) {
case ALWAYS:
compilationState = PROCESSED_INLINING_CANDIDATE_ANY;
break;
diff --git a/src/main/java/com/android/tools/r8/graph/JarCode.java b/src/main/java/com/android/tools/r8/graph/JarCode.java
index 2c37c6a..a48841f 100644
--- a/src/main/java/com/android/tools/r8/graph/JarCode.java
+++ b/src/main/java/com/android/tools/r8/graph/JarCode.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.ir.code.ValueNumberGenerator;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.JarSourceCode;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.jar.InliningConstraintVisitor;
import com.android.tools.r8.jar.JarRegisterEffectsVisitor;
import com.android.tools.r8.naming.ClassNameMapper;
@@ -173,7 +173,7 @@
DescriptorUtils.getDescriptorFromClassBinaryName(tryCatchBlockNode.type))));
}
- public Constraint computeInliningConstraint(
+ public ConstraintWithTarget computeInliningConstraint(
DexEncodedMethod encodedMethod,
AppInfoWithLiveness appInfo,
GraphLense graphLense,
diff --git a/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingUser.java b/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingUser.java
index 6948a08..20d7bf4 100644
--- a/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingUser.java
+++ b/src/main/java/com/android/tools/r8/ir/code/AlwaysMaterializingUser.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
@@ -58,7 +58,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forAlwaysMaterializingUser();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Argument.java b/src/main/java/com/android/tools/r8/ir/code/Argument.java
index cff655a..c8240a0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Argument.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Argument.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
@@ -76,7 +76,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forArgument();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
index 01101f3..758252b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -21,7 +21,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import java.util.Arrays;
@@ -133,7 +133,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forArrayGet();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
index cc358f0..445c9ed 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayLength.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import java.util.function.Function;
@@ -90,7 +90,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forArrayLength();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
index 023afce..0282ffa 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
@@ -17,7 +17,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import com.android.tools.r8.utils.InternalOptions;
@@ -154,7 +154,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forArrayPut();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Binop.java b/src/main/java/com/android/tools/r8/ir/code/Binop.java
index e5190bb..30fdc59 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Binop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Binop.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.analysis.type.PrimitiveTypeLatticeElement;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import java.util.function.Function;
@@ -124,7 +124,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forBinop();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
index dba575f..cee01eb 100644
--- a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
+++ b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
@@ -15,7 +15,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.function.Function;
@@ -113,7 +113,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forCheckCast(type, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
index 3041aaf..c5a0a11 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstClass.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
import java.util.function.Function;
@@ -99,7 +99,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forConstClass(clazz, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/ConstInstruction.java b/src/main/java/com/android/tools/r8/ir/code/ConstInstruction.java
index f6e212d..a6ac01d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ConstInstruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ConstInstruction.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.ir.code;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
public abstract class ConstInstruction extends Instruction {
@@ -29,7 +29,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forConstInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java
index 637faf7..9c6b342 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalRead.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
@@ -60,7 +60,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forDebugLocalRead();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java b/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java
index 53791e5..52c8dc6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugLocalsChange.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringUtils;
@@ -100,7 +100,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forDebugLocalsChange();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/DebugPosition.java b/src/main/java/com/android/tools/r8/ir/code/DebugPosition.java
index aed2128..5a611aa 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DebugPosition.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DebugPosition.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
@@ -57,7 +57,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forDebugPosition();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
index 1083669..50fc2ed 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceGet.java
@@ -22,7 +22,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.function.Function;
import org.objectweb.asm.Opcodes;
@@ -114,7 +114,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInstanceGet(field, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
index 53fd31c..7a973f8 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstanceOf.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.function.Function;
@@ -81,7 +81,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInstanceOf(type, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
index 3585348..e8d917d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
@@ -19,7 +19,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.Arrays;
import org.objectweb.asm.Opcodes;
@@ -113,7 +113,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInstancePut(field, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Instruction.java b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
index eb85222..d9bf8d0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Instruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Instruction.java
@@ -16,7 +16,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
import com.android.tools.r8.utils.CfgPrinter;
@@ -1059,7 +1059,7 @@
*
* <p>The type is used to judge visibility constraints and also for dispatch decisions.
*/
- public abstract Constraint inliningConstraint(
+ public abstract ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext);
public abstract void insertLoadAndStores(InstructionListIterator it, LoadStoreHelper helper);
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
index a6e6fd1..c12333a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeCustom.java
@@ -11,7 +11,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.List;
@@ -101,7 +101,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInvokeCustom();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
index 88716dc..46d2e5a 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeDirect.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import java.util.Collection;
@@ -113,7 +113,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInvokeDirect(getInvokedMethod(), invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java b/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java
index 06d368d..5f49322 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeInterface.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.ir.analysis.type.TypeEnvironment;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import java.util.Collection;
@@ -95,7 +95,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInvokeInterface(getInvokedMethod(), invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
index e34d25f..821d707 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeMultiNewArray.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.List;
import java.util.function.Function;
@@ -69,7 +69,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInvokeMultiNewArray(type, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
index a2a9c36..17f36df 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeNewArray.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.List;
import java.util.function.Function;
@@ -99,7 +99,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInvokeNewArray(type, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
index 8f90630..b45e984 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokePolymorphic.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.ir.optimize.InliningOracle;
@@ -126,7 +126,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInvokePolymorphic(getInvokedMethod(), invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
index d2183c0..93660c7 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeStatic.java
@@ -11,7 +11,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.Inliner.InlineAction;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.ir.optimize.InliningOracle;
@@ -103,7 +103,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInvokeStatic(getInvokedMethod(), invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
index 920d94b..141d4d9 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeSuper.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.ir.analysis.type.TypeEnvironment;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import java.util.Collection;
@@ -112,7 +112,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInvokeSuper(getInvokedMethod(), invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
index f55a407..51bed08 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InvokeVirtual.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.ir.analysis.type.TypeEnvironment;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import java.util.Collection;
@@ -95,7 +95,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forInvokeVirtual(getInvokedMethod(), invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/JumpInstruction.java b/src/main/java/com/android/tools/r8/ir/code/JumpInstruction.java
index 6096292..ded6002 100644
--- a/src/main/java/com/android/tools/r8/ir/code/JumpInstruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/JumpInstruction.java
@@ -4,7 +4,7 @@
package com.android.tools.r8.ir.code;
import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
import java.util.List;
@@ -47,7 +47,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forJumpInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Load.java b/src/main/java/com/android/tools/r8/ir/code/Load.java
index 32654b8..5981249 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Load.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Load.java
@@ -11,7 +11,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
public class Load extends Instruction {
@@ -51,7 +51,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forLoad();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Monitor.java b/src/main/java/com/android/tools/r8/ir/code/Monitor.java
index 3b1b2d1..70af068 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Monitor.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Monitor.java
@@ -14,7 +14,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
public class Monitor extends Instruction {
@@ -97,7 +97,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forMonitor();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Move.java b/src/main/java/com/android/tools/r8/ir/code/Move.java
index e474bb8..6223501 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Move.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Move.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.function.Function;
@@ -100,7 +100,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forMove();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/MoveException.java b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
index eabf7b2..e7d6e63 100644
--- a/src/main/java/com/android/tools/r8/ir/code/MoveException.java
+++ b/src/main/java/com/android/tools/r8/ir/code/MoveException.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
import java.util.HashSet;
@@ -75,7 +75,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forMoveException();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
index edca979..69867e6 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayEmpty.java
@@ -13,7 +13,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.function.Function;
@@ -84,7 +84,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forNewArrayEmpty(type, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
index ac46cc7..8dac404 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewArrayFilledData.java
@@ -11,7 +11,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
import java.util.Arrays;
@@ -112,7 +112,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forNewArrayFilledData();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
index 75931ad..92e7f3e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NewInstance.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.function.Function;
@@ -81,7 +81,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forNewInstance(clazz, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/NonNull.java b/src/main/java/com/android/tools/r8/ir/code/NonNull.java
index 462af06..d909144 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NonNull.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NonNull.java
@@ -10,7 +10,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.function.Function;
@@ -85,7 +85,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forNonNull();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Pop.java b/src/main/java/com/android/tools/r8/ir/code/Pop.java
index 0fb1949..8ea55dd 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Pop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Pop.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
@@ -50,7 +50,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forPop();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Return.java b/src/main/java/com/android/tools/r8/ir/code/Return.java
index 37cfaf0..bb750c2 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Return.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Return.java
@@ -15,7 +15,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
public class Return extends JumpInstruction {
@@ -116,7 +116,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forReturn();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
index 486f9e2..108beee 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticGet.java
@@ -21,7 +21,7 @@
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.function.Function;
import org.objectweb.asm.Opcodes;
@@ -109,7 +109,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forStaticGet(field, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
index f910ff6..8824d54 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
@@ -18,7 +18,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import org.objectweb.asm.Opcodes;
@@ -107,7 +107,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forStaticPut(field, invocationContext);
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Store.java b/src/main/java/com/android/tools/r8/ir/code/Store.java
index b81af69..cec5501 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Store.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Store.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.utils.InternalOptions;
@@ -53,7 +53,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forStore();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Throw.java b/src/main/java/com/android/tools/r8/ir/code/Throw.java
index 4295dbe..7bda1c8 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Throw.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Throw.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.conversion.CfBuilder;
import com.android.tools.r8.ir.conversion.DexBuilder;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
public class Throw extends JumpInstruction {
@@ -65,7 +65,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forThrow();
}
diff --git a/src/main/java/com/android/tools/r8/ir/code/Unop.java b/src/main/java/com/android/tools/r8/ir/code/Unop.java
index 2f6ed7f..b29afd0 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Unop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Unop.java
@@ -9,7 +9,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.analysis.type.PrimitiveTypeLatticeElement;
import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import java.util.function.Function;
@@ -48,7 +48,7 @@
}
@Override
- public Constraint inliningConstraint(
+ public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, DexType invocationContext) {
return inliningConstraints.forUnop();
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 33531da..00c3754 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -14,6 +14,7 @@
import com.android.tools.r8.graph.DexAnnotation;
import com.android.tools.r8.graph.DexApplication;
import com.android.tools.r8.graph.DexApplication.Builder;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethod;
@@ -41,7 +42,7 @@
import com.android.tools.r8.ir.optimize.DeadCodeRemover;
import com.android.tools.r8.ir.optimize.Devirtualizer;
import com.android.tools.r8.ir.optimize.Inliner;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.MemberValuePropagation;
import com.android.tools.r8.ir.optimize.NonNullTracker;
import com.android.tools.r8.ir.optimize.Outliner;
@@ -51,6 +52,7 @@
import com.android.tools.r8.ir.optimize.lambda.LambdaMerger;
import com.android.tools.r8.ir.regalloc.LinearScanRegisterAllocator;
import com.android.tools.r8.ir.regalloc.RegisterAllocator;
+import com.android.tools.r8.kotlin.KotlinInfo;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.naming.IdentifierNameStringMarker;
import com.android.tools.r8.shaking.protolite.ProtoLitePruner;
@@ -605,7 +607,7 @@
rewriteCode(method, feedback, isProcessedConcurrently, callSiteInformation, outlineHandler);
} else {
// Mark abstract methods as processed as well.
- method.markProcessed(Constraint.NEVER);
+ method.markProcessed(ConstraintWithTarget.NEVER);
}
}
@@ -632,12 +634,12 @@
method.toSourceString(), logCode(options, method));
}
if (options.skipIR) {
- feedback.markProcessed(method, Constraint.NEVER);
+ feedback.markProcessed(method, ConstraintWithTarget.NEVER);
return;
}
IRCode code = method.buildIR(appInfo, options, appInfo.originFor(method.method.holder));
if (code == null) {
- feedback.markProcessed(method, Constraint.NEVER);
+ feedback.markProcessed(method, ConstraintWithTarget.NEVER);
return;
}
if (Log.ENABLED) {
@@ -647,9 +649,10 @@
printC1VisualizerHeader(method);
printMethod(code, "Initial IR (SSA)");
- if (method.getCode() != null && method.getCode().isJarCode() &&
- appInfo.definitionFor(method.method.holder).hasKotlinInfo()) {
- computeKotlinNotNullParamHints(feedback, method, code);
+ DexClass holder = appInfo.definitionFor(method.method.holder);
+ if (method.getCode() != null && method.getCode().isJarCode()
+ && holder.hasKotlinInfo()) {
+ computeKotlinNotNullParamHints(feedback, holder.getKotlinInfo(), method, code);
}
if (options.canHaveArtStringNewInitBug()) {
@@ -807,8 +810,19 @@
}
private void computeKotlinNotNullParamHints(
- OptimizationFeedback feedback, DexEncodedMethod method, IRCode code) {
- // Try to infer Kotlin non-null parameter check to use it as a hint.
+ OptimizationFeedback feedback, KotlinInfo kotlinInfo, DexEncodedMethod method, IRCode code) {
+ // Use non-null parameter hints in Kotlin metadata if available.
+ if (kotlinInfo.hasNonNullParameterHints()) {
+ BitSet hintFromMetadata = kotlinInfo.lookupNonNullParameterHint(
+ method.method.name.toString(), method.method.proto.toDescriptorString());
+ if (hintFromMetadata != null) {
+ if (hintFromMetadata.length() > 0) {
+ feedback.setKotlinNotNullParamHints(method, hintFromMetadata);
+ }
+ return;
+ }
+ }
+ // Otherwise, fall back to inspecting the code.
List<Value> arguments = code.collectArguments(true);
BitSet paramsCheckedForNull = new BitSet();
DexMethod checkParameterIsNotNull =
@@ -869,9 +883,9 @@
private void markProcessed(DexEncodedMethod method, IRCode code, OptimizationFeedback feedback) {
// After all the optimizations have take place, we compute whether method should be inlinedex.
- Constraint state;
+ ConstraintWithTarget state;
if (!options.enableInlining || inliner == null) {
- state = Constraint.NEVER;
+ state = ConstraintWithTarget.NEVER;
} else {
state = inliner.computeInliningConstraint(code, method);
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedback.java b/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedback.java
index 49bfac8..0833579 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedback.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.DexEncodedMethod.ClassInlinerEligibility;
import com.android.tools.r8.graph.ParameterUsagesInfo;
import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import java.util.BitSet;
public interface OptimizationFeedback {
@@ -16,7 +16,7 @@
void methodReturnsConstant(DexEncodedMethod method, long value);
void methodNeverReturnsNull(DexEncodedMethod method);
void methodNeverReturnsNormally(DexEncodedMethod method);
- void markProcessed(DexEncodedMethod method, Constraint state);
+ void markProcessed(DexEncodedMethod method, ConstraintWithTarget state);
void markCheckNullReceiverBeforeAnySideEffect(DexEncodedMethod method, boolean mark);
void markTriggerClassInitBeforeAnySideEffect(DexEncodedMethod method, boolean mark);
void setClassInlinerEligibility(DexEncodedMethod method, ClassInlinerEligibility eligibility);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackDirect.java b/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackDirect.java
index 1d7a2d6..16267f6 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackDirect.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackDirect.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.DexEncodedMethod.ClassInlinerEligibility;
import com.android.tools.r8.graph.ParameterUsagesInfo;
import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import java.util.BitSet;
public class OptimizationFeedbackDirect implements OptimizationFeedback {
@@ -34,7 +34,7 @@
}
@Override
- public void markProcessed(DexEncodedMethod method, Constraint state) {
+ public void markProcessed(DexEncodedMethod method, ConstraintWithTarget state) {
method.markProcessed(state);
}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackIgnore.java b/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackIgnore.java
index 2fb2969..a27f200 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackIgnore.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackIgnore.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.DexEncodedMethod.ClassInlinerEligibility;
import com.android.tools.r8.graph.ParameterUsagesInfo;
import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import java.util.BitSet;
public class OptimizationFeedbackIgnore implements OptimizationFeedback {
@@ -26,7 +26,7 @@
public void methodNeverReturnsNormally(DexEncodedMethod method) {}
@Override
- public void markProcessed(DexEncodedMethod method, Constraint state) {}
+ public void markProcessed(DexEncodedMethod method, ConstraintWithTarget state) {}
@Override
public void markCheckNullReceiverBeforeAnySideEffect(DexEncodedMethod method, boolean mark) {}
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackSimple.java b/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackSimple.java
index b31f28a..2583f8f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackSimple.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/OptimizationFeedbackSimple.java
@@ -8,7 +8,7 @@
import com.android.tools.r8.graph.DexEncodedMethod.ClassInlinerEligibility;
import com.android.tools.r8.graph.DexEncodedMethod.TrivialInitializer;
import com.android.tools.r8.graph.ParameterUsagesInfo;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import java.util.BitSet;
public class OptimizationFeedbackSimple implements OptimizationFeedback {
@@ -34,9 +34,9 @@
}
@Override
- public void markProcessed(DexEncodedMethod method, Constraint state) {
+ public void markProcessed(DexEncodedMethod method, ConstraintWithTarget state) {
// Just as processed, don't provide any inlining constraints.
- method.markProcessed(Constraint.NEVER);
+ method.markProcessed(ConstraintWithTarget.NEVER);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
index f4a76e6..c538e86 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceProcessor.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.graph.ClassAccessFlags;
import com.android.tools.r8.graph.Code;
import com.android.tools.r8.graph.DexAnnotationSet;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexCode;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexEncodedMethod;
@@ -18,11 +19,15 @@
import com.android.tools.r8.graph.DexTypeList;
import com.android.tools.r8.graph.MethodAccessFlags;
import com.android.tools.r8.origin.SynthesizedOrigin;
+import java.util.ArrayDeque;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Deque;
+import java.util.HashSet;
import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
+import java.util.Set;
// Default and static method interface desugaring processor for interfaces.
//
@@ -78,7 +83,7 @@
}
// Remove bridge methods.
- if (!virtual.accessFlags.isBridge()) {
+ if (interfaceMethodRemovalChangesApi(virtual, iface)) {
remainingMethods.add(virtual);
}
}
@@ -180,6 +185,38 @@
companionClasses.put(iface, companionClass);
}
+ // Returns true if the given interface method must be kept on [iface] after moving its
+ // implementation to the companion class of [iface]. This is always the case for non-bridge
+ // methods. Bridge methods that does not override an implementation in a super-interface must
+ // also be kept (such a situation can happen if the vertical class merger merges two interfaces).
+ private boolean interfaceMethodRemovalChangesApi(DexEncodedMethod method, DexClass iface) {
+ if (method.accessFlags.isBridge()) {
+ Deque<DexType> worklist = new ArrayDeque<>();
+ Set<DexType> seenBefore = new HashSet<>();
+ if (iface.superType != null) {
+ worklist.add(iface.superType);
+ }
+ Collections.addAll(worklist, iface.interfaces.values);
+ while (!worklist.isEmpty()) {
+ DexType superType = worklist.pop();
+ if (!seenBefore.add(superType)) {
+ continue;
+ }
+ DexClass clazz = rewriter.findDefinitionFor(superType);
+ if (clazz != null) {
+ if (clazz.lookupVirtualMethod(method.method) != null) {
+ return false;
+ }
+ if (clazz.superType != null) {
+ worklist.add(clazz.superType);
+ }
+ Collections.addAll(worklist, clazz.interfaces.values);
+ }
+ }
+ }
+ return true;
+ }
+
private boolean isStaticMethod(DexEncodedMethod method) {
if (method.accessFlags.isNative()) {
throw new Unimplemented("Native interface methods are not yet supported.");
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
index e6de678..eb3511b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
@@ -18,7 +18,7 @@
import com.android.tools.r8.ir.code.InvokeVirtual;
import com.android.tools.r8.ir.code.NonNull;
import com.android.tools.r8.ir.code.Value;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
@@ -86,8 +86,9 @@
continue;
}
// Due to the potential downcast below, make sure the new target holder is visible.
- Constraint visibility = Constraint.classIsVisible(invocationContext, holderType, appInfo);
- if (visibility == Constraint.NEVER) {
+ ConstraintWithTarget visibility =
+ ConstraintWithTarget.classIsVisible(invocationContext, holderType, appInfo);
+ if (visibility == ConstraintWithTarget.NEVER) {
continue;
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index db674bd..283716b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -74,27 +74,30 @@
return blackList.contains(method.method) || appInfo.neverInline.contains(method);
}
- private Constraint instructionAllowedForInlining(
+ private ConstraintWithTarget instructionAllowedForInlining(
Instruction instruction, InliningConstraints inliningConstraints, DexType invocationContext) {
- Constraint result = instruction.inliningConstraint(inliningConstraints, invocationContext);
- if (result == Constraint.NEVER && instruction.isDebugInstruction()) {
- return Constraint.ALWAYS;
+ ConstraintWithTarget result =
+ instruction.inliningConstraint(inliningConstraints, invocationContext);
+ if (result == ConstraintWithTarget.NEVER && instruction.isDebugInstruction()) {
+ return ConstraintWithTarget.ALWAYS;
}
return result;
}
- public Constraint computeInliningConstraint(IRCode code, DexEncodedMethod method) {
- Constraint result = Constraint.ALWAYS;
+ public ConstraintWithTarget computeInliningConstraint(IRCode code, DexEncodedMethod method) {
+ ConstraintWithTarget result = ConstraintWithTarget.ALWAYS;
InliningConstraints inliningConstraints = new InliningConstraints(appInfo);
InstructionIterator it = code.instructionIterator();
while (it.hasNext()) {
Instruction instruction = it.next();
- Constraint state =
+ ConstraintWithTarget state =
instructionAllowedForInlining(instruction, inliningConstraints, method.method.holder);
- result = Constraint.min(result, state);
- if (result == Constraint.NEVER) {
+ if (state == ConstraintWithTarget.NEVER) {
+ result = state;
break;
}
+ // TODO(b/111080693): we may need to collect all meaningful constraints.
+ result = ConstraintWithTarget.min(result, state, appInfo);
}
return result;
}
@@ -178,8 +181,8 @@
// The ordinal values are important so please do not reorder.
NEVER, // Never inline this.
SAMECLASS, // Only inline this into methods with same holder.
- PACKAGE, // Only inline this into methods with holders from same package.
- SUBCLASS, // Only inline this into methods with holders from a subclass.
+ PACKAGE, // Only inline this into methods with holders from the same package.
+ SUBCLASS, // Only inline this into methods with holders from a subclass in a different package.
ALWAYS; // No restrictions for inlining this.
static {
@@ -189,7 +192,67 @@
assert SUBCLASS.ordinal() < ALWAYS.ordinal();
}
- public static Constraint deriveConstraint(
+ static Constraint min(Constraint one, Constraint other) {
+ return one.ordinal() < other.ordinal() ? one : other;
+ }
+ }
+
+ /**
+ * Encodes the constraints for inlining, along with the target holder.
+ * <p>
+ * Constraint itself cannot determine whether or not the method can be inlined if instructions in
+ * the method have different constraints with different targets. For example,
+ * SUBCLASS of x.A v.s. PACKAGE of y.B
+ * Without any target holder information, min of those two Constraints is PACKAGE, meaning that
+ * the current method can be inlined to any method whose holder is in package y. This could cause
+ * an illegal access error due to protect members in x.A. Because of different target holders,
+ * those constraints should not be combined.
+ * <p>
+ * Instead, a right constraint for inlining constraint for the example above is: a method whose
+ * holder is a subclass of x.A _and_ in the same package of y.B can inline this method.
+ */
+ public static class ConstraintWithTarget {
+ public final Constraint constraint;
+ // Note that this is not context---where this constraint is encoded.
+ // It literally refers to the holder type of the target, which could be:
+ // invoked method in invocations, field in field instructions, type of check-cast, etc.
+ final DexType targetHolder;
+
+ public static final ConstraintWithTarget NEVER = new ConstraintWithTarget(Constraint.NEVER);
+ public static final ConstraintWithTarget ALWAYS = new ConstraintWithTarget(Constraint.ALWAYS);
+
+ private ConstraintWithTarget(Constraint constraint) {
+ assert constraint == Constraint.NEVER || constraint == Constraint.ALWAYS;
+ this.constraint = constraint;
+ this.targetHolder = null;
+ }
+
+ ConstraintWithTarget(Constraint constraint, DexType targetHolder) {
+ assert constraint != Constraint.NEVER && constraint != Constraint.ALWAYS;
+ assert targetHolder != null;
+ this.constraint = constraint;
+ this.targetHolder = targetHolder;
+ }
+
+ @Override
+ public int hashCode() {
+ if (targetHolder == null) {
+ return constraint.ordinal();
+ }
+ return constraint.ordinal() * targetHolder.computeHashCode();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof ConstraintWithTarget)) {
+ return false;
+ }
+ ConstraintWithTarget o = (ConstraintWithTarget) other;
+ return this.constraint.ordinal() == o.constraint.ordinal()
+ && this.targetHolder == o.targetHolder;
+ }
+
+ public static ConstraintWithTarget deriveConstraint(
DexType contextHolder,
DexType targetHolder,
AccessFlags flags,
@@ -197,23 +260,25 @@
if (flags.isPublic()) {
return ALWAYS;
} else if (flags.isPrivate()) {
- return targetHolder == contextHolder ? SAMECLASS : NEVER;
+ return targetHolder == contextHolder
+ ? new ConstraintWithTarget(Constraint.SAMECLASS, targetHolder) : NEVER;
} else if (flags.isProtected()) {
if (targetHolder.isSamePackage(contextHolder)) {
// Even though protected, this is visible via the same package from the context.
- return PACKAGE;
+ return new ConstraintWithTarget(Constraint.PACKAGE, targetHolder);
} else if (contextHolder.isSubtypeOf(targetHolder, appInfo)) {
- return SUBCLASS;
+ return new ConstraintWithTarget(Constraint.SUBCLASS, targetHolder);
}
return NEVER;
} else {
/* package-private */
- return targetHolder.isSamePackage(contextHolder) ? PACKAGE : NEVER;
+ return targetHolder.isSamePackage(contextHolder)
+ ? new ConstraintWithTarget(Constraint.PACKAGE, targetHolder) : NEVER;
}
}
- public static Constraint classIsVisible(DexType context, DexType clazz,
- AppInfoWithSubtyping appInfo) {
+ public static ConstraintWithTarget classIsVisible(
+ DexType context, DexType clazz, AppInfoWithSubtyping appInfo) {
if (clazz.isArrayType()) {
return classIsVisible(context, clazz.toArrayElementType(appInfo.dexItemFactory), appInfo);
}
@@ -227,8 +292,76 @@
: deriveConstraint(context, clazz, definition.accessFlags, appInfo);
}
- public static Constraint min(Constraint one, Constraint other) {
- return one.ordinal() < other.ordinal() ? one : other;
+ public static ConstraintWithTarget min(
+ ConstraintWithTarget one, ConstraintWithTarget other, AppInfoWithSubtyping appInfo) {
+ if (one.equals(other)) {
+ return one;
+ }
+ if (one == NEVER || other == NEVER) {
+ return NEVER;
+ }
+ if (other.constraint.ordinal() < one.constraint.ordinal()) {
+ return min(other, one, appInfo);
+ }
+ // From now on, one.constraint.ordinal() <= other.constraint.ordinal()
+ if (other == ALWAYS) {
+ return one;
+ }
+ Constraint minConstraint = Constraint.min(one.constraint, other.constraint);
+ assert minConstraint != Constraint.NEVER;
+ assert minConstraint != Constraint.ALWAYS;
+ // SAMECLASS <= SAMECLASS, PACKAGE, SUBCLASS
+ if (minConstraint == Constraint.SAMECLASS) {
+ assert one.constraint == Constraint.SAMECLASS;
+ if (other.constraint == Constraint.SAMECLASS) {
+ assert one.targetHolder != other.targetHolder;
+ return NEVER;
+ }
+ if (other.constraint == Constraint.PACKAGE) {
+ if (one.targetHolder.isSamePackage(other.targetHolder)) {
+ return one;
+ }
+ return NEVER;
+ }
+ assert other.constraint == Constraint.SUBCLASS;
+ if (one.targetHolder.isSubtypeOf(other.targetHolder, appInfo)) {
+ return one;
+ }
+ return NEVER;
+ }
+ // PACKAGE <= PACKAGE, SUBCLASS
+ if (minConstraint == Constraint.PACKAGE) {
+ assert one.constraint == Constraint.PACKAGE;
+ if (other.constraint == Constraint.PACKAGE) {
+ assert one.targetHolder != other.targetHolder;
+ if (one.targetHolder.isSamePackage(other.targetHolder)) {
+ return one;
+ }
+ // PACKAGE of x and PACKAGE of y can be satisfied together.
+ return NEVER;
+ }
+ assert other.constraint == Constraint.SUBCLASS;
+ if (other.targetHolder.isSamePackage(one.targetHolder)) {
+ // Then, PACKAGE is more restrictive constraint.
+ return one;
+ }
+ // TODO(b/111080693): towards finer-grained constraints, we need both.
+ // Even though they're in different package, it is still inlinable to a class that is
+ // in the same package of one's context and a sub type of other's context.
+ return NEVER;
+ }
+ // SUBCLASS <= SUBCLASS
+ assert minConstraint == Constraint.SUBCLASS;
+ assert one.constraint == other.constraint;
+ assert one.targetHolder != other.targetHolder;
+ if (one.targetHolder.isSubtypeOf(other.targetHolder, appInfo)) {
+ return one;
+ }
+ if (other.targetHolder.isSubtypeOf(one.targetHolder, appInfo)) {
+ return other;
+ }
+ // SUBCLASS of x and SUBCLASS of y while x and y are not a subtype of each other.
+ return NEVER;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index 073d6ae..fe10637 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -15,6 +15,7 @@
import com.android.tools.r8.graph.GraphLense;
import com.android.tools.r8.ir.code.Invoke.Type;
import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import java.util.Collection;
@@ -45,71 +46,71 @@
this.graphLense = graphLense;
}
- public Constraint forAlwaysMaterializingUser() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forAlwaysMaterializingUser() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forArgument() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forArgument() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forArrayGet() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forArrayGet() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forArrayLength() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forArrayLength() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forArrayPut() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forArrayPut() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forBinop() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forBinop() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forCheckCast(DexType type, DexType invocationContext) {
- return Constraint.classIsVisible(invocationContext, type, appInfo);
+ public ConstraintWithTarget forCheckCast(DexType type, DexType invocationContext) {
+ return ConstraintWithTarget.classIsVisible(invocationContext, type, appInfo);
}
- public Constraint forConstClass(DexType type, DexType invocationContext) {
- return Constraint.classIsVisible(invocationContext, type, appInfo);
+ public ConstraintWithTarget forConstClass(DexType type, DexType invocationContext) {
+ return ConstraintWithTarget.classIsVisible(invocationContext, type, appInfo);
}
- public Constraint forConstInstruction() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forConstInstruction() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forDebugLocalRead() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forDebugLocalRead() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forDebugLocalsChange() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forDebugLocalsChange() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forDebugPosition() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forDebugPosition() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forInstanceGet(DexField field, DexType invocationContext) {
+ public ConstraintWithTarget forInstanceGet(DexField field, DexType invocationContext) {
DexField lookup = graphLense.lookupField(field);
return forFieldInstruction(
lookup, appInfo.lookupInstanceTarget(lookup.clazz, lookup), invocationContext);
}
- public Constraint forInstanceOf(DexType type, DexType invocationContext) {
- return Constraint.classIsVisible(invocationContext, type, appInfo);
+ public ConstraintWithTarget forInstanceOf(DexType type, DexType invocationContext) {
+ return ConstraintWithTarget.classIsVisible(invocationContext, type, appInfo);
}
- public Constraint forInstancePut(DexField field, DexType invocationContext) {
+ public ConstraintWithTarget forInstancePut(DexField field, DexType invocationContext) {
DexField lookup = graphLense.lookupField(field);
return forFieldInstruction(
lookup, appInfo.lookupInstanceTarget(lookup.clazz, lookup), invocationContext);
}
- public Constraint forInvoke(DexMethod method, Type type, DexType invocationContext) {
+ public ConstraintWithTarget forInvoke(DexMethod method, Type type, DexType invocationContext) {
switch (type) {
case DIRECT:
return forInvokeDirect(method, invocationContext);
@@ -130,162 +131,165 @@
}
}
- public Constraint forInvokeCustom() {
- return Constraint.NEVER;
+ public ConstraintWithTarget forInvokeCustom() {
+ return ConstraintWithTarget.NEVER;
}
- public Constraint forInvokeDirect(DexMethod method, DexType invocationContext) {
+ public ConstraintWithTarget forInvokeDirect(DexMethod method, DexType invocationContext) {
DexMethod lookup = graphLense.lookupMethod(method);
return forSingleTargetInvoke(lookup, appInfo.lookupDirectTarget(lookup), invocationContext);
}
- public Constraint forInvokeInterface(DexMethod method, DexType invocationContext) {
+ public ConstraintWithTarget forInvokeInterface(DexMethod method, DexType invocationContext) {
DexMethod lookup = graphLense.lookupMethod(method);
return forVirtualInvoke(lookup, appInfo.lookupInterfaceTargets(lookup), invocationContext);
}
- public Constraint forInvokeMultiNewArray(DexType type, DexType invocationContext) {
- return Constraint.classIsVisible(invocationContext, type, appInfo);
+ public ConstraintWithTarget forInvokeMultiNewArray(DexType type, DexType invocationContext) {
+ return ConstraintWithTarget.classIsVisible(invocationContext, type, appInfo);
}
- public Constraint forInvokeNewArray(DexType type, DexType invocationContext) {
- return Constraint.classIsVisible(invocationContext, type, appInfo);
+ public ConstraintWithTarget forInvokeNewArray(DexType type, DexType invocationContext) {
+ return ConstraintWithTarget.classIsVisible(invocationContext, type, appInfo);
}
- public Constraint forInvokePolymorphic(DexMethod method, DexType invocationContext) {
- return Constraint.NEVER;
+ public ConstraintWithTarget forInvokePolymorphic(DexMethod method, DexType invocationContext) {
+ return ConstraintWithTarget.NEVER;
}
- public Constraint forInvokeStatic(DexMethod method, DexType invocationContext) {
+ public ConstraintWithTarget forInvokeStatic(DexMethod method, DexType invocationContext) {
DexMethod lookup = graphLense.lookupMethod(method);
return forSingleTargetInvoke(lookup, appInfo.lookupStaticTarget(lookup), invocationContext);
}
- public Constraint forInvokeSuper(DexMethod method, DexType invocationContext) {
+ public ConstraintWithTarget forInvokeSuper(DexMethod method, DexType invocationContext) {
// The semantics of invoke super depend on the context.
- return Constraint.SAMECLASS;
+ return new ConstraintWithTarget(Constraint.SAMECLASS, invocationContext);
}
- public Constraint forInvokeVirtual(DexMethod method, DexType invocationContext) {
+ public ConstraintWithTarget forInvokeVirtual(DexMethod method, DexType invocationContext) {
DexMethod lookup = graphLense.lookupMethod(method);
return forVirtualInvoke(lookup, appInfo.lookupVirtualTargets(lookup), invocationContext);
}
- public Constraint forJumpInstruction() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forJumpInstruction() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forLoad() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forLoad() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forMonitor() {
+ public ConstraintWithTarget forMonitor() {
// Conservative choice.
- return Constraint.NEVER;
+ return ConstraintWithTarget.NEVER;
}
- public Constraint forMove() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forMove() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forMoveException() {
+ public ConstraintWithTarget forMoveException() {
// TODO(64432527): Revisit this constraint.
- return Constraint.NEVER;
+ return ConstraintWithTarget.NEVER;
}
- public Constraint forNewArrayEmpty(DexType type, DexType invocationContext) {
- return Constraint.classIsVisible(invocationContext, type, appInfo);
+ public ConstraintWithTarget forNewArrayEmpty(DexType type, DexType invocationContext) {
+ return ConstraintWithTarget.classIsVisible(invocationContext, type, appInfo);
}
- public Constraint forNewArrayFilledData() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forNewArrayFilledData() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forNewInstance(DexType type, DexType invocationContext) {
- return Constraint.classIsVisible(invocationContext, type, appInfo);
+ public ConstraintWithTarget forNewInstance(DexType type, DexType invocationContext) {
+ return ConstraintWithTarget.classIsVisible(invocationContext, type, appInfo);
}
- public Constraint forNonNull() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forNonNull() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forPop() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forPop() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forReturn() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forReturn() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forStaticGet(DexField field, DexType invocationContext) {
+ public ConstraintWithTarget forStaticGet(DexField field, DexType invocationContext) {
DexField lookup = graphLense.lookupField(field);
return forFieldInstruction(
lookup, appInfo.lookupStaticTarget(lookup.clazz, lookup), invocationContext);
}
- public Constraint forStaticPut(DexField field, DexType invocationContext) {
+ public ConstraintWithTarget forStaticPut(DexField field, DexType invocationContext) {
DexField lookup = graphLense.lookupField(field);
return forFieldInstruction(
lookup, appInfo.lookupStaticTarget(lookup.clazz, lookup), invocationContext);
}
- public Constraint forStore() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forStore() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forThrow() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forThrow() {
+ return ConstraintWithTarget.ALWAYS;
}
- public Constraint forUnop() {
- return Constraint.ALWAYS;
+ public ConstraintWithTarget forUnop() {
+ return ConstraintWithTarget.ALWAYS;
}
- private Constraint forFieldInstruction(
+ private ConstraintWithTarget forFieldInstruction(
DexField field, DexEncodedField target, DexType invocationContext) {
// Resolve the field if possible and decide whether the instruction can inlined.
DexType fieldHolder = graphLense.lookupType(field.clazz);
DexClass fieldClass = appInfo.definitionFor(fieldHolder);
if (target != null && fieldClass != null) {
- Constraint fieldConstraint =
- Constraint.deriveConstraint(invocationContext, fieldHolder, target.accessFlags, appInfo);
- Constraint classConstraint =
- Constraint.deriveConstraint(
+ ConstraintWithTarget fieldConstraintWithTarget =
+ ConstraintWithTarget.deriveConstraint(
+ invocationContext, fieldHolder, target.accessFlags, appInfo);
+ ConstraintWithTarget classConstraintWithTarget =
+ ConstraintWithTarget.deriveConstraint(
invocationContext, fieldHolder, fieldClass.accessFlags, appInfo);
- return Constraint.min(fieldConstraint, classConstraint);
+ return ConstraintWithTarget.min(
+ fieldConstraintWithTarget, classConstraintWithTarget, appInfo);
}
- return Constraint.NEVER;
+ return ConstraintWithTarget.NEVER;
}
- private Constraint forSingleTargetInvoke(
+ private ConstraintWithTarget forSingleTargetInvoke(
DexMethod method, DexEncodedMethod target, DexType invocationContext) {
if (method.holder.isArrayType()) {
- return Constraint.ALWAYS;
+ return ConstraintWithTarget.ALWAYS;
}
if (target != null) {
DexType methodHolder = graphLense.lookupType(target.method.holder);
DexClass methodClass = appInfo.definitionFor(methodHolder);
if (methodClass != null) {
- Constraint methodConstraint =
- Constraint.deriveConstraint(
+ ConstraintWithTarget methodConstraintWithTarget =
+ ConstraintWithTarget.deriveConstraint(
invocationContext, methodHolder, target.accessFlags, appInfo);
// We also have to take the constraint of the enclosing class into account.
- Constraint classConstraint =
- Constraint.deriveConstraint(
+ ConstraintWithTarget classConstraintWithTarget =
+ ConstraintWithTarget.deriveConstraint(
invocationContext, methodHolder, methodClass.accessFlags, appInfo);
- return Constraint.min(methodConstraint, classConstraint);
+ return ConstraintWithTarget.min(
+ methodConstraintWithTarget, classConstraintWithTarget, appInfo);
}
}
- return Constraint.NEVER;
+ return ConstraintWithTarget.NEVER;
}
- private Constraint forVirtualInvoke(
+ private ConstraintWithTarget forVirtualInvoke(
DexMethod method, Collection<DexEncodedMethod> targets, DexType invocationContext) {
if (method.holder.isArrayType()) {
- return Constraint.ALWAYS;
+ return ConstraintWithTarget.ALWAYS;
}
if (targets == null) {
- return Constraint.NEVER;
+ return ConstraintWithTarget.NEVER;
}
// Perform resolution and derive inlining constraints based on the accessibility of the
@@ -294,25 +298,26 @@
DexEncodedMethod resolutionTarget = resolutionResult.asResultOfResolve();
if (resolutionTarget == null) {
// This will fail at runtime.
- return Constraint.NEVER;
+ return ConstraintWithTarget.NEVER;
}
DexType methodHolder = graphLense.lookupType(resolutionTarget.method.holder);
DexClass methodClass = appInfo.definitionFor(methodHolder);
assert methodClass != null;
- Constraint methodConstraint =
- Constraint.deriveConstraint(
+ ConstraintWithTarget methodConstraintWithTarget =
+ ConstraintWithTarget.deriveConstraint(
invocationContext, methodHolder, resolutionTarget.accessFlags, appInfo);
// We also have to take the constraint of the enclosing class of the resolution result
// into account. We do not allow inlining this method if it is calling something that
// is inaccessible. Inlining in that case could move the code to another package making a
// call succeed that should not succeed. Conversely, if the resolution result is accessible,
// we have to make sure that inlining cannot make it inaccessible.
- Constraint classConstraint =
- Constraint.deriveConstraint(
+ ConstraintWithTarget classConstraintWithTarget =
+ ConstraintWithTarget.deriveConstraint(
invocationContext, methodHolder, methodClass.accessFlags, appInfo);
- Constraint result = Constraint.min(methodConstraint, classConstraint);
- if (result == Constraint.NEVER) {
+ ConstraintWithTarget result =
+ ConstraintWithTarget.min(methodConstraintWithTarget, classConstraintWithTarget, appInfo);
+ if (result == ConstraintWithTarget.NEVER) {
return result;
}
@@ -321,10 +326,11 @@
for (DexEncodedMethod target : targets) {
methodHolder = graphLense.lookupType(target.method.holder);
assert appInfo.definitionFor(methodHolder) != null;
- methodConstraint =
- Constraint.deriveConstraint(invocationContext, methodHolder, target.accessFlags, appInfo);
- result = Constraint.min(result, methodConstraint);
- if (result == Constraint.NEVER) {
+ methodConstraintWithTarget =
+ ConstraintWithTarget.deriveConstraint(
+ invocationContext, methodHolder, target.accessFlags, appInfo);
+ result = ConstraintWithTarget.min(result, methodConstraintWithTarget, appInfo);
+ if (result == ConstraintWithTarget.NEVER) {
return result;
}
}
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
index 6f3a0f5..505d192 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Outliner.java
@@ -44,7 +44,7 @@
import com.android.tools.r8.ir.code.ValueType;
import com.android.tools.r8.ir.conversion.IRBuilder;
import com.android.tools.r8.ir.conversion.SourceCode;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.naming.ClassNameMapper;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.origin.SynthesizedOrigin;
@@ -476,8 +476,9 @@
// See whether we could move this invoke somewhere else. We reuse the logic from inlining
// here, as the constraints are the same.
- Constraint constraint = invoke.inliningConstraint(inliningConstraints, method.method.holder);
- if (constraint != Constraint.ALWAYS) {
+ ConstraintWithTarget constraint =
+ invoke.inliningConstraint(inliningConstraints, method.method.holder);
+ if (constraint != ConstraintWithTarget.ALWAYS) {
return false;
}
// Find the number of in-going arguments, if adding this instruction.
diff --git a/src/main/java/com/android/tools/r8/jar/InliningConstraintVisitor.java b/src/main/java/com/android/tools/r8/jar/InliningConstraintVisitor.java
index 459d7de..dbc48a3 100644
--- a/src/main/java/com/android/tools/r8/jar/InliningConstraintVisitor.java
+++ b/src/main/java/com/android/tools/r8/jar/InliningConstraintVisitor.java
@@ -17,7 +17,7 @@
import com.android.tools.r8.graph.JarApplicationReader;
import com.android.tools.r8.ir.code.Invoke;
import com.android.tools.r8.ir.conversion.JarSourceCode;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.InliningConstraints;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import org.objectweb.asm.MethodVisitor;
@@ -40,7 +40,7 @@
private final DexEncodedMethod method;
private final DexType invocationContext;
- private Constraint constraint;
+ private ConstraintWithTarget constraint;
public InliningConstraintVisitor(
JarApplicationReader application,
@@ -58,22 +58,22 @@
this.invocationContext = invocationContext;
// Model a synchronized method as having a monitor instruction.
- this.constraint =
- method.accessFlags.isSynchronized() ? inliningConstraints.forMonitor() : Constraint.ALWAYS;
+ this.constraint = method.accessFlags.isSynchronized()
+ ? inliningConstraints.forMonitor() : ConstraintWithTarget.ALWAYS;
}
- public Constraint getConstraint() {
+ public ConstraintWithTarget getConstraint() {
return constraint;
}
- private void updateConstraint(Constraint other) {
- constraint = Constraint.min(constraint, other);
+ private void updateConstraint(ConstraintWithTarget other) {
+ constraint = ConstraintWithTarget.min(constraint, other, appInfo);
}
// Used to signal that the result is ready, such that we do not need to visit all instructions of
// the method, if we can see early on that it cannot be inlined anyway.
public boolean isFinished() {
- return constraint == Constraint.NEVER;
+ return constraint == ConstraintWithTarget.NEVER;
}
public void accept(TryCatchBlockNode tryCatchBlock) {
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
index 74184a5..d15ed5a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClass.java
@@ -4,7 +4,12 @@
package com.android.tools.r8.kotlin;
+import static kotlinx.metadata.Flag.Property.IS_VAR;
+
import kotlinx.metadata.KmClassVisitor;
+import kotlinx.metadata.KmConstructorVisitor;
+import kotlinx.metadata.KmFunctionVisitor;
+import kotlinx.metadata.KmPropertyVisitor;
import kotlinx.metadata.jvm.KotlinClassMetadata;
public class KotlinClass extends KotlinInfo<KotlinClassMetadata.Class> {
@@ -20,13 +25,30 @@
}
@Override
- void validateMetadata(KotlinClassMetadata.Class metadata) {
- ClassMetadataVisitor visitor = new ClassMetadataVisitor();
+ void processMetadata(KotlinClassMetadata.Class metadata) {
// To avoid lazy parsing/verifying metadata.
- metadata.accept(visitor);
+ metadata.accept(new ClassVisitorForNonNullParameterHints());
}
- private static class ClassMetadataVisitor extends KmClassVisitor {
+ private class ClassVisitorForNonNullParameterHints extends KmClassVisitor {
+ @Override
+ public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
+ return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+ }
+
+ @Override
+ public KmConstructorVisitor visitConstructor(int ctorFlags) {
+ return new NonNullParameterHintCollector.ConstructorVisitor(nonNullparamHints);
+ }
+
+ @Override
+ public KmPropertyVisitor visitProperty(
+ int propertyFlags, String name, int getterFlags, int setterFlags) {
+ if (IS_VAR.invoke(propertyFlags)) {
+ return new NonNullParameterHintCollector.PropertyVisitor(nonNullparamHints);
+ }
+ return null;
+ }
}
@Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
index 62db3d1..de8a12a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassFacade.java
@@ -20,7 +20,7 @@
}
@Override
- void validateMetadata(KotlinClassMetadata.MultiFileClassFacade metadata) {
+ void processMetadata(KotlinClassMetadata.MultiFileClassFacade metadata) {
// No worries about lazy parsing/verifying, since no API to explore metadata details.
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java b/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
index da66e6c..225e63a 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinClassPart.java
@@ -4,7 +4,11 @@
package com.android.tools.r8.kotlin;
+import static kotlinx.metadata.Flag.Property.IS_VAR;
+
+import kotlinx.metadata.KmFunctionVisitor;
import kotlinx.metadata.KmPackageVisitor;
+import kotlinx.metadata.KmPropertyVisitor;
import kotlinx.metadata.jvm.KotlinClassMetadata;
public final class KotlinClassPart extends KotlinInfo<KotlinClassMetadata.MultiFileClassPart> {
@@ -21,12 +25,25 @@
}
@Override
- void validateMetadata(KotlinClassMetadata.MultiFileClassPart metadata) {
+ void processMetadata(KotlinClassMetadata.MultiFileClassPart metadata) {
// To avoid lazy parsing/verifying metadata.
- metadata.accept(new MultiFileClassPartMetadataVisitor());
+ metadata.accept(new PackageVisitorForNonNullParameterHints());
}
- private static class MultiFileClassPartMetadataVisitor extends KmPackageVisitor {
+ private class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
+ @Override
+ public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
+ return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+ }
+
+ @Override
+ public KmPropertyVisitor visitProperty(
+ int propertyFlags, String name, int getterFlags, int setterFlags) {
+ if (IS_VAR.invoke(propertyFlags)) {
+ return new NonNullParameterHintCollector.PropertyVisitor(nonNullparamHints);
+ }
+ return null;
+ }
}
@Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java b/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
index bcb70ed..2f9477e 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinFile.java
@@ -4,7 +4,11 @@
package com.android.tools.r8.kotlin;
+import static kotlinx.metadata.Flag.Property.IS_VAR;
+
+import kotlinx.metadata.KmFunctionVisitor;
import kotlinx.metadata.KmPackageVisitor;
+import kotlinx.metadata.KmPropertyVisitor;
import kotlinx.metadata.jvm.KotlinClassMetadata;
public final class KotlinFile extends KotlinInfo<KotlinClassMetadata.FileFacade> {
@@ -21,12 +25,25 @@
}
@Override
- void validateMetadata(KotlinClassMetadata.FileFacade metadata) {
+ void processMetadata(KotlinClassMetadata.FileFacade metadata) {
// To avoid lazy parsing/verifying metadata.
- metadata.accept(new FileFacadeMetadataVisitor());
+ metadata.accept(new PackageVisitorForNonNullParameterHints());
}
- private static class FileFacadeMetadataVisitor extends KmPackageVisitor {
+ private class PackageVisitorForNonNullParameterHints extends KmPackageVisitor {
+ @Override
+ public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
+ return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+ }
+
+ @Override
+ public KmPropertyVisitor visitProperty(
+ int propertyFlags, String name, int getterFlags, int setterFlags) {
+ if (IS_VAR.invoke(propertyFlags)) {
+ return new NonNullParameterHintCollector.PropertyVisitor(nonNullparamHints);
+ }
+ return null;
+ }
}
@Override
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
index 702e0eb..7cc8aa1 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinInfo.java
@@ -4,22 +4,25 @@
package com.android.tools.r8.kotlin;
+import com.google.common.collect.HashBasedTable;
+import java.util.BitSet;
import kotlinx.metadata.jvm.KotlinClassMetadata;
// Provides access to kotlin information.
public abstract class KotlinInfo<MetadataKind extends KotlinClassMetadata> {
MetadataKind metadata;
+ final HashBasedTable<String, String, BitSet> nonNullparamHints = HashBasedTable.create();
KotlinInfo() {
}
KotlinInfo(MetadataKind metadata) {
- validateMetadata(metadata);
+ processMetadata(metadata);
this.metadata = metadata;
}
- // Subtypes will define how to validate the given metadata.
- abstract void validateMetadata(MetadataKind metadata);
+ // Subtypes will define how to process the given metadata.
+ abstract void processMetadata(MetadataKind metadata);
public enum Kind {
Class, File, Synthetic, Part, Facade
@@ -66,4 +69,12 @@
public KotlinClassFacade asClassFacade() {
return null;
}
+
+ public boolean hasNonNullParameterHints() {
+ return !nonNullparamHints.isEmpty();
+ }
+
+ public BitSet lookupNonNullParameterHint(String name, String descriptor) {
+ return nonNullparamHints.get(name, descriptor);
+ }
}
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
index 4660800..fc11f8c 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinSyntheticClass.java
@@ -5,6 +5,7 @@
package com.android.tools.r8.kotlin;
import com.android.tools.r8.graph.DexClass;
+import kotlinx.metadata.KmFunctionVisitor;
import kotlinx.metadata.KmLambdaVisitor;
import kotlinx.metadata.jvm.KotlinClassMetadata;
@@ -32,21 +33,23 @@
}
private KotlinSyntheticClass(Flavour flavour, KotlinClassMetadata.SyntheticClass metadata) {
+ super(metadata);
this.flavour = flavour;
- validateMetadata(metadata);
- this.metadata = metadata;
}
@Override
- void validateMetadata(KotlinClassMetadata.SyntheticClass metadata) {
+ void processMetadata(KotlinClassMetadata.SyntheticClass metadata) {
if (metadata.isLambda()) {
- SyntheticClassMetadataVisitor visitor = new SyntheticClassMetadataVisitor();
// To avoid lazy parsing/verifying metadata.
- metadata.accept(visitor);
+ metadata.accept(new LambdaVisitorForNonNullParameterHints());
}
}
- private static class SyntheticClassMetadataVisitor extends KmLambdaVisitor {
+ private class LambdaVisitorForNonNullParameterHints extends KmLambdaVisitor {
+ @Override
+ public KmFunctionVisitor visitFunction(int functionFlags, String functionName) {
+ return new NonNullParameterHintCollector.FunctionVisitor(nonNullparamHints);
+ }
}
public boolean isLambda() {
diff --git a/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java b/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
new file mode 100644
index 0000000..21b9409
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
@@ -0,0 +1,184 @@
+// Copyright (c) 2018, 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.kotlin;
+
+import static kotlinx.metadata.Flag.Type.IS_NULLABLE;
+
+import com.google.common.collect.HashBasedTable;
+import java.util.BitSet;
+import kotlinx.metadata.KmConstructorExtensionVisitor;
+import kotlinx.metadata.KmConstructorVisitor;
+import kotlinx.metadata.KmExtensionType;
+import kotlinx.metadata.KmFunctionExtensionVisitor;
+import kotlinx.metadata.KmFunctionVisitor;
+import kotlinx.metadata.KmPropertyExtensionVisitor;
+import kotlinx.metadata.KmPropertyVisitor;
+import kotlinx.metadata.KmTypeVisitor;
+import kotlinx.metadata.KmValueParameterVisitor;
+import kotlinx.metadata.jvm.JvmConstructorExtensionVisitor;
+import kotlinx.metadata.jvm.JvmFieldSignature;
+import kotlinx.metadata.jvm.JvmFunctionExtensionVisitor;
+import kotlinx.metadata.jvm.JvmMethodSignature;
+import kotlinx.metadata.jvm.JvmPropertyExtensionVisitor;
+
+class NonNullParameterHintCollector {
+
+ static class FunctionVisitor extends KmFunctionVisitor {
+
+ private final HashBasedTable<String, String, BitSet> paramHints;
+
+ private BitSet paramHint = new BitSet();
+ private int paramIndex = 0;
+ private String name = "";
+ private String descriptor = "";
+
+ FunctionVisitor(HashBasedTable<String, String, BitSet> paramHints) {
+ this.paramHints = paramHints;
+ }
+
+ @Override
+ public KmTypeVisitor visitReceiverParameterType(int typeFlags) {
+ if (!IS_NULLABLE.invoke(typeFlags)) {
+ paramHint.set(paramIndex);
+ }
+ paramIndex++;
+ return null;
+ }
+
+ @Override
+ public KmValueParameterVisitor visitValueParameter(int paramFlags, String paramName) {
+ return new KmValueParameterVisitor() {
+ @Override
+ public KmTypeVisitor visitType(int typeFlags) {
+ if (!IS_NULLABLE.invoke(typeFlags)) {
+ paramHint.set(paramIndex);
+ }
+ paramIndex++;
+ return null;
+ }
+ };
+ }
+
+ @Override
+ public KmFunctionExtensionVisitor visitExtensions(KmExtensionType type) {
+ if (type != JvmFunctionExtensionVisitor.TYPE) {
+ return null;
+ }
+ return new JvmFunctionExtensionVisitor() {
+ @Override
+ public void visit(JvmMethodSignature desc) {
+ name = desc.getName();
+ descriptor = desc.getDesc();
+ }
+ };
+ }
+
+ @Override
+ public void visitEnd() {
+ if (name.isEmpty() || descriptor.isEmpty()) {
+ return;
+ }
+ paramHints.put(name, descriptor, paramHint);
+ }
+ }
+
+ static class ConstructorVisitor extends KmConstructorVisitor {
+ private final HashBasedTable<String, String, BitSet> paramHints;
+
+ private BitSet paramHint = new BitSet();
+ private int paramIndex = 0;
+ private final String name = "<init>";
+ private String descriptor = "";
+
+ ConstructorVisitor(HashBasedTable<String, String, BitSet> paramHints) {
+ this.paramHints = paramHints;
+ }
+
+ @Override
+ public KmValueParameterVisitor visitValueParameter(int paramFlags, String paramName) {
+ return new KmValueParameterVisitor() {
+ @Override
+ public KmTypeVisitor visitType(int typeFlags) {
+ if (!IS_NULLABLE.invoke(typeFlags)) {
+ paramHint.set(paramIndex);
+ }
+ paramIndex++;
+ return null;
+ }
+ };
+ }
+
+ @Override
+ public KmConstructorExtensionVisitor visitExtensions(KmExtensionType type) {
+ if (type != JvmConstructorExtensionVisitor.TYPE) {
+ return null;
+ }
+ return new JvmConstructorExtensionVisitor() {
+ @Override
+ public void visit(JvmMethodSignature desc) {
+ assert name.equals(desc.getName());
+ descriptor = desc.getDesc();
+ }
+ };
+ }
+
+ @Override
+ public void visitEnd() {
+ if (descriptor.isEmpty()) {
+ return;
+ }
+ paramHints.put(name, descriptor, paramHint);
+ }
+ }
+
+ static class PropertyVisitor extends KmPropertyVisitor {
+ private final HashBasedTable<String, String, BitSet> paramHints;
+
+ private BitSet paramHint = new BitSet();
+ private int paramIndex = 0;
+ private String name = "";
+ private String descriptor = "";
+
+ PropertyVisitor(HashBasedTable<String, String, BitSet> paramHints) {
+ this.paramHints = paramHints;
+ }
+
+ @Override
+ public KmTypeVisitor visitReturnType(int typeFlags) {
+ if (!IS_NULLABLE.invoke(typeFlags)) {
+ paramHint.set(paramIndex);
+ }
+ paramIndex++;
+ return null;
+ }
+
+ @Override
+ public KmPropertyExtensionVisitor visitExtensions(KmExtensionType type) {
+ if (type != JvmPropertyExtensionVisitor.TYPE) {
+ return null;
+ }
+ return new JvmPropertyExtensionVisitor() {
+ @Override
+ public void visit(
+ JvmFieldSignature fieldDesc,
+ JvmMethodSignature getterDesc,
+ JvmMethodSignature setterDesc) {
+ if (setterDesc != null) {
+ name = setterDesc.getName();
+ descriptor = setterDesc.getDesc();
+ }
+ }
+ };
+ }
+
+ @Override
+ public void visitEnd() {
+ if (name.isEmpty() || descriptor.isEmpty()) {
+ return;
+ }
+ paramHints.put(name, descriptor, paramHint);
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index fe098cc..c1d7403 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -12,7 +12,7 @@
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLense;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.shaking.Enqueuer.AppInfoWithLiveness;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
@@ -208,14 +208,14 @@
if (holder == null) {
return false;
}
- Constraint classVisibility =
- Constraint.deriveConstraint(context, holderType, holder.accessFlags, appInfo);
- if (classVisibility == Constraint.NEVER) {
+ ConstraintWithTarget classVisibility =
+ ConstraintWithTarget.deriveConstraint(context, holderType, holder.accessFlags, appInfo);
+ if (classVisibility == ConstraintWithTarget.NEVER) {
return false;
}
- Constraint fieldVisibility =
- Constraint.deriveConstraint(context, holderType, field.accessFlags, appInfo);
- return fieldVisibility != Constraint.NEVER;
+ ConstraintWithTarget fieldVisibility =
+ ConstraintWithTarget.deriveConstraint(context, holderType, field.accessFlags, appInfo);
+ return fieldVisibility != ConstraintWithTarget.NEVER;
}
private Map<DexField, Set<DexEncodedMethod>> mergeFieldAccessContexts(
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index 451b2cb..a19c0d5 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -31,7 +31,7 @@
import com.android.tools.r8.graph.PresortedComparable;
import com.android.tools.r8.graph.UseRegistry;
import com.android.tools.r8.ir.code.Invoke.Type;
-import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
import com.android.tools.r8.ir.optimize.MethodPoolCollection;
import com.android.tools.r8.ir.optimize.MethodPoolCollection.MethodPool;
import com.android.tools.r8.ir.synthetic.ForwardMethodSourceCode;
@@ -1486,13 +1486,13 @@
// that we always return true here in these cases.
if (method.getCode().isJarCode()) {
JarCode jarCode = method.getCode().asJarCode();
- Constraint constraint =
+ ConstraintWithTarget constraint =
jarCode.computeInliningConstraint(
method,
appInfo,
new SingleTypeMapperGraphLense(method.method.holder, invocationContext),
invocationContext);
- return constraint == Constraint.NEVER;
+ return constraint == ConstraintWithTarget.NEVER;
}
// TODO(christofferqa): For non-jar code we currently cannot guarantee that markForceInline()
// will succeed.
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ConstraintWithTargetTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ConstraintWithTargetTest.java
new file mode 100644
index 0000000..f3dbe46
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ConstraintWithTargetTest.java
@@ -0,0 +1,144 @@
+// Copyright (c) 2018, 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.ir.optimize;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.dex.ApplicationReader;
+import com.android.tools.r8.graph.AppInfoWithSubtyping;
+import com.android.tools.r8.graph.DexApplication;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.optimize.Inliner.Constraint;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
+import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.Timing;
+import org.junit.BeforeClass;
+import org.junit.Test;
+
+public class ConstraintWithTargetTest {
+ private static DexItemFactory factory;
+ private static AppInfoWithSubtyping appInfo;
+
+ @BeforeClass
+ public static void makeAppInfo() throws Exception {
+ InternalOptions options = new InternalOptions();
+ DexApplication application =
+ new ApplicationReader(
+ AndroidApp.builder()
+ .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
+ .build(),
+ options,
+ new Timing(ConstraintWithTargetTest.class.getName()))
+ .read()
+ .toDirect();
+ factory = options.itemFactory;
+ appInfo = new AppInfoWithSubtyping(application);
+ }
+
+ private ConstraintWithTarget never() {
+ return ConstraintWithTarget.NEVER;
+ }
+
+ private ConstraintWithTarget always() {
+ return ConstraintWithTarget.ALWAYS;
+ }
+
+ private ConstraintWithTarget element(Constraint constraint, DexType type) {
+ return new ConstraintWithTarget(constraint, type);
+ }
+
+ private ConstraintWithTarget meet(ConstraintWithTarget e1, ConstraintWithTarget e2) {
+ return ConstraintWithTarget.min(e1, e2, appInfo);
+ }
+
+ @Test
+ public void meetNeverIsNever() {
+ assertEquals(never(),
+ meet(never(), always()));
+ assertEquals(never(),
+ meet(always(), never()));
+ assertEquals(never(),
+ meet(never(), element(Constraint.SAMECLASS, factory.objectType)));
+ }
+
+ @Test
+ public void meetAlwaysIsUnit() {
+ ConstraintWithTarget o = element(Constraint.SUBCLASS, factory.objectType);
+ assertEquals(o,
+ meet(always(), o));
+ assertEquals(o,
+ meet(o, always()));
+ }
+
+ @Test
+ public void withSameTarget() {
+ DexType s = factory.createType("Ljava/lang/String;");
+ ConstraintWithTarget c0 = element(Constraint.SAMECLASS, s);
+ ConstraintWithTarget c1 = element(Constraint.PACKAGE, s);
+ ConstraintWithTarget c2 = element(Constraint.SUBCLASS, s);
+ assertEquals(c0,
+ meet(c1, c0));
+ assertEquals(c0,
+ meet(c0, c2));
+ assertEquals(c1,
+ meet(c2, c1));
+ }
+
+ @Test
+ public void withDifferentTarget() {
+ DexType s = factory.createType("Ljava/lang/String;");
+ DexType b = factory.createType("Ljava/lang/StringBuilder;");
+ ConstraintWithTarget c1 = element(Constraint.SAMECLASS, s);
+ ConstraintWithTarget c2 = element(Constraint.SAMECLASS, b);
+ assertEquals(never(),
+ meet(c1, c2));
+
+ ConstraintWithTarget c0 = element(Constraint.PACKAGE, factory.objectType);
+ assertEquals(c1,
+ meet(c0, c1));
+ assertEquals(c2,
+ meet(c0, c2));
+
+ c0 = element(Constraint.SUBCLASS, factory.objectType);
+ assertEquals(c1,
+ meet(c0, c1));
+ assertEquals(c2,
+ meet(c0, c2));
+
+ c1 = element(Constraint.PACKAGE, s);
+ c2 = element(Constraint.PACKAGE, b);
+ assertEquals(c1,
+ meet(c0, c1));
+ assertEquals(c2,
+ meet(c0, c2));
+ assertEquals(c1,
+ meet(c1, c2));
+ assertEquals(c2,
+ meet(c2, c1));
+
+ DexType t = factory.createType("Ljava/lang/reflect/Type;");
+ DexType c = factory.createType("Ljava/lang/Class;");
+ c1 = element(Constraint.SUBCLASS, t);
+ c2 = element(Constraint.SUBCLASS, c);
+ assertEquals(c2,
+ meet(c1, c2));
+ assertEquals(c2,
+ meet(c2, c1));
+ }
+
+
+ @Test
+ public void b111080693() {
+ ConstraintWithTarget c1 =
+ element(Constraint.SUBCLASS, factory.createType("Ljava/lang/Class;"));
+ ConstraintWithTarget c2 =
+ element(Constraint.PACKAGE, factory.createType("Ljava/lang/reflect/Type;"));
+ assertEquals(never(),
+ meet(c1, c2));
+ }
+
+}
diff --git a/src/test/java/com/android/tools/r8/regress/b111080693/B111080693.java b/src/test/java/com/android/tools/r8/regress/b111080693/B111080693.java
index d424c39..f079016 100644
--- a/src/test/java/com/android/tools/r8/regress/b111080693/B111080693.java
+++ b/src/test/java/com/android/tools/r8/regress/b111080693/B111080693.java
@@ -20,13 +20,11 @@
import com.android.tools.r8.regress.b111080693.b.RecyclerView;
import com.android.tools.r8.utils.AndroidApp;
import com.google.common.collect.ImmutableList;
-import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
@RunWith(VmTestRunner.class)
public class B111080693 extends TestBase {
- @Ignore("b/111080693")
@Test
public void test() throws Exception {
R8Command.Builder builder = R8Command.builder();