1*795d594fSAndroid Build Coastguard Worker /* 2*795d594fSAndroid Build Coastguard Worker * Copyright (C) 2021 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) { 19*795d594fSAndroid Build Coastguard Worker // Test that the cross-dex inlining is working for HInstructions that need an environment. 20*795d594fSAndroid Build Coastguard Worker System.out.println($noinline$testNeedsEnvironment()); 21*795d594fSAndroid Build Coastguard Worker 22*795d594fSAndroid Build Coastguard Worker // Test that the cross-dex inlining is working for HInstructions that need a bss entry. 23*795d594fSAndroid Build Coastguard Worker System.out.println($noinline$testNeedsBssEntryString()); 24*795d594fSAndroid Build Coastguard Worker System.out.println($noinline$testNeedsBssEntryInvoke()); 25*795d594fSAndroid Build Coastguard Worker System.out.println($noinline$testClass()); 26*795d594fSAndroid Build Coastguard Worker 27*795d594fSAndroid Build Coastguard Worker // Test that we are able to inline try catches across dex files. 28*795d594fSAndroid Build Coastguard Worker System.out.println($noinline$testTryCatch()); 29*795d594fSAndroid Build Coastguard Worker } 30*795d594fSAndroid Build Coastguard Worker 31*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.$noinline$testNeedsEnvironment() inliner (before) 32*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect method_name:Multi.$inline$NeedsEnvironmentMultiDex 33*795d594fSAndroid Build Coastguard Worker 34*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.$noinline$testNeedsEnvironment() inliner (after) 35*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect method_name:Multi.$inline$NeedsEnvironmentMultiDex 36*795d594fSAndroid Build Coastguard Worker 37*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.$noinline$testNeedsEnvironment() inliner (after) 38*795d594fSAndroid Build Coastguard Worker /// CHECK: StringBuilderAppend $noinline$testNeedsEnvironment()39*795d594fSAndroid Build Coastguard Worker private static String $noinline$testNeedsEnvironment() { 40*795d594fSAndroid Build Coastguard Worker return Multi.$inline$NeedsEnvironmentMultiDex("abc"); 41*795d594fSAndroid Build Coastguard Worker } 42*795d594fSAndroid Build Coastguard Worker 43*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryString() inliner (before) 44*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect method_name:Multi.$inline$NeedsBssEntryStringMultiDex 45*795d594fSAndroid Build Coastguard Worker 46*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryString() inliner (after) 47*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect method_name:Multi.$inline$NeedsBssEntryStringMultiDex 48*795d594fSAndroid Build Coastguard Worker 49*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryString() inliner (after) 50*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadString load_kind:BssEntry $noinline$testNeedsBssEntryString()51*795d594fSAndroid Build Coastguard Worker private static String $noinline$testNeedsBssEntryString() { 52*795d594fSAndroid Build Coastguard Worker return Multi.$inline$NeedsBssEntryStringMultiDex(); 53*795d594fSAndroid Build Coastguard Worker } 54*795d594fSAndroid Build Coastguard Worker 55*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryInvoke() inliner (before) 56*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect method_name:Multi.$inline$NeedsBssEntryInvokeMultiDex 57*795d594fSAndroid Build Coastguard Worker 58*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryInvoke() inliner (after) 59*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect method_name:Multi.$inline$NeedsBssEntryInvokeMultiDex 60*795d594fSAndroid Build Coastguard Worker 61*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryInvoke() inliner (after) 62*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect method_name:Multi.$noinline$InnerInvokeMultiDex method_load_kind:BssEntry $noinline$testNeedsBssEntryInvoke()63*795d594fSAndroid Build Coastguard Worker private static String $noinline$testNeedsBssEntryInvoke() { 64*795d594fSAndroid Build Coastguard Worker return Multi.$inline$NeedsBssEntryInvokeMultiDex(); 65*795d594fSAndroid Build Coastguard Worker } 66*795d594fSAndroid Build Coastguard Worker 67*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.Class Main.$noinline$testClass() inliner (before) 68*795d594fSAndroid Build Coastguard Worker /// CHECK: InvokeStaticOrDirect method_name:Multi.NeedsBssEntryClassMultiDex 69*795d594fSAndroid Build Coastguard Worker 70*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.Class Main.$noinline$testClass() inliner (after) 71*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: InvokeStaticOrDirect method_name:Multi.NeedsBssEntryClassMultiDex 72*795d594fSAndroid Build Coastguard Worker 73*795d594fSAndroid Build Coastguard Worker /// CHECK-START: java.lang.Class Main.$noinline$testClass() inliner (after) 74*795d594fSAndroid Build Coastguard Worker /// CHECK: LoadClass load_kind:BssEntry class_name:Multi$Multi2 $noinline$testClass()75*795d594fSAndroid Build Coastguard Worker private static Class<?> $noinline$testClass() { 76*795d594fSAndroid Build Coastguard Worker return Multi.NeedsBssEntryClassMultiDex(); 77*795d594fSAndroid Build Coastguard Worker } 78*795d594fSAndroid Build Coastguard Worker 79*795d594fSAndroid Build Coastguard Worker 80*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testTryCatch() inliner (before) 81*795d594fSAndroid Build Coastguard Worker /// CHECK-NOT: TryBoundary 82*795d594fSAndroid Build Coastguard Worker 83*795d594fSAndroid Build Coastguard Worker /// CHECK-START: int Main.$noinline$testTryCatch() inliner (after) 84*795d594fSAndroid Build Coastguard Worker /// CHECK: TryBoundary $noinline$testTryCatch()85*795d594fSAndroid Build Coastguard Worker private static int $noinline$testTryCatch() { 86*795d594fSAndroid Build Coastguard Worker return Multi.$inline$TryCatch("123") + Multi.$inline$TryCatch("abc"); 87*795d594fSAndroid Build Coastguard Worker } 88*795d594fSAndroid Build Coastguard Worker } 89