Optimizing: Improve generated code for HLoadClass...
... for resolved package-private class accessed from
unresolved compiling class in the same package.
Test: Additional tests in 727-checker-unresolved-class.
Test: m test-art-host-gtest
Test: testrunner.py --host --optimizing
Bug: 161898207
Change-Id: I215dcd9db2297f5c8d9547635d80975d88534579
diff --git a/compiler/optimizing/instruction_builder.cc b/compiler/optimizing/instruction_builder.cc
index 1aef100..2da19ba 100644
--- a/compiler/optimizing/instruction_builder.cc
+++ b/compiler/optimizing/instruction_builder.cc
@@ -2419,9 +2419,11 @@
return true;
} else if (klass->IsPublic()) {
return false;
+ } else if (dex_compilation_unit_->GetCompilingClass() != nullptr) {
+ return !dex_compilation_unit_->GetCompilingClass()->CanAccess(klass);
} else {
- ObjPtr<mirror::Class> compiling_class = dex_compilation_unit_->GetCompilingClass().Get();
- return compiling_class == nullptr || !compiling_class->CanAccess(klass);
+ SamePackageCompare same_package(*dex_compilation_unit_);
+ return !same_package(klass);
}
}
diff --git a/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java b/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java
index 8469cf7..423fdd3 100644
--- a/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java
+++ b/test/727-checker-unresolved-class/src-ex/resolved/SubclassOfUnresolvedClass2.java
@@ -23,6 +23,9 @@
// loader is illegal even though the package name is the same.
public class SubclassOfUnresolvedClass2 extends UnresolvedClass {
public static void $noinline$main() {
+ $noinline$testResolvedPublicClass();
+ $noinline$testResolvedPackagePrivateClass();
+
$noinline$testPublicFieldInResolvedPackagePrivateClass();
$noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass();
$noinline$testPrivateFieldInResolvedPackagePrivateClass();
@@ -40,6 +43,21 @@
System.out.println("SubclassOfUnresolvedClass2 passed");
}
+ /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testResolvedPublicClass() builder (after)
+ /// CHECK: LoadClass class_name:resolved.ResolvedPublicSubclassOfPackagePrivateClass needs_access_check:false
+ static void $noinline$testResolvedPublicClass() {
+ Class<?> c = ResolvedPublicSubclassOfPackagePrivateClass.class;
+ }
+
+ /// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testResolvedPackagePrivateClass() builder (after)
+ /// CHECK: LoadClass class_name:resolved.ResolvedPackagePrivateClass needs_access_check:true
+ static void $noinline$testResolvedPackagePrivateClass() {
+ try {
+ Class<?> c = ResolvedPackagePrivateClass.class;
+ throw new Error("Unreachable");
+ } catch (IllegalAccessError expected) {}
+ }
+
/// CHECK-START: void resolved.SubclassOfUnresolvedClass2.$noinline$testPublicFieldInResolvedPackagePrivateClass() builder (after)
/// CHECK: UnresolvedStaticFieldSet
diff --git a/test/727-checker-unresolved-class/src/resolved/SubclassOfUnresolvedClass.java b/test/727-checker-unresolved-class/src/resolved/SubclassOfUnresolvedClass.java
index d767411..56a4f6a 100644
--- a/test/727-checker-unresolved-class/src/resolved/SubclassOfUnresolvedClass.java
+++ b/test/727-checker-unresolved-class/src/resolved/SubclassOfUnresolvedClass.java
@@ -20,6 +20,9 @@
public class SubclassOfUnresolvedClass extends UnresolvedClass {
public static void $noinline$main() {
+ $noinline$testResolvedPublicClass();
+ $noinline$testResolvedPackagePrivateClass();
+
$noinline$testPublicFieldInResolvedPackagePrivateClass();
$noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass();
$noinline$testPrivateFieldInResolvedPackagePrivateClass();
@@ -37,6 +40,18 @@
System.out.println("SubclassOfUnresolvedClass passed");
}
+ /// CHECK-START: void resolved.SubclassOfUnresolvedClass.$noinline$testResolvedPublicClass() builder (after)
+ /// CHECK: LoadClass class_name:resolved.ResolvedPublicSubclassOfPackagePrivateClass needs_access_check:false
+ static void $noinline$testResolvedPublicClass() {
+ Class<?> c = ResolvedPublicSubclassOfPackagePrivateClass.class;
+ }
+
+ /// CHECK-START: void resolved.SubclassOfUnresolvedClass.$noinline$testResolvedPackagePrivateClass() builder (after)
+ /// CHECK: LoadClass class_name:resolved.ResolvedPackagePrivateClass needs_access_check:false
+ static void $noinline$testResolvedPackagePrivateClass() {
+ Class<?> c = ResolvedPackagePrivateClass.class;
+ }
+
/// CHECK-START: void resolved.SubclassOfUnresolvedClass.$noinline$testPublicFieldInResolvedPackagePrivateClass() builder (after)
/// CHECK: StaticFieldSet
diff --git a/test/727-checker-unresolved-class/src/unresolved/UnresolvedClass.java b/test/727-checker-unresolved-class/src/unresolved/UnresolvedClass.java
index eaa9493..336c555 100644
--- a/test/727-checker-unresolved-class/src/unresolved/UnresolvedClass.java
+++ b/test/727-checker-unresolved-class/src/unresolved/UnresolvedClass.java
@@ -21,6 +21,9 @@
public class UnresolvedClass {
public static void $noinline$main() {
+ $noinline$testResolvedPublicClass();
+ $noinline$testResolvedPackagePrivateClass();
+
$noinline$testPublicFieldInResolvedPackagePrivateClass();
$noinline$testPublicFieldInPackagePrivateClassViaResolvedPublicSubclass();
$noinline$testPrivateFieldInResolvedPackagePrivateClass();
@@ -38,6 +41,21 @@
System.out.println("UnresolvedClass passed");
}
+ /// CHECK-START: void unresolved.UnresolvedClass.$noinline$testResolvedPublicClass() builder (after)
+ /// CHECK: LoadClass class_name:resolved.ResolvedPublicSubclassOfPackagePrivateClass needs_access_check:false
+ static void $noinline$testResolvedPublicClass() {
+ Class<?> c = ResolvedPublicSubclassOfPackagePrivateClass.class;
+ }
+
+ /// CHECK-START: void unresolved.UnresolvedClass.$noinline$testResolvedPackagePrivateClass() builder (after)
+ /// CHECK: LoadClass class_name:resolved.ResolvedPackagePrivateClass needs_access_check:true
+ static void $noinline$testResolvedPackagePrivateClass() {
+ try {
+ Class<?> c = ResolvedPackagePrivateClass.class;
+ throw new Error("Unreachable");
+ } catch (IllegalAccessError expected) {}
+ }
+
/// CHECK-START: void unresolved.UnresolvedClass.$noinline$testPublicFieldInResolvedPackagePrivateClass() builder (after)
/// CHECK: UnresolvedStaticFieldSet