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