xref: /aosp_15_r20/art/test/004-StackWalk/src/Main.java (revision 795d594fd825385562da6b089ea9b2033f3abf5a)
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