1 /* 2 * Copyright (C) 2021 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 public class Main { main(String[] args)18 public static void main(String[] args) { 19 // Test that the cross-dex inlining is working for HInstructions that need an environment. 20 System.out.println($noinline$testNeedsEnvironment()); 21 22 // Test that the cross-dex inlining is working for HInstructions that need a bss entry. 23 System.out.println($noinline$testNeedsBssEntryString()); 24 System.out.println($noinline$testNeedsBssEntryInvoke()); 25 System.out.println($noinline$testClass()); 26 27 // Test that we are able to inline try catches across dex files. 28 System.out.println($noinline$testTryCatch()); 29 } 30 31 /// CHECK-START: java.lang.String Main.$noinline$testNeedsEnvironment() inliner (before) 32 /// CHECK: InvokeStaticOrDirect method_name:Multi.$inline$NeedsEnvironmentMultiDex 33 34 /// CHECK-START: java.lang.String Main.$noinline$testNeedsEnvironment() inliner (after) 35 /// CHECK-NOT: InvokeStaticOrDirect method_name:Multi.$inline$NeedsEnvironmentMultiDex 36 37 /// CHECK-START: java.lang.String Main.$noinline$testNeedsEnvironment() inliner (after) 38 /// CHECK: StringBuilderAppend $noinline$testNeedsEnvironment()39 private static String $noinline$testNeedsEnvironment() { 40 return Multi.$inline$NeedsEnvironmentMultiDex("abc"); 41 } 42 43 /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryString() inliner (before) 44 /// CHECK: InvokeStaticOrDirect method_name:Multi.$inline$NeedsBssEntryStringMultiDex 45 46 /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryString() inliner (after) 47 /// CHECK-NOT: InvokeStaticOrDirect method_name:Multi.$inline$NeedsBssEntryStringMultiDex 48 49 /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryString() inliner (after) 50 /// CHECK: LoadString load_kind:BssEntry $noinline$testNeedsBssEntryString()51 private static String $noinline$testNeedsBssEntryString() { 52 return Multi.$inline$NeedsBssEntryStringMultiDex(); 53 } 54 55 /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryInvoke() inliner (before) 56 /// CHECK: InvokeStaticOrDirect method_name:Multi.$inline$NeedsBssEntryInvokeMultiDex 57 58 /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryInvoke() inliner (after) 59 /// CHECK-NOT: InvokeStaticOrDirect method_name:Multi.$inline$NeedsBssEntryInvokeMultiDex 60 61 /// CHECK-START: java.lang.String Main.$noinline$testNeedsBssEntryInvoke() inliner (after) 62 /// CHECK: InvokeStaticOrDirect method_name:Multi.$noinline$InnerInvokeMultiDex method_load_kind:BssEntry $noinline$testNeedsBssEntryInvoke()63 private static String $noinline$testNeedsBssEntryInvoke() { 64 return Multi.$inline$NeedsBssEntryInvokeMultiDex(); 65 } 66 67 /// CHECK-START: java.lang.Class Main.$noinline$testClass() inliner (before) 68 /// CHECK: InvokeStaticOrDirect method_name:Multi.NeedsBssEntryClassMultiDex 69 70 /// CHECK-START: java.lang.Class Main.$noinline$testClass() inliner (after) 71 /// CHECK-NOT: InvokeStaticOrDirect method_name:Multi.NeedsBssEntryClassMultiDex 72 73 /// CHECK-START: java.lang.Class Main.$noinline$testClass() inliner (after) 74 /// CHECK: LoadClass load_kind:BssEntry class_name:Multi$Multi2 $noinline$testClass()75 private static Class<?> $noinline$testClass() { 76 return Multi.NeedsBssEntryClassMultiDex(); 77 } 78 79 80 /// CHECK-START: int Main.$noinline$testTryCatch() inliner (before) 81 /// CHECK-NOT: TryBoundary 82 83 /// CHECK-START: int Main.$noinline$testTryCatch() inliner (after) 84 /// CHECK: TryBoundary $noinline$testTryCatch()85 private static int $noinline$testTryCatch() { 86 return Multi.$inline$TryCatch("123") + Multi.$inline$TryCatch("abc"); 87 } 88 } 89