1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2017 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 public class Main { main(String[] args)18*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 19*795d594fSAndroid Build Coastguard Worker System.loadLibrary(args[0]); 20*795d594fSAndroid Build Coastguard Worker if (!hasJit()) { 21*795d594fSAndroid Build Coastguard Worker return; 22*795d594fSAndroid Build Coastguard Worker } 23*795d594fSAndroid Build Coastguard Worker // Force initialization. 24*795d594fSAndroid Build Coastguard Worker Foo.initialize(); 25*795d594fSAndroid Build Coastguard Worker } 26*795d594fSAndroid Build Coastguard Worker hasJitCompiledEntrypoint(Class<?> cls, String methodName)27*795d594fSAndroid Build Coastguard Worker public native static boolean hasJitCompiledEntrypoint(Class<?> cls, String methodName); hasJit()28*795d594fSAndroid Build Coastguard Worker private native static boolean hasJit(); 29*795d594fSAndroid Build Coastguard Worker } 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker class Foo { 32*795d594fSAndroid Build Coastguard Worker // This method needs to be virtual for the test. Otherwise if it's a static method, 33*795d594fSAndroid Build Coastguard Worker // the JIT compiler won't compile while its entrypoint is the resolution stub. $noinline$hotMethod()34*795d594fSAndroid Build Coastguard Worker void $noinline$hotMethod() { 35*795d594fSAndroid Build Coastguard Worker for (int i = 0; i < array.length; ++i) { 36*795d594fSAndroid Build Coastguard Worker array[i] = array; 37*795d594fSAndroid Build Coastguard Worker } 38*795d594fSAndroid Build Coastguard Worker } 39*795d594fSAndroid Build Coastguard Worker 40*795d594fSAndroid Build Coastguard Worker static { 41*795d594fSAndroid Build Coastguard Worker array = new Object[10000]; 42*795d594fSAndroid Build Coastguard Worker while (!Main.hasJitCompiledEntrypoint(Foo.class, "$noinline$hotMethod")) { 43*795d594fSAndroid Build Coastguard Worker new Foo().$noinline$hotMethod(); 44*795d594fSAndroid Build Coastguard Worker try { 45*795d594fSAndroid Build Coastguard Worker // Sleep to give a chance for the JIT to compile `hotMethod`. 46*795d594fSAndroid Build Coastguard Worker Thread.sleep(100); 47*795d594fSAndroid Build Coastguard Worker } catch (Exception e) { 48*795d594fSAndroid Build Coastguard Worker // Ignore 49*795d594fSAndroid Build Coastguard Worker } 50*795d594fSAndroid Build Coastguard Worker } 51*795d594fSAndroid Build Coastguard Worker } 52*795d594fSAndroid Build Coastguard Worker initialize()53*795d594fSAndroid Build Coastguard Worker static void initialize() { 54*795d594fSAndroid Build Coastguard Worker } 55*795d594fSAndroid Build Coastguard Worker 56*795d594fSAndroid Build Coastguard Worker static Object[] array; 57*795d594fSAndroid Build Coastguard Worker } 58