1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2011 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 // This test depends on the exact format of the DEX file. Since dx is deprecated, 18*795d594fSAndroid Build Coastguard Worker // the classes.dex file is packaged as a test input. It was created with: 19*795d594fSAndroid Build Coastguard Worker // 20*795d594fSAndroid Build Coastguard Worker // $ javac -g -Xlint:-options -source 1.7 -target 1.7 -d classes src/Main.java 21*795d594fSAndroid Build Coastguard Worker // $ dx --debug --dex --output=classes.dex classes 22*795d594fSAndroid Build Coastguard Worker 23*795d594fSAndroid Build Coastguard Worker public class Main { Main()24*795d594fSAndroid Build Coastguard Worker public Main() { 25*795d594fSAndroid Build Coastguard Worker } 26*795d594fSAndroid Build Coastguard Worker $noinline$f()27*795d594fSAndroid Build Coastguard Worker int $noinline$f() throws Exception { 28*795d594fSAndroid Build Coastguard Worker $noinline$g(1); 29*795d594fSAndroid Build Coastguard Worker $noinline$g(2); 30*795d594fSAndroid Build Coastguard Worker return 0; 31*795d594fSAndroid Build Coastguard Worker } 32*795d594fSAndroid Build Coastguard Worker $noinline$g(int num_calls)33*795d594fSAndroid Build Coastguard Worker void $noinline$g(int num_calls) { 34*795d594fSAndroid Build Coastguard Worker if (num_calls == 1) { 35*795d594fSAndroid Build Coastguard Worker System.out.println("1st call"); 36*795d594fSAndroid Build Coastguard Worker } else if (num_calls == 2) { 37*795d594fSAndroid Build Coastguard Worker System.out.println("2nd call"); 38*795d594fSAndroid Build Coastguard Worker } 39*795d594fSAndroid Build Coastguard Worker System.out.println(shlemiel()); 40*795d594fSAndroid Build Coastguard Worker } 41*795d594fSAndroid Build Coastguard Worker shlemiel()42*795d594fSAndroid Build Coastguard Worker String shlemiel() { 43*795d594fSAndroid Build Coastguard Worker String s0 = new String("0"); 44*795d594fSAndroid Build Coastguard Worker String s1 = new String("1"); 45*795d594fSAndroid Build Coastguard Worker String s2 = new String("2"); 46*795d594fSAndroid Build Coastguard Worker String s3 = new String("3"); 47*795d594fSAndroid Build Coastguard Worker String s4 = new String("4"); 48*795d594fSAndroid Build Coastguard Worker String s5 = new String("5"); 49*795d594fSAndroid Build Coastguard Worker String s6 = new String("6"); 50*795d594fSAndroid Build Coastguard Worker String s7 = new String("7"); 51*795d594fSAndroid Build Coastguard Worker String s8 = new String("8"); 52*795d594fSAndroid Build Coastguard Worker String s9 = new String("9"); 53*795d594fSAndroid Build Coastguard Worker String s10 = new String("10"); 54*795d594fSAndroid Build Coastguard Worker String s11 = new String("11"); 55*795d594fSAndroid Build Coastguard Worker String s12 = new String("12"); 56*795d594fSAndroid Build Coastguard Worker String s13 = new String("13"); 57*795d594fSAndroid Build Coastguard Worker String s14 = new String("14"); 58*795d594fSAndroid Build Coastguard Worker String s15 = new String("15"); 59*795d594fSAndroid Build Coastguard Worker String s16 = new String("16"); 60*795d594fSAndroid Build Coastguard Worker String s17 = new String("17"); 61*795d594fSAndroid Build Coastguard Worker String s18 = new String("18"); 62*795d594fSAndroid Build Coastguard Worker String s19 = new String("19"); 63*795d594fSAndroid Build Coastguard Worker String s20 = new String("20"); 64*795d594fSAndroid Build Coastguard Worker String s = new String(); 65*795d594fSAndroid Build Coastguard Worker s += s0; 66*795d594fSAndroid Build Coastguard Worker s += s1; 67*795d594fSAndroid Build Coastguard Worker s += s2; 68*795d594fSAndroid Build Coastguard Worker s += s3; 69*795d594fSAndroid Build Coastguard Worker s += s4; 70*795d594fSAndroid Build Coastguard Worker s += s5; 71*795d594fSAndroid Build Coastguard Worker s += s6; 72*795d594fSAndroid Build Coastguard Worker s += s7; 73*795d594fSAndroid Build Coastguard Worker s += s8; 74*795d594fSAndroid Build Coastguard Worker s += s9; 75*795d594fSAndroid Build Coastguard Worker s += s10; 76*795d594fSAndroid Build Coastguard Worker s += s11; 77*795d594fSAndroid Build Coastguard Worker s += s12; 78*795d594fSAndroid Build Coastguard Worker s += s13; 79*795d594fSAndroid Build Coastguard Worker s += s14; 80*795d594fSAndroid Build Coastguard Worker s += s15; 81*795d594fSAndroid Build Coastguard Worker s += s16; 82*795d594fSAndroid Build Coastguard Worker s += s17; 83*795d594fSAndroid Build Coastguard Worker s += s18; 84*795d594fSAndroid Build Coastguard Worker s += s19; 85*795d594fSAndroid Build Coastguard Worker s += s20; 86*795d594fSAndroid Build Coastguard Worker 87*795d594fSAndroid Build Coastguard Worker s += s6; 88*795d594fSAndroid Build Coastguard Worker s += s5; 89*795d594fSAndroid Build Coastguard Worker s += s2; 90*795d594fSAndroid Build Coastguard Worker s += s3; 91*795d594fSAndroid Build Coastguard Worker 92*795d594fSAndroid Build Coastguard Worker s10 = s + s10; 93*795d594fSAndroid Build Coastguard Worker s10 += s20; 94*795d594fSAndroid Build Coastguard Worker 95*795d594fSAndroid Build Coastguard Worker s20 += s10; 96*795d594fSAndroid Build Coastguard Worker s = s17 + s20; 97*795d594fSAndroid Build Coastguard Worker 98*795d594fSAndroid Build Coastguard Worker s4 = s18 = s19; 99*795d594fSAndroid Build Coastguard Worker s += s4; 100*795d594fSAndroid Build Coastguard Worker s += s18; 101*795d594fSAndroid Build Coastguard Worker // Add a branch to workaround ART's large methods without branches heuristic. 102*795d594fSAndroid Build Coastguard Worker if (testStackWalk(0) != 0) { 103*795d594fSAndroid Build Coastguard Worker return s; 104*795d594fSAndroid Build Coastguard Worker } 105*795d594fSAndroid Build Coastguard Worker return s18; 106*795d594fSAndroid Build Coastguard Worker } 107*795d594fSAndroid Build Coastguard Worker testStackWalk(int x)108*795d594fSAndroid Build Coastguard Worker native int testStackWalk(int x); 109*795d594fSAndroid Build Coastguard Worker main(String[] args)110*795d594fSAndroid Build Coastguard Worker public static void main(String[] args) throws Exception { 111*795d594fSAndroid Build Coastguard Worker System.loadLibrary(args[0]); 112*795d594fSAndroid Build Coastguard Worker Main st = new Main(); 113*795d594fSAndroid Build Coastguard Worker st.$noinline$f(); 114*795d594fSAndroid Build Coastguard Worker } 115*795d594fSAndroid Build Coastguard Worker } 116