1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2024 The Android Open Source Project 3*795d594fSAndroid Build Coastguard Worker * 4*795d594fSAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License"); 5*795d594fSAndroid Build Coastguard Worker * you may not use this file except in compliance with the License. 6*795d594fSAndroid Build Coastguard Worker * You may obtain a copy of the License at 7*795d594fSAndroid Build Coastguard Worker * 8*795d594fSAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0 9*795d594fSAndroid Build Coastguard Worker * 10*795d594fSAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software 11*795d594fSAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS, 12*795d594fSAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13*795d594fSAndroid Build Coastguard Worker * See the License for the specific language governing permissions and 14*795d594fSAndroid Build Coastguard Worker * limitations under the License. 15*795d594fSAndroid Build Coastguard Worker */ 16*795d594fSAndroid Build Coastguard Worker 17*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Constructor; 18*795d594fSAndroid Build Coastguard Worker import java.lang.reflect.Method; 19*795d594fSAndroid Build Coastguard Worker 20*795d594fSAndroid Build Coastguard Worker public class Main { 21*795d594fSAndroid Build Coastguard Worker public static String TEST_NAME = "732-checker-app-image"; 22*795d594fSAndroid Build Coastguard Worker getSecondaryClassLoader()23*795d594fSAndroid Build Coastguard Worker public static ClassLoader getSecondaryClassLoader() throws Exception { 24*795d594fSAndroid Build Coastguard Worker String location = System.getenv("DEX_LOCATION"); 25*795d594fSAndroid Build Coastguard Worker try { 26*795d594fSAndroid Build Coastguard Worker Class<?> class_loader_class = Class.forName("dalvik.system.PathClassLoader"); 27*795d594fSAndroid Build Coastguard Worker Constructor<?> ctor = 28*795d594fSAndroid Build Coastguard Worker class_loader_class.getConstructor(String.class, ClassLoader.class); 29*795d594fSAndroid Build Coastguard Worker return (ClassLoader) ctor.newInstance(location + "/" + TEST_NAME + "-ex.jar", 30*795d594fSAndroid Build Coastguard Worker Main.class.getClassLoader()); 31*795d594fSAndroid Build Coastguard Worker } catch (ClassNotFoundException e) { 32*795d594fSAndroid Build Coastguard Worker // Running on RI. Use URLClassLoader. 33*795d594fSAndroid Build Coastguard Worker return new java.net.URLClassLoader( 34*795d594fSAndroid Build Coastguard Worker new java.net.URL[] { new java.net.URL("file://" + location + "/classes-ex/") }); 35*795d594fSAndroid Build Coastguard Worker } 36*795d594fSAndroid Build Coastguard Worker } 37*795d594fSAndroid Build Coastguard Worker main(String args[])38*795d594fSAndroid Build Coastguard Worker public static void main(String args[]) throws Exception { 39*795d594fSAndroid Build Coastguard Worker System.out.println($noinline$getAppImageClass().getName()); 40*795d594fSAndroid Build Coastguard Worker System.out.println($noinline$getNonAppImageClass().getName()); 41*795d594fSAndroid Build Coastguard Worker 42*795d594fSAndroid Build Coastguard Worker $noinline$callAppImageClassNop(); 43*795d594fSAndroid Build Coastguard Worker $noinline$callAppImageClassWithClinitNop(); 44*795d594fSAndroid Build Coastguard Worker $noinline$callNonAppImageClassNop(); 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker ClassLoader secondaryLoader = getSecondaryClassLoader(); 47*795d594fSAndroid Build Coastguard Worker Class<?> secondaryClass = Class.forName("Secondary", true, secondaryLoader); 48*795d594fSAndroid Build Coastguard Worker Method secondaryMain = secondaryClass.getMethod("main"); 49*795d594fSAndroid Build Coastguard Worker secondaryMain.invoke(null); 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker 52*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.Class Main.$noinline$getAppImageClass() builder (after) 53*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadClass load_kind:AppImageRelRo in_image:true $noinline$getAppImageClass()54*795d594fSAndroid Build Coastguard Worker public static Class<?> $noinline$getAppImageClass() { 55*795d594fSAndroid Build Coastguard Worker return AppImageClass.class; 56*795d594fSAndroid Build Coastguard Worker } 57*795d594fSAndroid Build Coastguard Worker 58*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.Class Main.$noinline$getNonAppImageClass() builder (after) 59*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadClass load_kind:BssEntry in_image:false $noinline$getNonAppImageClass()60*795d594fSAndroid Build Coastguard Worker public static Class<?> $noinline$getNonAppImageClass() { 61*795d594fSAndroid Build Coastguard Worker return NonAppImageClass.class; 62*795d594fSAndroid Build Coastguard Worker } 63*795d594fSAndroid Build Coastguard Worker 64*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callAppImageClassNop() builder (after) 65*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect clinit_check:none 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callAppImageClassNop() builder (after) 68*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: LoadClass 69*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ClinitCheck 70*795d594fSAndroid Build Coastguard Worker 71*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callAppImageClassNop() inliner (after) 72*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: LoadClass 73*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ClinitCheck 74*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect $noinline$callAppImageClassNop()75*795d594fSAndroid Build Coastguard Worker public static void $noinline$callAppImageClassNop() { 76*795d594fSAndroid Build Coastguard Worker AppImageClass.$inline$nop(); 77*795d594fSAndroid Build Coastguard Worker } 78*795d594fSAndroid Build Coastguard Worker 79*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callAppImageClassWithClinitNop() builder (after) 80*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadClass load_kind:AppImageRelRo in_image:true gen_clinit_check:false 81*795d594fSAndroid Build Coastguard Worker /// CHECK: ClinitCheck 82*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect clinit_check:explicit 83*795d594fSAndroid Build Coastguard Worker 84*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callAppImageClassWithClinitNop() inliner (after) 85*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadClass load_kind:AppImageRelRo in_image:true gen_clinit_check:false 86*795d594fSAndroid Build Coastguard Worker /// CHECK: ClinitCheck 87*795d594fSAndroid Build Coastguard Worker 88*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callAppImageClassWithClinitNop() inliner (after) 89*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 90*795d594fSAndroid Build Coastguard Worker 91*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callAppImageClassWithClinitNop() prepare_for_register_allocation (after) 92*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadClass load_kind:AppImageRelRo in_image:true gen_clinit_check:false 93*795d594fSAndroid Build Coastguard Worker /// CHECK: ClinitCheck $noinline$callAppImageClassWithClinitNop()94*795d594fSAndroid Build Coastguard Worker public static void $noinline$callAppImageClassWithClinitNop() { 95*795d594fSAndroid Build Coastguard Worker AppImageClassWithClinit.$inline$nop(); 96*795d594fSAndroid Build Coastguard Worker } 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callNonAppImageClassNop() builder (after) 99*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadClass load_kind:BssEntry in_image:false gen_clinit_check:false 100*795d594fSAndroid Build Coastguard Worker /// CHECK: ClinitCheck 101*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect clinit_check:explicit 102*795d594fSAndroid Build Coastguard Worker 103*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callNonAppImageClassNop() inliner (after) 104*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadClass load_kind:BssEntry in_image:false gen_clinit_check:false 105*795d594fSAndroid Build Coastguard Worker /// CHECK: ClinitCheck 106*795d594fSAndroid Build Coastguard Worker 107*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callNonAppImageClassNop() inliner (after) 108*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect 109*795d594fSAndroid Build Coastguard Worker 110*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callNonAppImageClassNop() prepare_for_register_allocation (after) 111*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadClass load_kind:BssEntry in_image:false gen_clinit_check:true 112*795d594fSAndroid Build Coastguard Worker 113*795d594fSAndroid Build Coastguard Worker /// CHECK-START: void Main.$noinline$callNonAppImageClassNop() prepare_for_register_allocation (after) 114*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: ClinitCheck $noinline$callNonAppImageClassNop()115*795d594fSAndroid Build Coastguard Worker public static void $noinline$callNonAppImageClassNop() { 116*795d594fSAndroid Build Coastguard Worker NonAppImageClass.$inline$nop(); 117*795d594fSAndroid Build Coastguard Worker } 118*795d594fSAndroid Build Coastguard Worker } 119*795d594fSAndroid Build Coastguard Worker 120*795d594fSAndroid Build Coastguard Worker class AppImageClass { // Included in the profile. $inline$nop()121*795d594fSAndroid Build Coastguard Worker public static void $inline$nop() {} 122*795d594fSAndroid Build Coastguard Worker } 123*795d594fSAndroid Build Coastguard Worker 124*795d594fSAndroid Build Coastguard Worker class AppImageClassWithClinit { // Included in the profile. 125*795d594fSAndroid Build Coastguard Worker static boolean doThrow = false; 126*795d594fSAndroid Build Coastguard Worker static { 127*795d594fSAndroid Build Coastguard Worker if (doThrow) { Error()128*795d594fSAndroid Build Coastguard Worker throw new Error(); 129*795d594fSAndroid Build Coastguard Worker } 130*795d594fSAndroid Build Coastguard Worker } 131*795d594fSAndroid Build Coastguard Worker $inline$nop()132*795d594fSAndroid Build Coastguard Worker public static void $inline$nop() {} 133*795d594fSAndroid Build Coastguard Worker } 134*795d594fSAndroid Build Coastguard Worker 135*795d594fSAndroid Build Coastguard Worker class NonAppImageClass { // Not included in the profile. $inline$nop()136*795d594fSAndroid Build Coastguard Worker public static void $inline$nop() {} 137*795d594fSAndroid Build Coastguard Worker } 138