Change inlining context to program method
Change-Id: I56fa2df5b033db330cf80fd771823e5998442e91
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java b/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java
index 1328f67..c05c20d 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfArithmeticBinop.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -193,7 +192,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forBinop();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java b/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java
index 232f7c1..70b41e1 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfArrayLength.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -68,7 +67,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forArrayLength();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java b/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java
index 411ea64..ae086f3 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfArrayLoad.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -114,7 +113,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forArrayGet();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java b/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java
index 585b4bc..eb43f6b 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfArrayStore.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -104,7 +103,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forArrayPut();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java b/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
index 4dfa1c5..4661e68 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfCheckCast.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -86,7 +85,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forCheckCast(type, context);
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfCmp.java b/src/main/java/com/android/tools/r8/cf/code/CfCmp.java
index cc83558..23b0c8b 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfCmp.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfCmp.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -118,7 +117,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forBinop();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java b/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
index 43a3a4f..51f34fc 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstClass.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -109,7 +108,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forConstClass(type, context);
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java
index 9a22ae7..259a711 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodHandle.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethodHandle;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -87,7 +86,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forConstMethodHandle();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java
index 632a24c..70417f6 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstMethodType.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexProto;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
@@ -85,7 +84,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forConstMethodType();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java b/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java
index f6a720d..1835f18 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstNull.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -60,7 +59,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forConstInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java b/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
index 6f7fcf4..e48643e 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstNumber.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -161,7 +160,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forConstInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
index 1c9305b..ee042dc 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfConstString.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
@@ -90,7 +89,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forConstInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java b/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java
index eed2ef1..e9f11a8 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfDexItemBasedConstString.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexReference;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
@@ -107,7 +106,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forDexItemBasedConstString(item, context);
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java
index 30bb5cc..7c28eff 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfFieldInstruction.java
@@ -10,7 +10,6 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -154,7 +153,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
switch (opcode) {
case Opcodes.GETSTATIC:
return inliningConstraints.forStaticGet(field, context);
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfFrame.java b/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
index dfa633c..cdcb3ec 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfFrame.java
@@ -11,7 +11,6 @@
import com.android.tools.r8.graph.CfCodeStackMapValidatingException;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -440,7 +439,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return ConstraintWithTarget.ALWAYS;
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfGoto.java b/src/main/java/com/android/tools/r8/cf/code/CfGoto.java
index f3babee..0867a89 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfGoto.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfGoto.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -85,7 +84,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forJumpInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfIf.java b/src/main/java/com/android/tools/r8/cf/code/CfIf.java
index 433d5d9..ddca593 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfIf.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfIf.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -121,7 +120,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forJumpInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java b/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java
index bf76936..efedff8 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfIfCmp.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -122,7 +121,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forJumpInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfIinc.java b/src/main/java/com/android/tools/r8/cf/code/CfIinc.java
index 2d0e0f0..9e59ba6 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfIinc.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfIinc.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -80,7 +79,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return ConstraintWithTarget.ALWAYS;
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java b/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java
index cb0d50f..e9c06e0 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInitClass.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -95,7 +94,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forInitClass(clazz, context);
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java b/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java
index 46d56b4..1300458 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInstanceOf.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -94,7 +93,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forInstanceOf(type, context);
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
index 0616bed..b8874e8 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInstruction.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.ClasspathMethod;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -226,7 +225,7 @@
}
public abstract ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context);
+ InliningConstraints inliningConstraints, ProgramMethod context);
public abstract void evaluate(
CfFrameVerificationHelper frameBuilder,
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
index 3ad8ed2..8631e64 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInvoke.java
@@ -249,7 +249,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
GraphLens graphLens = inliningConstraints.getGraphLens();
AppView<?> appView = inliningConstraints.getAppView();
DexMethod target = method;
@@ -267,7 +267,7 @@
if (appView.dexItemFactory().isConstructor(target)) {
type = Type.DIRECT;
assert noNeedToUseGraphLens(target, type, graphLens);
- } else if (target.holder == context.type) {
+ } else if (target.holder == context.getHolderType()) {
// The method could have been publicized.
type = graphLens.lookupMethod(target, null, Type.DIRECT).getType();
assert type == Type.DIRECT || type == Type.VIRTUAL;
@@ -298,7 +298,7 @@
type = Type.VIRTUAL;
// Instructions that target a private method in the same class translates to
// invoke-direct.
- if (target.holder == context.type) {
+ if (target.holder == context.getHolderType()) {
DexClass clazz = appView.definitionFor(target.holder);
if (clazz != null && clazz.lookupDirectMethod(target) != null) {
type = Type.DIRECT;
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java b/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java
index 2651e10..add492c 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfInvokeDynamic.java
@@ -11,7 +11,6 @@
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
import com.android.tools.r8.graph.DexMethodHandle;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexString;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.DexValue;
@@ -141,7 +140,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forInvokeCustom();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java b/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java
index eee91ae..ed6c16f 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfJsrRet.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.CfCodeStackMapValidatingException;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -71,7 +70,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
throw error();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLabel.java b/src/main/java/com/android/tools/r8/cf/code/CfLabel.java
index 5701493..2bfdd93 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfLabel.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfLabel.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -83,7 +82,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return ConstraintWithTarget.ALWAYS;
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLoad.java b/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
index 679e75d..3160d6e 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfLoad.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -112,7 +111,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forLoad();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java b/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java
index b3b8a3c..d7f2c7d 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfLogicalBinop.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -165,7 +164,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forBinop();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java b/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java
index c947e17..8225673 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfMonitor.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -82,7 +81,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forMonitor();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java b/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java
index 2209a80..5f405d3 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfMultiANewArray.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -95,7 +94,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forInvokeMultiNewArray(type, context);
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNeg.java b/src/main/java/com/android/tools/r8/cf/code/CfNeg.java
index 6da10c4..a7b8c32 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNeg.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNeg.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -107,7 +106,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forUnop();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNew.java b/src/main/java/com/android/tools/r8/cf/code/CfNew.java
index 3913b83..60da1b2 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNew.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNew.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -83,7 +82,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forNewInstance(type, context);
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java b/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java
index 593abb4..30671bd 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNewArray.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexClassAndMethod;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -133,7 +132,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forNewArrayEmpty(type, context);
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNop.java b/src/main/java/com/android/tools/r8/cf/code/CfNop.java
index f30e52e..87123a4 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNop.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNop.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -64,7 +63,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return ConstraintWithTarget.ALWAYS;
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java b/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java
index abe5ad1..a7e60e4 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfNumberConversion.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -178,7 +177,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forUnop();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfPosition.java b/src/main/java/com/android/tools/r8/cf/code/CfPosition.java
index 2d8c11d..233a3ef 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfPosition.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfPosition.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -94,7 +93,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return ConstraintWithTarget.ALWAYS;
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfReturn.java b/src/main/java/com/android/tools/r8/cf/code/CfReturn.java
index 9d8df3b..8305860 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfReturn.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfReturn.java
@@ -8,7 +8,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -100,7 +99,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forReturn();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java b/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java
index de43a8d..687d903 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfReturnVoid.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -74,7 +73,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forReturn();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java b/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java
index 109df7f..c28cb32 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfStackInstruction.java
@@ -10,7 +10,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -341,7 +340,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return ConstraintWithTarget.ALWAYS;
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfStore.java b/src/main/java/com/android/tools/r8/cf/code/CfStore.java
index 51bc1b7..debb573 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfStore.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfStore.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -112,7 +111,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forStore();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java b/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java
index 9e883cf..ddfd927 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfSwitch.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -137,7 +136,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forJumpInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/cf/code/CfThrow.java b/src/main/java/com/android/tools/r8/cf/code/CfThrow.java
index b00ef94..b165711 100644
--- a/src/main/java/com/android/tools/r8/cf/code/CfThrow.java
+++ b/src/main/java/com/android/tools/r8/cf/code/CfThrow.java
@@ -7,7 +7,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.CfCompareHelper;
import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.GraphLens;
import com.android.tools.r8.graph.InitClassLens;
@@ -81,7 +80,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
- InliningConstraints inliningConstraints, DexProgramClass context) {
+ InliningConstraints inliningConstraints, ProgramMethod context) {
return inliningConstraints.forJumpInstruction();
}
diff --git a/src/main/java/com/android/tools/r8/graph/CfCode.java b/src/main/java/com/android/tools/r8/graph/CfCode.java
index a08d65e..c40550d 100644
--- a/src/main/java/com/android/tools/r8/graph/CfCode.java
+++ b/src/main/java/com/android/tools/r8/graph/CfCode.java
@@ -618,7 +618,7 @@
ProgramMethod method,
AppView<AppInfoWithLiveness> appView,
GraphLens graphLens,
- DexProgramClass context) {
+ ProgramMethod context) {
InliningConstraints inliningConstraints = new InliningConstraints(appView, graphLens);
if (appView.options().isInterfaceMethodDesugaringEnabled()) {
// TODO(b/120130831): Conservatively need to say "no" at this point if there are invocations
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index 1a8d506..66ee3cc 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -20,6 +20,7 @@
import com.android.tools.r8.shaking.AppInfoWithLiveness;
import com.android.tools.r8.utils.TraversalContinuation;
import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Iterables;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -157,6 +158,18 @@
predicate, method -> consumer.accept(new ProgramMethod(this, method)));
}
+ public Iterable<ProgramMethod> directProgramMethods() {
+ return Iterables.transform(directMethods(), method -> new ProgramMethod(this, method));
+ }
+
+ public Iterable<ProgramMethod> directProgramMethods(Predicate<DexEncodedMethod> predicate) {
+ return Iterables.transform(directMethods(predicate), method -> new ProgramMethod(this, method));
+ }
+
+ public Iterable<ProgramMethod> programInstanceInitializers() {
+ return directProgramMethods(DexEncodedMethod::isInstanceInitializer);
+ }
+
public void forEachProgramDirectMethod(Consumer<ProgramMethod> consumer) {
forEachProgramDirectMethodMatching(alwaysTrue(), consumer);
}
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
index 763827a..ef8db33 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/HorizontalClassMerger.java
@@ -7,6 +7,7 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DexProgramClass;
import com.android.tools.r8.graph.DirectMappedDexApplication;
+import com.android.tools.r8.horizontalclassmerging.policies.DontInlinePolicy;
import com.android.tools.r8.horizontalclassmerging.policies.DontMergeIntoLessVisible;
import com.android.tools.r8.horizontalclassmerging.policies.DontMergeSynchronizedClasses;
import com.android.tools.r8.horizontalclassmerging.policies.NoAbstractClasses;
@@ -69,6 +70,7 @@
new NotVerticallyMergedIntoSubtype(appView),
new NoRuntimeTypeChecks(runtimeTypeCheckInfo),
new NotEntryPoint(appView.dexItemFactory()),
+ new DontInlinePolicy(appView, mainDexTracingResult),
new PreventMergeIntoMainDex(appView, mainDexTracingResult),
new SameParentClass(),
new SameNestHost(),
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontInlinePolicy.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontInlinePolicy.java
new file mode 100644
index 0000000..912f4d3
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/DontInlinePolicy.java
@@ -0,0 +1,63 @@
+// Copyright (c) 2020, 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.horizontalclassmerging.policies;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.CfCode;
+import com.android.tools.r8.graph.Code;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.horizontalclassmerging.SingleClassPolicy;
+import com.android.tools.r8.ir.optimize.Inliner.ConstraintWithTarget;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
+import com.android.tools.r8.shaking.MainDexDirectReferenceTracer;
+import com.android.tools.r8.shaking.MainDexTracingResult;
+import com.google.common.collect.Iterables;
+
+public class DontInlinePolicy extends SingleClassPolicy {
+ private final AppView<AppInfoWithLiveness> appView;
+ private final MainDexTracingResult mainDexTracingResult;
+
+ public DontInlinePolicy(
+ AppView<AppInfoWithLiveness> appView, MainDexTracingResult mainDexTracingResult) {
+ this.appView = appView;
+ this.mainDexTracingResult = mainDexTracingResult;
+ }
+
+ private boolean disallowInlining(ProgramMethod method) {
+ Code code = method.getDefinition().getCode();
+
+ // For non-jar/cf code we currently cannot guarantee that markForceInline() will succeed.
+ if (code == null || !code.isCfCode()) {
+ return true;
+ }
+
+ CfCode cfCode = code.asCfCode();
+
+ ConstraintWithTarget constraint =
+ cfCode.computeInliningConstraint(method, appView, GraphLens.getIdentityLens(), method);
+ if (constraint == ConstraintWithTarget.NEVER) {
+ return true;
+ }
+
+ // Constructors can have references beyond the root main dex classes. This can increase the
+ // size of the main dex dependent classes and we should bail out.
+ if (mainDexTracingResult.getRoots().contains(method.getHolderType())
+ && MainDexDirectReferenceTracer.hasReferencesOutsideFromCode(
+ appView.appInfo(), method, mainDexTracingResult.getRoots())) {
+ return true;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean canMerge(DexProgramClass program) {
+ return !Iterables.any(
+ program.directProgramMethods(),
+ method -> method.getDefinition().isInstanceInitializer() && disallowInlining(method));
+ }
+}
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 6722cfb..17b49b5 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
@@ -157,7 +157,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forCheckCast(type, context.getHolder());
+ return inliningConstraints.forCheckCast(type, context);
}
@Override
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 86101ba..7f80abf 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
@@ -158,7 +158,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forConstClass(clazz, context.getHolder());
+ return inliningConstraints.forConstClass(clazz, context);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
index 0753447..2c7313e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
+++ b/src/main/java/com/android/tools/r8/ir/code/DexItemBasedConstString.java
@@ -160,7 +160,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forDexItemBasedConstString(item, context.getHolder());
+ return inliningConstraints.forDexItemBasedConstString(item, context);
}
@Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/InitClass.java b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
index 22e4c4e..61a1882 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InitClass.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InitClass.java
@@ -158,7 +158,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInitClass(clazz, context.getHolder());
+ return inliningConstraints.forInitClass(clazz, context);
}
@Override
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 7dad747..090812b 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
@@ -144,7 +144,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInstanceGet(getField(), context.getHolder());
+ return inliningConstraints.forInstanceGet(getField(), context);
}
@Override
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 23808f4..0530403 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
@@ -88,7 +88,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInstanceOf(type, context.getHolder());
+ return inliningConstraints.forInstanceOf(type, context);
}
@Override
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 296b2f9..c38c5c0 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
@@ -184,7 +184,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInstancePut(getField(), context.getHolder());
+ return inliningConstraints.forInstancePut(getField(), context);
}
@Override
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 7d488a0..2a81647 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
@@ -146,7 +146,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInvokeDirect(getInvokedMethod(), context.getHolder());
+ return inliningConstraints.forInvokeDirect(getInvokedMethod(), context);
}
@Override
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 e95be77..83acc1d 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
@@ -119,7 +119,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInvokeInterface(getInvokedMethod(), context.getHolder());
+ return inliningConstraints.forInvokeInterface(getInvokedMethod(), context);
}
@Override
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 063592f..7163fdd 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
@@ -78,7 +78,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInvokeMultiNewArray(type, context.getHolder());
+ return inliningConstraints.forInvokeMultiNewArray(type, context);
}
@Override
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 25a4b47..cad5e1d 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
@@ -107,7 +107,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInvokeNewArray(type, context.getHolder());
+ return inliningConstraints.forInvokeNewArray(type, context);
}
@Override
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 824a283..dbcafdc 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
@@ -140,7 +140,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInvokePolymorphic(getInvokedMethod(), context.getHolder());
+ return inliningConstraints.forInvokePolymorphic(getInvokedMethod(), context);
}
@Override
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 e89d9b0..696d674 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
@@ -130,7 +130,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInvokeStatic(getInvokedMethod(), context.getHolder());
+ return inliningConstraints.forInvokeStatic(getInvokedMethod(), context);
}
@Override
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 4815431..34fa59c 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
@@ -120,7 +120,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInvokeSuper(getInvokedMethod(), context.getHolder());
+ return inliningConstraints.forInvokeSuper(getInvokedMethod(), context);
}
@Override
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 951a451..e7fb163 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
@@ -142,7 +142,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forInvokeVirtual(getInvokedMethod(), context.getHolder());
+ return inliningConstraints.forInvokeVirtual(getInvokedMethod(), context);
}
@Override
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 eb12b5a..37fbdf0 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
@@ -113,7 +113,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forNewArrayEmpty(type, context.getHolder());
+ return inliningConstraints.forNewArrayEmpty(type, context);
}
@Override
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 0c6f609..704de30 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
@@ -103,7 +103,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forNewInstance(clazz, context.getHolder());
+ return inliningConstraints.forNewInstance(clazz, context);
}
@Override
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 2a5ffbd..8a3f867 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
@@ -170,7 +170,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forStaticGet(getField(), context.getHolder());
+ return inliningConstraints.forStaticGet(getField(), context);
}
@Override
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 e268cbe..9df14cc 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
@@ -180,7 +180,7 @@
@Override
public ConstraintWithTarget inliningConstraint(
InliningConstraints inliningConstraints, ProgramMethod context) {
- return inliningConstraints.forStaticPut(getField(), context.getHolder());
+ return inliningConstraints.forStaticPut(getField(), context);
}
@Override
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 273f7b7..9f790ec 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
@@ -365,36 +365,36 @@
}
public static ConstraintWithTarget deriveConstraint(
- DexProgramClass context, DexType targetHolder, AccessFlags<?> flags, AppView<?> appView) {
+ ProgramMethod context, DexType targetHolder, AccessFlags<?> flags, AppView<?> appView) {
if (flags.isPublic()) {
return ALWAYS;
} else if (flags.isPrivate()) {
- if (context.isInANest()) {
- return NestUtils.sameNest(context.getType(), targetHolder, appView)
+ if (context.getHolder().isInANest()) {
+ return NestUtils.sameNest(context.getHolderType(), targetHolder, appView)
? new ConstraintWithTarget(Constraint.SAMENEST, targetHolder)
: NEVER;
}
- return targetHolder == context.type
+ return targetHolder == context.getHolderType()
? new ConstraintWithTarget(Constraint.SAMECLASS, targetHolder)
: NEVER;
} else if (flags.isProtected()) {
- if (targetHolder.isSamePackage(context.type)) {
+ if (targetHolder.isSamePackage(context.getHolderType())) {
// Even though protected, this is visible via the same package from the context.
return new ConstraintWithTarget(Constraint.PACKAGE, targetHolder);
- } else if (appView.isSubtype(context.type, targetHolder).isTrue()) {
+ } else if (appView.isSubtype(context.getHolderType(), targetHolder).isTrue()) {
return new ConstraintWithTarget(Constraint.SUBCLASS, targetHolder);
}
return NEVER;
} else {
/* package-private */
- return targetHolder.isSamePackage(context.type)
+ return targetHolder.isSamePackage(context.getHolderType())
? new ConstraintWithTarget(Constraint.PACKAGE, targetHolder)
: NEVER;
}
}
public static ConstraintWithTarget classIsVisible(
- DexProgramClass context, DexType clazz, AppView<?> appView) {
+ ProgramMethod context, DexType clazz, AppView<?> appView) {
if (clazz.isArrayType()) {
return classIsVisible(context, clazz.toArrayElementType(appView.dexItemFactory()), appView);
}
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 0968624..ff7668a 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
@@ -17,6 +17,7 @@
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.graph.FieldResolutionResult;
import com.android.tools.r8.graph.GraphLens;
+import com.android.tools.r8.graph.ProgramMethod;
import com.android.tools.r8.graph.ResolutionResult;
import com.android.tools.r8.ir.code.Invoke.Type;
import com.android.tools.r8.ir.optimize.Inliner.Constraint;
@@ -44,8 +45,6 @@
private GraphLens graphLens;
public InliningConstraints(AppView<AppInfoWithLiveness> appView, GraphLens graphLens) {
- assert graphLens.isContextFreeForMethods();
- assert appView.graphLens() != graphLens || graphLens.isIdentityLens();
this.appView = appView;
this.graphLens = graphLens; // Note: Intentionally *not* appView.graphLens().
}
@@ -90,16 +89,15 @@
return ConstraintWithTarget.ALWAYS;
}
- public ConstraintWithTarget forDexItemBasedConstString(
- DexReference type, DexProgramClass context) {
+ public ConstraintWithTarget forDexItemBasedConstString(DexReference type, ProgramMethod context) {
return ConstraintWithTarget.ALWAYS;
}
- public ConstraintWithTarget forCheckCast(DexType type, DexProgramClass context) {
+ public ConstraintWithTarget forCheckCast(DexType type, ProgramMethod context) {
return ConstraintWithTarget.classIsVisible(context, type, appView);
}
- public ConstraintWithTarget forConstClass(DexType type, DexProgramClass context) {
+ public ConstraintWithTarget forConstClass(DexType type, ProgramMethod context) {
return ConstraintWithTarget.classIsVisible(context, type, appView);
}
@@ -127,23 +125,23 @@
return ConstraintWithTarget.ALWAYS;
}
- public ConstraintWithTarget forInitClass(DexType clazz, DexProgramClass context) {
+ public ConstraintWithTarget forInitClass(DexType clazz, ProgramMethod context) {
return ConstraintWithTarget.classIsVisible(context, clazz, appView);
}
- public ConstraintWithTarget forInstanceGet(DexField field, DexProgramClass context) {
+ public ConstraintWithTarget forInstanceGet(DexField field, ProgramMethod context) {
return forFieldInstruction(field, context);
}
- public ConstraintWithTarget forInstanceOf(DexType type, DexProgramClass context) {
+ public ConstraintWithTarget forInstanceOf(DexType type, ProgramMethod context) {
return ConstraintWithTarget.classIsVisible(context, type, appView);
}
- public ConstraintWithTarget forInstancePut(DexField field, DexProgramClass context) {
+ public ConstraintWithTarget forInstancePut(DexField field, ProgramMethod context) {
return forFieldInstruction(field, context);
}
- public ConstraintWithTarget forInvoke(DexMethod method, Type type, DexProgramClass context) {
+ public ConstraintWithTarget forInvoke(DexMethod method, Type type, ProgramMethod context) {
switch (type) {
case DIRECT:
return forInvokeDirect(method, context);
@@ -169,8 +167,9 @@
return ConstraintWithTarget.NEVER;
}
- public ConstraintWithTarget forInvokeDirect(DexMethod method, DexProgramClass context) {
- DexMethod lookup = graphLens.lookupMethod(method);
+ public ConstraintWithTarget forInvokeDirect(DexMethod method, ProgramMethod context) {
+ DexMethod lookup =
+ graphLens.lookupMethod(method, context.getReference(), Type.DIRECT).getReference();
if (lookup.holder.isArrayType()) {
return ConstraintWithTarget.ALWAYS;
}
@@ -181,25 +180,27 @@
return forResolvedMember(resolutionResult.getInitialResolutionHolder(), context, target);
}
- public ConstraintWithTarget forInvokeInterface(DexMethod method, DexProgramClass context) {
- DexMethod lookup = graphLens.lookupMethod(method);
+ public ConstraintWithTarget forInvokeInterface(DexMethod method, ProgramMethod context) {
+ DexMethod lookup =
+ graphLens.lookupMethod(method, context.getReference(), Type.INTERFACE).getReference();
return forVirtualInvoke(lookup, context, true);
}
- public ConstraintWithTarget forInvokeMultiNewArray(DexType type, DexProgramClass context) {
+ public ConstraintWithTarget forInvokeMultiNewArray(DexType type, ProgramMethod context) {
return ConstraintWithTarget.classIsVisible(context, type, appView);
}
- public ConstraintWithTarget forInvokeNewArray(DexType type, DexProgramClass context) {
+ public ConstraintWithTarget forInvokeNewArray(DexType type, ProgramMethod context) {
return ConstraintWithTarget.classIsVisible(context, type, appView);
}
- public ConstraintWithTarget forInvokePolymorphic(DexMethod method, DexProgramClass context) {
+ public ConstraintWithTarget forInvokePolymorphic(DexMethod method, ProgramMethod context) {
return ConstraintWithTarget.NEVER;
}
- public ConstraintWithTarget forInvokeStatic(DexMethod method, DexProgramClass context) {
- DexMethod lookup = graphLens.lookupMethod(method);
+ public ConstraintWithTarget forInvokeStatic(DexMethod method, ProgramMethod context) {
+ DexMethod lookup =
+ graphLens.lookupMethod(method, context.getReference(), Type.STATIC).getReference();
if (lookup.holder.isArrayType()) {
return ConstraintWithTarget.ALWAYS;
}
@@ -220,19 +221,21 @@
@SuppressWarnings("ConstantConditions")
private DexEncodedMethod singleTargetWhileVerticalClassMerging(
ResolutionResult resolutionResult,
- DexProgramClass context,
+ ProgramMethod context,
TriFunction<ResolutionResult, DexProgramClass, AppInfoWithClassHierarchy, DexEncodedMethod>
lookup) {
if (!resolutionResult.isSingleResolution()) {
return null;
}
- DexEncodedMethod dexEncodedMethod = lookup.apply(resolutionResult, context, appView.appInfo());
+ DexEncodedMethod dexEncodedMethod =
+ lookup.apply(resolutionResult, context.getHolder(), appView.appInfo());
if (!isVerticalClassMerging() || dexEncodedMethod != null) {
return dexEncodedMethod;
}
assert isVerticalClassMerging();
- assert graphLens.lookupType(context.superType) == context.type;
- DexProgramClass superContext = appView.programDefinitionFor(context.superType, context);
+ assert graphLens.lookupType(context.getHolder().superType) == context.getHolderType();
+ DexProgramClass superContext =
+ appView.programDefinitionFor(context.getHolder().superType, context);
if (superContext == null) {
return null;
}
@@ -245,13 +248,14 @@
return null;
}
- public ConstraintWithTarget forInvokeSuper(DexMethod method, DexProgramClass context) {
+ public ConstraintWithTarget forInvokeSuper(DexMethod method, ProgramMethod context) {
// The semantics of invoke super depend on the context.
- return new ConstraintWithTarget(Constraint.SAMECLASS, context.type);
+ return new ConstraintWithTarget(Constraint.SAMECLASS, context.getHolderType());
}
- public ConstraintWithTarget forInvokeVirtual(DexMethod method, DexProgramClass context) {
- DexMethod lookup = graphLens.lookupMethod(method);
+ public ConstraintWithTarget forInvokeVirtual(DexMethod method, ProgramMethod context) {
+ DexMethod lookup =
+ graphLens.lookupMethod(method, context.getReference(), Type.VIRTUAL).getReference();
return forVirtualInvoke(lookup, context, false);
}
@@ -275,7 +279,7 @@
return ConstraintWithTarget.ALWAYS;
}
- public ConstraintWithTarget forNewArrayEmpty(DexType type, DexProgramClass context) {
+ public ConstraintWithTarget forNewArrayEmpty(DexType type, ProgramMethod context) {
return ConstraintWithTarget.classIsVisible(context, type, appView);
}
@@ -283,7 +287,7 @@
return ConstraintWithTarget.ALWAYS;
}
- public ConstraintWithTarget forNewInstance(DexType type, DexProgramClass context) {
+ public ConstraintWithTarget forNewInstance(DexType type, ProgramMethod context) {
return ConstraintWithTarget.classIsVisible(context, type, appView);
}
@@ -299,11 +303,11 @@
return ConstraintWithTarget.ALWAYS;
}
- public ConstraintWithTarget forStaticGet(DexField field, DexProgramClass context) {
+ public ConstraintWithTarget forStaticGet(DexField field, ProgramMethod context) {
return forFieldInstruction(field, context);
}
- public ConstraintWithTarget forStaticPut(DexField field, DexProgramClass context) {
+ public ConstraintWithTarget forStaticPut(DexField field, ProgramMethod context) {
return forFieldInstruction(field, context);
}
@@ -331,7 +335,7 @@
return ConstraintWithTarget.NEVER;
}
- private ConstraintWithTarget forFieldInstruction(DexField field, DexProgramClass context) {
+ private ConstraintWithTarget forFieldInstruction(DexField field, ProgramMethod context) {
DexField lookup = graphLens.lookupField(field);
FieldResolutionResult fieldResolutionResult = appView.appInfo().resolveField(lookup);
return forResolvedMember(
@@ -341,7 +345,7 @@
}
private ConstraintWithTarget forVirtualInvoke(
- DexMethod method, DexProgramClass context, boolean isInterface) {
+ DexMethod method, ProgramMethod context, boolean isInterface) {
if (method.holder.isArrayType()) {
return ConstraintWithTarget.ALWAYS;
}
@@ -359,7 +363,7 @@
private ConstraintWithTarget forResolvedMember(
DexClass initialResolutionHolder,
- DexProgramClass context,
+ ProgramMethod context,
DexEncodedMember<?, ?> resolvedMember) {
if (resolvedMember == null) {
// This will fail at runtime.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
index f9f4d58..4e89840 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
@@ -125,7 +125,7 @@
}
// Make sure the target (base) type is visible.
ConstraintWithTarget constraints =
- ConstraintWithTarget.classIsVisible(context.getHolder(), baseType, appView);
+ ConstraintWithTarget.classIsVisible(context, baseType, appView);
if (constraints == ConstraintWithTarget.NEVER) {
return null;
}
@@ -201,7 +201,7 @@
}
// Make sure the (base) type is visible.
ConstraintWithTarget constraints =
- ConstraintWithTarget.classIsVisible(context.getHolder(), baseType, appView);
+ ConstraintWithTarget.classIsVisible(context, baseType, appView);
if (constraints == ConstraintWithTarget.NEVER) {
return null;
}
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 5d3f09b..cf6f791 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -248,11 +248,9 @@
return false;
}
ConstraintWithTarget classVisibility =
- ConstraintWithTarget.deriveConstraint(
- context.getHolder(), holderType, holder.accessFlags, appView);
+ ConstraintWithTarget.deriveConstraint(context, holderType, holder.accessFlags, appView);
ConstraintWithTarget methodVisibility =
- ConstraintWithTarget.deriveConstraint(
- context.getHolder(), holderType, method.accessFlags, appView);
+ ConstraintWithTarget.deriveConstraint(context, holderType, method.accessFlags, appView);
// We may need bridge for visibility if the target class is not visible while the target method
// is visible from the calling context.
return classVisibility == ConstraintWithTarget.NEVER
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 9462690..5e65379 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -1683,12 +1683,18 @@
Code code = method.getDefinition().getCode();
if (code.isCfCode()) {
CfCode cfCode = code.asCfCode();
+
+ // If we can't find a context to perform the inlining check on, abort.
+ if (Iterables.isEmpty(context.programInstanceInitializers())) {
+ return AbortReason.UNSAFE_INLINING;
+ }
+
ConstraintWithTarget constraint =
cfCode.computeInliningConstraint(
method,
appView,
new SingleTypeMapperGraphLens(method.getHolderType(), context),
- context);
+ context.programInstanceInitializers().iterator().next());
if (constraint == ConstraintWithTarget.NEVER) {
return AbortReason.UNSAFE_INLINING;
}
diff --git a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
index 279004e..3a3355e 100644
--- a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
+++ b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
@@ -124,7 +124,6 @@
@Test
public void testRetrace() throws IOException {
- expectThrowsWithHorizontalClassMerging();
ProcessResult processResult =
ToolHelper.runProcess(
new ProcessBuilder()
@@ -210,7 +209,6 @@
@Test
public void testSignatures() throws Exception {
- expectThrowsWithHorizontalClassMerging();
testParseSignaturesInJar(r8R8Release.getFirst());
}
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorCantInlineTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorCantInlineTest.java
new file mode 100644
index 0000000..037262f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorCantInlineTest.java
@@ -0,0 +1,78 @@
+// Copyright (c) 2020, 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.classmerging.horizontal;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.IsNot.not;
+
+import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.NoHorizontalClassMerging;
+import com.android.tools.r8.TestParameters;
+import org.junit.Test;
+
+public class ConstructorCantInlineTest extends HorizontalClassMergingTestBase {
+ public ConstructorCantInlineTest(
+ TestParameters parameters, boolean enableHorizontalClassMerging) {
+ super(parameters, enableHorizontalClassMerging);
+ }
+
+ @Test
+ public void testR8() throws Exception {
+ testForR8(parameters.getBackend())
+ .addInnerClasses(getClass())
+ .addKeepMainRule(Main.class)
+ .addOptionsModification(
+ options -> options.enableHorizontalClassMerging = enableHorizontalClassMerging)
+ .enableInliningAnnotations()
+ .enableNeverClassInliningAnnotations()
+ .setMinApi(parameters.getApiLevel())
+ .run(parameters.getRuntime(), Main.class)
+ .assertSuccessWithOutputLines("c", "foo: foo")
+ .inspect(
+ codeInspector -> {
+ assertThat(codeInspector.clazz(A.class), not(isPresent()));
+ assertThat(codeInspector.clazz(B.class), isPresent());
+ assertThat(codeInspector.clazz(C.class), isPresent());
+ assertThat(codeInspector.clazz(D.class), isPresent());
+ });
+ }
+
+ public static class A {
+ public String foo() {
+ return "foo";
+ }
+ }
+
+ @NoHorizontalClassMerging
+ @NeverClassInline
+ public static class B extends A {}
+
+ @NeverClassInline
+ public static class C {
+ C() {
+ System.out.println("c");
+ }
+ }
+
+ public static class D {
+ D() {
+ foo(new B());
+ }
+
+ @NeverInline
+ static void foo(A a) {
+ System.out.println("foo: " + a.foo());
+ }
+ }
+
+ public static class Main {
+ public static void main(String[] args) {
+ new C();
+ new D();
+ }
+ }
+}
diff --git a/src/test/java/com/android/tools/r8/shaking/keptgraph/WhyAreYouKeepingAllTest.java b/src/test/java/com/android/tools/r8/shaking/keptgraph/WhyAreYouKeepingAllTest.java
index 367bfbc..94bdbf1 100644
--- a/src/test/java/com/android/tools/r8/shaking/keptgraph/WhyAreYouKeepingAllTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keptgraph/WhyAreYouKeepingAllTest.java
@@ -37,15 +37,12 @@
return getTestParameters().withNoneRuntime().build();
}
- private final TestParameters parameters;
-
public WhyAreYouKeepingAllTest(TestParameters parameters) {
- this.parameters = parameters;
+ parameters.assertNoneRuntime();
}
@Test
public void test() throws Throwable {
- expectThrowsWithHorizontalClassMerging();
testForR8(Backend.CF)
.addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
.addKeepRuleFiles(MAIN_KEEP)