29 import sun.hotspot.WhiteBox; |
29 import sun.hotspot.WhiteBox; |
30 |
30 |
31 public class StableConfiguration { |
31 public class StableConfiguration { |
32 static final WhiteBox WB = WhiteBox.getWhiteBox(); |
32 static final WhiteBox WB = WhiteBox.getWhiteBox(); |
33 static final boolean isStableEnabled; |
33 static final boolean isStableEnabled; |
34 static final boolean isServerWithStable; |
|
35 |
34 |
36 static { |
35 static { |
37 Boolean value = WB.getBooleanVMFlag("FoldStableValues"); |
36 Boolean value = WB.getBooleanVMFlag("FoldStableValues"); |
38 isStableEnabled = (value == null ? false : value); |
37 isStableEnabled = (value == null ? false : value); |
39 isServerWithStable = isStableEnabled && get(); |
|
40 System.out.println("@Stable: " + (isStableEnabled ? "enabled" : "disabled")); |
38 System.out.println("@Stable: " + (isStableEnabled ? "enabled" : "disabled")); |
41 System.out.println("Server Compiler: " + get()); |
|
42 } |
39 } |
43 |
|
44 // The method 'get' below returns true if the method is server compiled |
|
45 // and is used by the Stable tests to determine whether methods in |
|
46 // general are being server compiled or not as the -XX:+FoldStableValues |
|
47 // option is only applicable to -server. |
|
48 // |
|
49 // On aarch64 we DeOptimize when patching. This means that when the |
|
50 // method is compiled as a result of -Xcomp it DeOptimizes immediately. |
|
51 // The result is that getMethodCompilationLevel returns 0. This means |
|
52 // the method returns true based on java.vm.name. |
|
53 // |
|
54 // However when the tests are run with -XX:+TieredCompilation and |
|
55 // -XX:TieredStopAtLevel=1 this fails because methods will always |
|
56 // be client compiled. |
|
57 // |
|
58 // Solution is to add a simple method 'get1' which should never be |
|
59 // DeOpted and use that to determine the compilation level instead. |
|
60 static void get1() { |
|
61 } |
|
62 |
|
63 |
|
64 |
|
65 // ::get() is among immediately compiled methods. |
|
66 static boolean get() { |
|
67 try { |
|
68 get1(); |
|
69 Method m = StableConfiguration.class.getDeclaredMethod("get1"); |
|
70 int level = WB.getMethodCompilationLevel(m); |
|
71 if (level > 0) { |
|
72 return (level == 4); |
|
73 } else { |
|
74 String javaVM = System.getProperty("java.vm.name", ""); |
|
75 if (javaVM.contains("Server")) return true; |
|
76 if (javaVM.contains("Client")) return false; |
|
77 throw new Error("Unknown VM type: "+javaVM); |
|
78 } |
|
79 } catch (NoSuchMethodException e) { |
|
80 throw new Error(e); |
|
81 } |
|
82 } |
|
83 |
|
84 } |
40 } |