1 /*
2  * Copyright (c) 2012, 2019, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.
8  *
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 
24 
25 package org.graalvm.compiler.hotspot.sparc;
26 
27 import java.util.HashSet;
28 import java.util.Set;
29 
30 import org.graalvm.compiler.bytecode.BytecodeProvider;
31 import org.graalvm.compiler.core.sparc.SPARCAddressLowering;
32 import org.graalvm.compiler.core.sparc.SPARCSuitesCreator;
33 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
34 import org.graalvm.compiler.hotspot.HotSpotBackend;
35 import org.graalvm.compiler.hotspot.HotSpotBackendFactory;
36 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
37 import org.graalvm.compiler.hotspot.HotSpotReplacementsImpl;
38 import org.graalvm.compiler.hotspot.meta.AddressLoweringHotSpotSuitesProvider;
39 import org.graalvm.compiler.hotspot.meta.HotSpotConstantFieldProvider;
40 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider;
41 import org.graalvm.compiler.hotspot.meta.HotSpotGCProvider;
42 import org.graalvm.compiler.hotspot.meta.HotSpotGraphBuilderPlugins;
43 import org.graalvm.compiler.hotspot.meta.HotSpotLoweringProvider;
44 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
45 import org.graalvm.compiler.hotspot.meta.HotSpotRegisters;
46 import org.graalvm.compiler.hotspot.meta.HotSpotRegistersProvider;
47 import org.graalvm.compiler.hotspot.meta.HotSpotSnippetReflectionProvider;
48 import org.graalvm.compiler.hotspot.meta.HotSpotStampProvider;
49 import org.graalvm.compiler.hotspot.meta.HotSpotSuitesProvider;
50 import org.graalvm.compiler.hotspot.word.HotSpotWordTypes;
51 import org.graalvm.compiler.nodes.graphbuilderconf.GraphBuilderConfiguration.Plugins;
52 import org.graalvm.compiler.nodes.spi.LoweringProvider;
53 import org.graalvm.compiler.nodes.spi.Replacements;
54 import org.graalvm.compiler.options.OptionValues;
55 import org.graalvm.compiler.phases.common.AddressLoweringPhase;
56 import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
57 import org.graalvm.compiler.phases.util.Providers;
58 import org.graalvm.compiler.replacements.sparc.SPARCGraphBuilderPlugins;
59 import org.graalvm.compiler.serviceprovider.ServiceProvider;
60 
61 import jdk.vm.ci.code.Architecture;
62 import jdk.vm.ci.code.Register;
63 import jdk.vm.ci.code.RegisterConfig;
64 import jdk.vm.ci.code.TargetDescription;
65 import jdk.vm.ci.hotspot.HotSpotCodeCacheProvider;
66 import jdk.vm.ci.hotspot.HotSpotConstantReflectionProvider;
67 import jdk.vm.ci.hotspot.HotSpotJVMCIRuntime;
68 import jdk.vm.ci.hotspot.HotSpotMetaAccessProvider;
69 import jdk.vm.ci.meta.Value;
70 import jdk.vm.ci.runtime.JVMCIBackend;
71 import jdk.vm.ci.sparc.SPARC;
72 
73 @ServiceProvider(HotSpotBackendFactory.class)
74 public class SPARCHotSpotBackendFactory extends HotSpotBackendFactory {
75 
76     @Override
getName()77     public String getName() {
78         return "community";
79     }
80 
81     @Override
getArchitecture()82     public Class<? extends Architecture> getArchitecture() {
83         return SPARC.class;
84     }
85 
86     @Override
createBackend(HotSpotGraalRuntimeProvider runtime, CompilerConfiguration compilerConfiguration, HotSpotJVMCIRuntime jvmciRuntime, HotSpotBackend host)87     public HotSpotBackend createBackend(HotSpotGraalRuntimeProvider runtime, CompilerConfiguration compilerConfiguration, HotSpotJVMCIRuntime jvmciRuntime, HotSpotBackend host) {
88         assert host == null;
89 
90         OptionValues options = runtime.getOptions();
91         GraalHotSpotVMConfig config = runtime.getVMConfig();
92         JVMCIBackend jvmci = jvmciRuntime.getHostJVMCIBackend();
93         HotSpotRegistersProvider registers = createRegisters();
94         HotSpotMetaAccessProvider metaAccess = (HotSpotMetaAccessProvider) jvmci.getMetaAccess();
95         HotSpotCodeCacheProvider codeCache = (HotSpotCodeCacheProvider) jvmci.getCodeCache();
96         TargetDescription target = codeCache.getTarget();
97         HotSpotConstantReflectionProvider constantReflection = (HotSpotConstantReflectionProvider) jvmci.getConstantReflection();
98         HotSpotConstantFieldProvider constantFieldProvider = createConstantFieldProvider(config, metaAccess);
99         Value[] nativeABICallerSaveRegisters = createNativeABICallerSaveRegisters(config, codeCache.getRegisterConfig());
100         HotSpotWordTypes wordTypes = createWordTypes(metaAccess, target);
101         HotSpotForeignCallsProvider foreignCalls = new SPARCHotSpotForeignCallsProvider(jvmciRuntime, runtime, metaAccess, codeCache, wordTypes, nativeABICallerSaveRegisters);
102         LoweringProvider lowerer = createLowerer(runtime, metaAccess, foreignCalls, registers, constantReflection, target);
103         HotSpotStampProvider stampProvider = createStampProvider();
104         HotSpotGCProvider gc = createGCProvider(config, metaAccess);
105         Providers p = new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, null, stampProvider, gc);
106         HotSpotSnippetReflectionProvider snippetReflection = createSnippetReflection(runtime, constantReflection, wordTypes);
107         BytecodeProvider bytecodeProvider = createBytecodeProvider(metaAccess, snippetReflection);
108         HotSpotReplacementsImpl replacements = createReplacements(target, p, snippetReflection, bytecodeProvider);
109         Plugins plugins = createGraphBuilderPlugins(runtime, compilerConfiguration, config, metaAccess, constantReflection, foreignCalls, snippetReflection, replacements, wordTypes,
110                         runtime.getOptions(), target);
111         replacements.setGraphBuilderPlugins(plugins);
112         HotSpotSuitesProvider suites = createSuites(config, runtime, compilerConfiguration, plugins, replacements);
113         HotSpotProviders providers = new HotSpotProviders(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, suites, registers,
114                         snippetReflection, wordTypes, plugins, gc);
115         replacements.setProviders(providers);
116         replacements.maybeInitializeEncoder(options);
117 
118         return createBackend(config, runtime, providers);
119     }
120 
createGraphBuilderPlugins(HotSpotGraalRuntimeProvider graalRuntime, CompilerConfiguration compilerConfiguration, GraalHotSpotVMConfig config, HotSpotMetaAccessProvider metaAccess, HotSpotConstantReflectionProvider constantReflection, HotSpotForeignCallsProvider foreignCalls, HotSpotSnippetReflectionProvider snippetReflection, HotSpotReplacementsImpl replacements, HotSpotWordTypes wordTypes, OptionValues options, TargetDescription target)121     protected Plugins createGraphBuilderPlugins(HotSpotGraalRuntimeProvider graalRuntime,
122                     CompilerConfiguration compilerConfiguration,
123                     GraalHotSpotVMConfig config,
124                     HotSpotMetaAccessProvider metaAccess,
125                     HotSpotConstantReflectionProvider constantReflection,
126                     HotSpotForeignCallsProvider foreignCalls,
127                     HotSpotSnippetReflectionProvider snippetReflection,
128                     HotSpotReplacementsImpl replacements,
129                     HotSpotWordTypes wordTypes,
130                     OptionValues options,
131                     TargetDescription target) {
132         Plugins plugins = HotSpotGraphBuilderPlugins.create(
133                         graalRuntime,
134                         compilerConfiguration,
135                         config,
136                         wordTypes,
137                         metaAccess,
138                         constantReflection,
139                         snippetReflection,
140                         foreignCalls,
141                         replacements,
142                         options,
143                         target);
144         SPARCGraphBuilderPlugins.register(plugins, replacements, false);
145         return plugins;
146     }
147 
148     /**
149      * @param replacements
150      */
createSuites(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, CompilerConfiguration compilerConfiguration, Plugins plugins, Replacements replacements)151     protected HotSpotSuitesProvider createSuites(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, CompilerConfiguration compilerConfiguration, Plugins plugins,
152                     Replacements replacements) {
153         return new AddressLoweringHotSpotSuitesProvider(new SPARCSuitesCreator(compilerConfiguration, plugins), config, runtime, new AddressLoweringPhase(new SPARCAddressLowering()));
154     }
155 
createBackend(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, HotSpotProviders providers)156     protected SPARCHotSpotBackend createBackend(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, HotSpotProviders providers) {
157         return new SPARCHotSpotBackend(config, runtime, providers);
158     }
159 
createLowerer(HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess, HotSpotForeignCallsProvider foreignCalls, HotSpotRegistersProvider registers, HotSpotConstantReflectionProvider constantReflection, TargetDescription target)160     protected HotSpotLoweringProvider createLowerer(HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess, HotSpotForeignCallsProvider foreignCalls,
161                     HotSpotRegistersProvider registers, HotSpotConstantReflectionProvider constantReflection, TargetDescription target) {
162         return new SPARCHotSpotLoweringProvider(runtime, metaAccess, foreignCalls, registers, constantReflection, target);
163     }
164 
createRegisters()165     protected HotSpotRegistersProvider createRegisters() {
166         return new HotSpotRegisters(SPARC.g2, SPARC.g6, SPARC.sp);
167     }
168 
169     @SuppressWarnings("unused")
createNativeABICallerSaveRegisters(GraalHotSpotVMConfig config, RegisterConfig regConfig)170     private static Value[] createNativeABICallerSaveRegisters(GraalHotSpotVMConfig config, RegisterConfig regConfig) {
171         Set<Register> callerSavedRegisters = new HashSet<>();
172         SPARC.fpusRegisters.addTo(callerSavedRegisters);
173         SPARC.fpudRegisters.addTo(callerSavedRegisters);
174         callerSavedRegisters.add(SPARC.g1);
175         callerSavedRegisters.add(SPARC.g4);
176         callerSavedRegisters.add(SPARC.g5);
177         Value[] nativeABICallerSaveRegisters = new Value[callerSavedRegisters.size()];
178         int i = 0;
179         for (Register reg : callerSavedRegisters) {
180             nativeABICallerSaveRegisters[i] = reg.asValue();
181             i++;
182         }
183         return nativeABICallerSaveRegisters;
184     }
185 
186     @Override
toString()187     public String toString() {
188         return "SPARC";
189     }
190 }
191