src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.amd64/src/org/graalvm/compiler/hotspot/amd64/AMD64HotSpotBackendFactory.java
branchdatagramsocketimpl-branch
changeset 58678 9cf78a70fa4f
parent 54914 9feb4852536f
child 58679 9c3209ff7550
equal deleted inserted replaced
58677:13588c901957 58678:9cf78a70fa4f
    23 
    23 
    24 
    24 
    25 package org.graalvm.compiler.hotspot.amd64;
    25 package org.graalvm.compiler.hotspot.amd64;
    26 
    26 
    27 import static jdk.vm.ci.common.InitTimer.timer;
    27 import static jdk.vm.ci.common.InitTimer.timer;
    28 import static org.graalvm.compiler.serviceprovider.JavaVersionUtil.JAVA_SPECIFICATION_VERSION;
       
    29 
    28 
    30 import java.util.ArrayList;
    29 import java.util.ArrayList;
    31 import java.util.List;
    30 import java.util.List;
    32 
    31 
    33 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
       
    34 import org.graalvm.compiler.bytecode.BytecodeProvider;
    32 import org.graalvm.compiler.bytecode.BytecodeProvider;
    35 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider;
    33 import org.graalvm.compiler.core.common.spi.ConstantFieldProvider;
    36 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
    34 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
    37 import org.graalvm.compiler.hotspot.HotSpotBackend;
    35 import org.graalvm.compiler.hotspot.HotSpotBackend;
    38 import org.graalvm.compiler.hotspot.HotSpotBackendFactory;
    36 import org.graalvm.compiler.hotspot.HotSpotBackendFactory;
    39 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
    37 import org.graalvm.compiler.hotspot.HotSpotGraalRuntimeProvider;
    40 import org.graalvm.compiler.hotspot.HotSpotReplacementsImpl;
    38 import org.graalvm.compiler.hotspot.HotSpotReplacementsImpl;
    41 import org.graalvm.compiler.hotspot.meta.AddressLoweringHotSpotSuitesProvider;
    39 import org.graalvm.compiler.hotspot.meta.AddressLoweringHotSpotSuitesProvider;
    42 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider;
    40 import org.graalvm.compiler.hotspot.meta.HotSpotForeignCallsProvider;
       
    41 import org.graalvm.compiler.hotspot.meta.HotSpotGCProvider;
    43 import org.graalvm.compiler.hotspot.meta.HotSpotGraalConstantFieldProvider;
    42 import org.graalvm.compiler.hotspot.meta.HotSpotGraalConstantFieldProvider;
    44 import org.graalvm.compiler.hotspot.meta.HotSpotGraphBuilderPlugins;
    43 import org.graalvm.compiler.hotspot.meta.HotSpotGraphBuilderPlugins;
    45 import org.graalvm.compiler.hotspot.meta.HotSpotHostForeignCallsProvider;
    44 import org.graalvm.compiler.hotspot.meta.HotSpotHostForeignCallsProvider;
    46 import org.graalvm.compiler.hotspot.meta.HotSpotLoweringProvider;
    45 import org.graalvm.compiler.hotspot.meta.HotSpotLoweringProvider;
    47 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
    46 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
    56 import org.graalvm.compiler.options.OptionValues;
    55 import org.graalvm.compiler.options.OptionValues;
    57 import org.graalvm.compiler.phases.common.AddressLoweringPhase;
    56 import org.graalvm.compiler.phases.common.AddressLoweringPhase;
    58 import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
    57 import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
    59 import org.graalvm.compiler.phases.util.Providers;
    58 import org.graalvm.compiler.phases.util.Providers;
    60 import org.graalvm.compiler.replacements.amd64.AMD64GraphBuilderPlugins;
    59 import org.graalvm.compiler.replacements.amd64.AMD64GraphBuilderPlugins;
    61 import org.graalvm.compiler.replacements.classfile.ClassfileBytecodeProvider;
    60 import org.graalvm.compiler.serviceprovider.JavaVersionUtil;
    62 import org.graalvm.compiler.serviceprovider.ServiceProvider;
    61 import org.graalvm.compiler.serviceprovider.ServiceProvider;
    63 import org.graalvm.compiler.word.WordTypes;
    62 import org.graalvm.compiler.word.WordTypes;
    64 
    63 
    65 import jdk.vm.ci.amd64.AMD64;
    64 import jdk.vm.ci.amd64.AMD64;
    66 import jdk.vm.ci.code.Architecture;
    65 import jdk.vm.ci.code.Architecture;
    74 import jdk.vm.ci.hotspot.HotSpotMetaAccessProvider;
    73 import jdk.vm.ci.hotspot.HotSpotMetaAccessProvider;
    75 import jdk.vm.ci.meta.Value;
    74 import jdk.vm.ci.meta.Value;
    76 import jdk.vm.ci.runtime.JVMCIBackend;
    75 import jdk.vm.ci.runtime.JVMCIBackend;
    77 
    76 
    78 @ServiceProvider(HotSpotBackendFactory.class)
    77 @ServiceProvider(HotSpotBackendFactory.class)
    79 public class AMD64HotSpotBackendFactory implements HotSpotBackendFactory {
    78 public class AMD64HotSpotBackendFactory extends HotSpotBackendFactory {
    80 
    79 
    81     @Override
    80     @Override
    82     public String getName() {
    81     public String getName() {
    83         return "community";
    82         return "community";
    84     }
    83     }
   104         Value[] nativeABICallerSaveRegisters;
   103         Value[] nativeABICallerSaveRegisters;
   105         HotSpotMetaAccessProvider metaAccess = (HotSpotMetaAccessProvider) jvmci.getMetaAccess();
   104         HotSpotMetaAccessProvider metaAccess = (HotSpotMetaAccessProvider) jvmci.getMetaAccess();
   106         HotSpotConstantReflectionProvider constantReflection = (HotSpotConstantReflectionProvider) jvmci.getConstantReflection();
   105         HotSpotConstantReflectionProvider constantReflection = (HotSpotConstantReflectionProvider) jvmci.getConstantReflection();
   107         ConstantFieldProvider constantFieldProvider = new HotSpotGraalConstantFieldProvider(config, metaAccess);
   106         ConstantFieldProvider constantFieldProvider = new HotSpotGraalConstantFieldProvider(config, metaAccess);
   108         HotSpotLoweringProvider lowerer;
   107         HotSpotLoweringProvider lowerer;
       
   108         HotSpotStampProvider stampProvider;
       
   109         HotSpotGCProvider gc;
   109         HotSpotSnippetReflectionProvider snippetReflection;
   110         HotSpotSnippetReflectionProvider snippetReflection;
   110         HotSpotReplacementsImpl replacements;
   111         HotSpotReplacementsImpl replacements;
   111         HotSpotSuitesProvider suites;
   112         HotSpotSuitesProvider suites;
   112         HotSpotWordTypes wordTypes;
   113         HotSpotWordTypes wordTypes;
   113         Plugins plugins;
   114         Plugins plugins;
   118             }
   119             }
   119             try (InitTimer rt = timer("create NativeABICallerSaveRegisters")) {
   120             try (InitTimer rt = timer("create NativeABICallerSaveRegisters")) {
   120                 nativeABICallerSaveRegisters = createNativeABICallerSaveRegisters(config, codeCache.getRegisterConfig());
   121                 nativeABICallerSaveRegisters = createNativeABICallerSaveRegisters(config, codeCache.getRegisterConfig());
   121             }
   122             }
   122             try (InitTimer rt = timer("create WordTypes")) {
   123             try (InitTimer rt = timer("create WordTypes")) {
   123                 wordTypes = new HotSpotWordTypes(metaAccess, target.wordJavaKind);
   124                 wordTypes = createWordTypes(metaAccess, target);
   124             }
   125             }
   125             try (InitTimer rt = timer("create ForeignCalls provider")) {
   126             try (InitTimer rt = timer("create ForeignCalls provider")) {
   126                 foreignCalls = createForeignCalls(jvmciRuntime, graalRuntime, metaAccess, codeCache, wordTypes, nativeABICallerSaveRegisters);
   127                 foreignCalls = createForeignCalls(jvmciRuntime, graalRuntime, metaAccess, codeCache, wordTypes, nativeABICallerSaveRegisters);
   127             }
   128             }
   128             try (InitTimer rt = timer("create Lowerer provider")) {
   129             try (InitTimer rt = timer("create Lowerer provider")) {
   129                 lowerer = createLowerer(graalRuntime, metaAccess, foreignCalls, registers, constantReflection, target);
   130                 lowerer = createLowerer(graalRuntime, metaAccess, foreignCalls, registers, constantReflection, target);
   130             }
   131             }
   131             HotSpotStampProvider stampProvider = new HotSpotStampProvider();
   132             try (InitTimer rt = timer("create stamp provider")) {
   132             Providers p = new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, null, stampProvider);
   133                 stampProvider = createStampProvider();
       
   134             }
       
   135             try (InitTimer rt = timer("create GC provider")) {
       
   136                 gc = createGCProvider(config);
       
   137             }
       
   138 
       
   139             Providers p = new Providers(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, null, stampProvider, gc);
   133 
   140 
   134             try (InitTimer rt = timer("create SnippetReflection provider")) {
   141             try (InitTimer rt = timer("create SnippetReflection provider")) {
   135                 snippetReflection = createSnippetReflection(graalRuntime, constantReflection, wordTypes);
   142                 snippetReflection = createSnippetReflection(graalRuntime, constantReflection, wordTypes);
   136             }
   143             }
   137             try (InitTimer rt = timer("create Bytecode provider")) {
   144             try (InitTimer rt = timer("create Bytecode provider")) {
   138                 bytecodeProvider = new ClassfileBytecodeProvider(metaAccess, snippetReflection);
   145                 bytecodeProvider = createBytecodeProvider(metaAccess, snippetReflection);
   139             }
   146             }
   140             try (InitTimer rt = timer("create Replacements provider")) {
   147             try (InitTimer rt = timer("create Replacements provider")) {
   141                 replacements = createReplacements(p, snippetReflection, bytecodeProvider);
   148                 replacements = createReplacements(target, p, snippetReflection, bytecodeProvider);
   142             }
   149             }
   143             try (InitTimer rt = timer("create GraphBuilderPhase plugins")) {
   150             try (InitTimer rt = timer("create GraphBuilderPhase plugins")) {
   144                 plugins = createGraphBuilderPlugins(compilerConfiguration, config, target, constantReflection, foreignCalls, metaAccess, snippetReflection, replacements, wordTypes, options);
   151                 plugins = createGraphBuilderPlugins(graalRuntime, compilerConfiguration, config, target, constantReflection, foreignCalls, metaAccess, snippetReflection, replacements, wordTypes,
       
   152                                 options);
   145                 replacements.setGraphBuilderPlugins(plugins);
   153                 replacements.setGraphBuilderPlugins(plugins);
   146             }
   154             }
   147             try (InitTimer rt = timer("create Suites provider")) {
   155             try (InitTimer rt = timer("create Suites provider")) {
   148                 suites = createSuites(config, graalRuntime, compilerConfiguration, plugins, registers, replacements, options);
   156                 suites = createSuites(config, graalRuntime, compilerConfiguration, plugins, registers, replacements, options);
   149             }
   157             }
   150             providers = new HotSpotProviders(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, suites, registers,
   158             providers = new HotSpotProviders(metaAccess, codeCache, constantReflection, constantFieldProvider, foreignCalls, lowerer, replacements, suites, registers,
   151                             snippetReflection, wordTypes,
   159                             snippetReflection, wordTypes, plugins, gc);
   152                             plugins);
       
   153             replacements.setProviders(providers);
   160             replacements.setProviders(providers);
   154         }
   161         }
   155         try (InitTimer rt = timer("instantiate backend")) {
   162         try (InitTimer rt = timer("instantiate backend")) {
   156             return createBackend(config, graalRuntime, providers);
   163             return createBackend(config, graalRuntime, providers);
   157         }
   164         }
   158     }
   165     }
   159 
   166 
   160     protected Plugins createGraphBuilderPlugins(CompilerConfiguration compilerConfiguration, GraalHotSpotVMConfig config, TargetDescription target,
   167     protected Plugins createGraphBuilderPlugins(HotSpotGraalRuntimeProvider graalRuntime,
   161                     HotSpotConstantReflectionProvider constantReflection, HotSpotHostForeignCallsProvider foreignCalls, HotSpotMetaAccessProvider metaAccess,
   168                     CompilerConfiguration compilerConfiguration,
   162                     HotSpotSnippetReflectionProvider snippetReflection, HotSpotReplacementsImpl replacements, HotSpotWordTypes wordTypes, OptionValues options) {
   169                     GraalHotSpotVMConfig config,
   163         Plugins plugins = HotSpotGraphBuilderPlugins.create(compilerConfiguration, config, wordTypes, metaAccess, constantReflection, snippetReflection, foreignCalls, replacements, options);
   170                     TargetDescription target,
   164         AMD64GraphBuilderPlugins.register(plugins, replacements.getDefaultReplacementBytecodeProvider(), (AMD64) target.arch, false, JAVA_SPECIFICATION_VERSION >= 9, config.useFMAIntrinsics);
   171                     HotSpotConstantReflectionProvider constantReflection,
       
   172                     HotSpotHostForeignCallsProvider foreignCalls,
       
   173                     HotSpotMetaAccessProvider metaAccess,
       
   174                     HotSpotSnippetReflectionProvider snippetReflection,
       
   175                     HotSpotReplacementsImpl replacements,
       
   176                     HotSpotWordTypes wordTypes,
       
   177                     OptionValues options) {
       
   178         Plugins plugins = HotSpotGraphBuilderPlugins.create(
       
   179                         graalRuntime,
       
   180                         compilerConfiguration,
       
   181                         config,
       
   182                         wordTypes,
       
   183                         metaAccess,
       
   184                         constantReflection,
       
   185                         snippetReflection,
       
   186                         foreignCalls,
       
   187                         replacements,
       
   188                         options);
       
   189         AMD64GraphBuilderPlugins.register(plugins, replacements.getDefaultReplacementBytecodeProvider(), (AMD64) target.arch, false, JavaVersionUtil.JAVA_SPEC >= 9, config.useFMAIntrinsics);
   165         return plugins;
   190         return plugins;
   166     }
   191     }
   167 
   192 
   168     protected AMD64HotSpotBackend createBackend(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, HotSpotProviders providers) {
   193     protected AMD64HotSpotBackend createBackend(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, HotSpotProviders providers) {
   169         return new AMD64HotSpotBackend(config, runtime, providers);
   194         return new AMD64HotSpotBackend(config, runtime, providers);
   170     }
   195     }
   171 
   196 
   172     protected HotSpotRegistersProvider createRegisters() {
   197     protected HotSpotRegistersProvider createRegisters() {
   173         return new HotSpotRegisters(AMD64.r15, AMD64.r12, AMD64.rsp);
   198         return new HotSpotRegisters(AMD64.r15, AMD64.r12, AMD64.rsp);
   174     }
       
   175 
       
   176     protected HotSpotReplacementsImpl createReplacements(Providers p, SnippetReflectionProvider snippetReflection, BytecodeProvider bytecodeProvider) {
       
   177         return new HotSpotReplacementsImpl(p, snippetReflection, bytecodeProvider, p.getCodeCache().getTarget());
       
   178     }
   199     }
   179 
   200 
   180     protected AMD64HotSpotForeignCallsProvider createForeignCalls(HotSpotJVMCIRuntime jvmciRuntime, HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess,
   201     protected AMD64HotSpotForeignCallsProvider createForeignCalls(HotSpotJVMCIRuntime jvmciRuntime, HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess,
   181                     HotSpotCodeCacheProvider codeCache, WordTypes wordTypes, Value[] nativeABICallerSaveRegisters) {
   202                     HotSpotCodeCacheProvider codeCache, WordTypes wordTypes, Value[] nativeABICallerSaveRegisters) {
   182         return new AMD64HotSpotForeignCallsProvider(jvmciRuntime, runtime, metaAccess, codeCache, wordTypes, nativeABICallerSaveRegisters);
   203         return new AMD64HotSpotForeignCallsProvider(jvmciRuntime, runtime, metaAccess, codeCache, wordTypes, nativeABICallerSaveRegisters);
   187      */
   208      */
   188     protected HotSpotSuitesProvider createSuites(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, CompilerConfiguration compilerConfiguration, Plugins plugins,
   209     protected HotSpotSuitesProvider createSuites(GraalHotSpotVMConfig config, HotSpotGraalRuntimeProvider runtime, CompilerConfiguration compilerConfiguration, Plugins plugins,
   189                     HotSpotRegistersProvider registers, Replacements replacements, OptionValues options) {
   210                     HotSpotRegistersProvider registers, Replacements replacements, OptionValues options) {
   190         return new AddressLoweringHotSpotSuitesProvider(new AMD64HotSpotSuitesCreator(compilerConfiguration, plugins), config, runtime,
   211         return new AddressLoweringHotSpotSuitesProvider(new AMD64HotSpotSuitesCreator(compilerConfiguration, plugins), config, runtime,
   191                         new AddressLoweringPhase(new AMD64HotSpotAddressLowering(config, registers.getHeapBaseRegister(), options)));
   212                         new AddressLoweringPhase(new AMD64HotSpotAddressLowering(config, registers.getHeapBaseRegister(), options)));
   192     }
       
   193 
       
   194     protected HotSpotSnippetReflectionProvider createSnippetReflection(HotSpotGraalRuntimeProvider runtime, HotSpotConstantReflectionProvider constantReflection, WordTypes wordTypes) {
       
   195         return new HotSpotSnippetReflectionProvider(runtime, constantReflection, wordTypes);
       
   196     }
   213     }
   197 
   214 
   198     protected HotSpotLoweringProvider createLowerer(HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess, HotSpotForeignCallsProvider foreignCalls,
   215     protected HotSpotLoweringProvider createLowerer(HotSpotGraalRuntimeProvider runtime, HotSpotMetaAccessProvider metaAccess, HotSpotForeignCallsProvider foreignCalls,
   199                     HotSpotRegistersProvider registers, HotSpotConstantReflectionProvider constantReflection, TargetDescription target) {
   216                     HotSpotRegistersProvider registers, HotSpotConstantReflectionProvider constantReflection, TargetDescription target) {
   200         return new AMD64HotSpotLoweringProvider(runtime, metaAccess, foreignCalls, registers, constantReflection, target);
   217         return new AMD64HotSpotLoweringProvider(runtime, metaAccess, foreignCalls, registers, constantReflection, target);