9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package jdk.vm.ci.hotspot;
24
25 import jdk.vm.ci.code.CompilationRequest;
26 import jdk.vm.ci.common.JVMCIError;
27 import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
28 import jdk.vm.ci.runtime.JVMCICompiler;
29 import jdk.vm.ci.runtime.JVMCIRuntime;
30 import jdk.vm.ci.runtime.services.JVMCICompilerFactory;
31 import jdk.vm.ci.services.Services;
32
33 final class HotSpotJVMCICompilerConfig {
34
35 /**
36 * This factory allows JVMCI initialization to succeed but raises an error if the VM asks JVMCI
37 * to perform a compilation. This allows the reflective parts of the JVMCI API to be used
38 * without requiring a compiler implementation to be available.
39 */
40 private static class DummyCompilerFactory extends JVMCICompilerFactory implements JVMCICompiler {
41
42 public HotSpotCompilationRequestResult compileMethod(CompilationRequest request) {
43 throw new JVMCIError("no JVMCI compiler selected");
44 }
45
46 @Override
47 public String getCompilerName() {
48 return "<none>";
49 }
50
51 @Override
52 public JVMCICompiler createCompiler(JVMCIRuntime runtime) {
53 return this;
54 }
55 }
56
57 /**
58 * Factory of the selected system compiler.
59 */
60 private static JVMCICompilerFactory compilerFactory;
61
62 /**
63 * Gets the selected system compiler factory.
64 *
65 * @return the selected system compiler factory
66 */
67 static JVMCICompilerFactory getCompilerFactory() {
68 if (compilerFactory == null) {
69 JVMCICompilerFactory factory = null;
70 String compilerName = Option.Compiler.getString();
71 if (compilerName != null) {
72 for (JVMCICompilerFactory f : Services.load(JVMCICompilerFactory.class)) {
73 if (f.getCompilerName().equals(compilerName)) {
74 Services.exportJVMCITo(f.getClass());
75 factory = f;
76 }
77 }
78 if (factory == null) {
79 throw new JVMCIError("JVMCI compiler '%s' not found", compilerName);
80 }
81 } else {
82 // Auto select a single available compiler
83 for (JVMCICompilerFactory f : Services.load(JVMCICompilerFactory.class)) {
84 if (factory == null) {
85 factory = f;
86 } else {
87 // Multiple factories seen - cancel auto selection
88 factory = null;
89 break;
90 }
91 }
92 if (factory == null) {
93 factory = new DummyCompilerFactory();
94 }
95 }
96 factory.onSelection();
97 compilerFactory = factory;
98 }
99 return compilerFactory;
100 }
101 }
|
9 * This code is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12 * version 2 for more details (a copy is included in the LICENSE file that
13 * accompanied this code).
14 *
15 * You should have received a copy of the GNU General Public License version
16 * 2 along with this work; if not, write to the Free Software Foundation,
17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18 *
19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20 * or visit www.oracle.com if you need additional information or have any
21 * questions.
22 */
23 package jdk.vm.ci.hotspot;
24
25 import jdk.vm.ci.code.CompilationRequest;
26 import jdk.vm.ci.common.JVMCIError;
27 import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.Option;
28 import jdk.vm.ci.runtime.JVMCICompiler;
29 import jdk.vm.ci.runtime.JVMCICompilerFactory;
30 import jdk.vm.ci.runtime.JVMCIRuntime;
31 import jdk.vm.ci.services.JVMCIServiceLocator;
32 import jdk.vm.ci.services.JVMCIPermission;
33 import jdk.vm.ci.services.Services;
34
35 final class HotSpotJVMCICompilerConfig {
36
37 /**
38 * This factory allows JVMCI initialization to succeed but raises an error if the VM asks JVMCI
39 * to perform a compilation. This allows the reflective parts of the JVMCI API to be used
40 * without requiring a compiler implementation to be available.
41 */
42 private static class DummyCompilerFactory implements JVMCICompilerFactory, JVMCICompiler {
43
44 public HotSpotCompilationRequestResult compileMethod(CompilationRequest request) {
45 throw new JVMCIError("no JVMCI compiler selected");
46 }
47
48 @Override
49 public String getCompilerName() {
50 return "<none>";
51 }
52
53 @Override
54 public JVMCICompiler createCompiler(JVMCIRuntime runtime) {
55 return this;
56 }
57 }
58
59 /**
60 * Factory of the selected system compiler.
61 */
62 private static JVMCICompilerFactory compilerFactory;
63
64 /**
65 * Gets the selected system compiler factory.
66 *
67 * @return the selected system compiler factory
68 * @throws SecurityException if a security manager is present and it denies
69 * {@link JVMCIPermission} for any {@link JVMCIServiceLocator} loaded by this method
70 */
71 static JVMCICompilerFactory getCompilerFactory() {
72 if (compilerFactory == null) {
73 JVMCICompilerFactory factory = null;
74 String compilerName = Option.Compiler.getString();
75 if (compilerName != null) {
76 for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) {
77 if (f.getCompilerName().equals(compilerName)) {
78 factory = f;
79 }
80 }
81 if (factory == null) {
82 throw new JVMCIError("JVMCI compiler '%s' not found", compilerName);
83 }
84 } else {
85 // Auto select a single available compiler
86 for (JVMCICompilerFactory f : JVMCIServiceLocator.getProviders(JVMCICompilerFactory.class)) {
87 if (factory == null) {
88 factory = f;
89 } else {
90 // Multiple factories seen - cancel auto selection
91 factory = null;
92 break;
93 }
94 }
95 if (factory == null) {
96 factory = new DummyCompilerFactory();
97 }
98 }
99 factory.onSelection();
100 compilerFactory = factory;
101 }
102 return compilerFactory;
103 }
104 }
|