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