hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntime.java
changeset 46344 694c102fd8ed
parent 43972 1ade39b8381b
child 46371 0337d0617e7b
--- a/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntime.java	Mon Dec 12 16:16:27 2016 +0300
+++ b/hotspot/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot/src/org/graalvm/compiler/hotspot/HotSpotGraalRuntime.java	Wed Mar 22 13:42:45 2017 -0700
@@ -22,22 +22,21 @@
  */
 package org.graalvm.compiler.hotspot;
 
+import static jdk.vm.ci.common.InitTimer.timer;
+import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime;
+import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayIndexScale;
 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
+import static org.graalvm.compiler.core.common.GraalOptions.HotSpotPrintInlining;
 import static org.graalvm.compiler.debug.GraalDebugConfig.areScopedGlobalMetricsEnabled;
 import static org.graalvm.compiler.debug.GraalDebugConfig.Options.DebugValueSummary;
 import static org.graalvm.compiler.debug.GraalDebugConfig.Options.Dump;
 import static org.graalvm.compiler.debug.GraalDebugConfig.Options.Log;
 import static org.graalvm.compiler.debug.GraalDebugConfig.Options.MethodFilter;
 import static org.graalvm.compiler.debug.GraalDebugConfig.Options.Verify;
-import static jdk.vm.ci.common.InitTimer.timer;
-import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntime.runtime;
-import static jdk.vm.ci.hotspot.HotSpotJVMCIRuntimeProvider.getArrayIndexScale;
 
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
+import java.util.ArrayList;
+import java.util.List;
 
-import org.graalvm.compiler.api.collections.CollectionsProvider;
 import org.graalvm.compiler.api.replacements.SnippetReflectionProvider;
 import org.graalvm.compiler.api.runtime.GraalRuntime;
 import org.graalvm.compiler.core.common.GraalOptions;
@@ -48,15 +47,18 @@
 import org.graalvm.compiler.debug.TTY;
 import org.graalvm.compiler.debug.internal.DebugValuesPrinter;
 import org.graalvm.compiler.debug.internal.method.MethodMetricsPrinter;
-import org.graalvm.compiler.graph.DefaultNodeCollectionsProvider;
-import org.graalvm.compiler.graph.NodeCollectionsProvider;
+import org.graalvm.compiler.hotspot.CompilationStatistics.Options;
 import org.graalvm.compiler.hotspot.CompilerConfigurationFactory.BackendMap;
 import org.graalvm.compiler.hotspot.debug.BenchmarkCounters;
 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
 import org.graalvm.compiler.nodes.spi.StampProvider;
+import org.graalvm.compiler.options.OptionValues;
 import org.graalvm.compiler.phases.tiers.CompilerConfiguration;
 import org.graalvm.compiler.replacements.SnippetCounter;
+import org.graalvm.compiler.replacements.SnippetCounter.Group;
 import org.graalvm.compiler.runtime.RuntimeProvider;
+import org.graalvm.util.EconomicMap;
+import org.graalvm.util.Equivalence;
 
 import jdk.vm.ci.code.Architecture;
 import jdk.vm.ci.code.stack.StackIntrospection;
@@ -87,27 +89,31 @@
 
     private final HotSpotBackend hostBackend;
     private DebugValuesPrinter debugValuesPrinter;
+    private final List<SnippetCounter.Group> snippetCounterGroups;
 
-    private final Map<Class<? extends Architecture>, HotSpotBackend> backends = new HashMap<>();
+    private final EconomicMap<Class<? extends Architecture>, HotSpotBackend> backends = EconomicMap.create(Equivalence.IDENTITY);
 
     private final GraalHotSpotVMConfig config;
 
+    private final OptionValues options;
+
     /**
      * @param compilerConfigurationFactory factory for the compiler configuration
-     *            {@link CompilerConfigurationFactory#selectFactory(String)}
+     *            {@link CompilerConfigurationFactory#selectFactory(String, OptionValues)}
      */
     @SuppressWarnings("try")
-    HotSpotGraalRuntime(HotSpotJVMCIRuntime jvmciRuntime, CompilerConfigurationFactory compilerConfigurationFactory) {
-
+    HotSpotGraalRuntime(HotSpotJVMCIRuntime jvmciRuntime, CompilerConfigurationFactory compilerConfigurationFactory, OptionValues initialOptions) {
         HotSpotVMConfigStore store = jvmciRuntime.getConfigStore();
-        config = GeneratePIC.getValue() ? new AOTGraalHotSpotVMConfig(store) : new GraalHotSpotVMConfig(store);
-        CompileTheWorldOptions.overrideWithNativeOptions(config);
+        config = GeneratePIC.getValue(initialOptions) ? new AOTGraalHotSpotVMConfig(store) : new GraalHotSpotVMConfig(store);
 
         // Only set HotSpotPrintInlining if it still has its default value (false).
-        if (GraalOptions.HotSpotPrintInlining.getValue() == false) {
-            GraalOptions.HotSpotPrintInlining.setValue(config.printInlining);
+        if (GraalOptions.HotSpotPrintInlining.getValue(initialOptions) == false && config.printInlining) {
+            options = new OptionValues(initialOptions, HotSpotPrintInlining, true);
+        } else {
+            options = initialOptions;
         }
 
+        snippetCounterGroups = GraalOptions.SnippetCounters.getValue(options) ? new ArrayList<>() : null;
         CompilerConfiguration compilerConfiguration = compilerConfigurationFactory.createCompilerConfiguration();
         BackendMap backendMap = compilerConfigurationFactory.createBackendMap();
 
@@ -136,16 +142,16 @@
             }
         }
 
-        if (Log.getValue() == null && !areScopedGlobalMetricsEnabled() && Dump.getValue() == null && Verify.getValue() == null) {
-            if (MethodFilter.getValue() != null && !Debug.isEnabled()) {
+        if (Log.getValue(options) == null && !areScopedGlobalMetricsEnabled(options) && Dump.getValue(options) == null && Verify.getValue(options) == null) {
+            if (MethodFilter.getValue(options) != null && !Debug.isEnabled()) {
                 TTY.println("WARNING: Ignoring MethodFilter option since Log, Meter, Time, TrackMemUse, Dump and Verify options are all null");
             }
         }
 
         if (Debug.isEnabled()) {
-            DebugEnvironment.initialize(TTY.out, hostBackend.getProviders().getSnippetReflection());
+            DebugEnvironment.ensureInitialized(options, hostBackend.getProviders().getSnippetReflection());
 
-            String summary = DebugValueSummary.getValue();
+            String summary = DebugValueSummary.getValue(options);
             if (summary != null) {
                 switch (summary) {
                     case "Name":
@@ -160,12 +166,12 @@
         }
 
         if (Debug.areUnconditionalCountersEnabled() || Debug.areUnconditionalTimersEnabled() || Debug.areUnconditionalMethodMetricsEnabled() ||
-                        (Debug.isEnabled() && areScopedGlobalMetricsEnabled()) || (Debug.isEnabled() && Debug.isMethodFilteringEnabled())) {
+                        (Debug.isEnabled() && areScopedGlobalMetricsEnabled(options)) || (Debug.isEnabled() && Debug.isMethodFilteringEnabled())) {
             // This must be created here to avoid loading the DebugValuesPrinter class
             // during shutdown() which in turn can cause a deadlock
             int mmPrinterType = 0;
-            mmPrinterType |= MethodMetricsPrinter.Options.MethodMeterPrintAscii.getValue() ? 1 : 0;
-            mmPrinterType |= MethodMetricsPrinter.Options.MethodMeterFile.getValue() != null ? 2 : 0;
+            mmPrinterType |= MethodMetricsPrinter.Options.MethodMeterPrintAscii.getValue(options) ? 1 : 0;
+            mmPrinterType |= MethodMetricsPrinter.Options.MethodMeterFile.getValue(options) != null ? 2 : 0;
             switch (mmPrinterType) {
                 case 0:
                     debugValuesPrinter = new DebugValuesPrinter();
@@ -188,17 +194,17 @@
 
         // Complete initialization of backends
         try (InitTimer st = timer(hostBackend.getTarget().arch.getName(), ".completeInitialization")) {
-            hostBackend.completeInitialization(jvmciRuntime);
+            hostBackend.completeInitialization(jvmciRuntime, options);
         }
-        for (HotSpotBackend backend : backends.values()) {
+        for (HotSpotBackend backend : backends.getValues()) {
             if (backend != hostBackend) {
                 try (InitTimer st = timer(backend.getTarget().arch.getName(), ".completeInitialization")) {
-                    backend.completeInitialization(jvmciRuntime);
+                    backend.completeInitialization(jvmciRuntime, options);
                 }
             }
         }
 
-        BenchmarkCounters.initialize(jvmciRuntime);
+        BenchmarkCounters.initialize(jvmciRuntime, options);
 
         assert checkArrayIndexScaleInvariants();
 
@@ -224,19 +230,32 @@
     }
 
     @Override
+    public OptionValues getOptions() {
+        return options;
+    }
+
+    @Override
+    public Group createSnippetCounterGroup(String name) {
+        if (snippetCounterGroups != null) {
+            Group group = new Group(name);
+            snippetCounterGroups.add(group);
+            return group;
+        }
+        return null;
+    }
+
+    @Override
     public String getName() {
         return getClass().getSimpleName();
     }
 
-    private final NodeCollectionsProvider nodeCollectionsProvider = new DefaultNodeCollectionsProvider();
-
     @SuppressWarnings("unchecked")
     @Override
     public <T> T getCapability(Class<T> clazz) {
         if (clazz == RuntimeProvider.class) {
             return (T) this;
-        } else if (clazz == CollectionsProvider.class || clazz == NodeCollectionsProvider.class) {
-            return (T) nodeCollectionsProvider;
+        } else if (clazz == OptionValues.class) {
+            return (T) options;
         } else if (clazz == StackIntrospection.class) {
             return (T) this;
         } else if (clazz == SnippetReflectionProvider.class) {
@@ -258,10 +277,6 @@
         return backends.get(arch);
     }
 
-    public Map<Class<? extends Architecture>, HotSpotBackend> getBackends() {
-        return Collections.unmodifiableMap(backends);
-    }
-
     private long runtimeStartTime;
 
     /**
@@ -269,18 +284,24 @@
      *
      * @param phase the execution phase being entered
      */
-    static void phaseTransition(String phase) {
-        CompilationStatistics.clear(phase);
+    void phaseTransition(String phase) {
+        if (Options.UseCompilationStatistics.getValue(options)) {
+            CompilationStatistics.clear(phase);
+        }
     }
 
     void shutdown() {
         if (debugValuesPrinter != null) {
-            debugValuesPrinter.printDebugValues();
+            debugValuesPrinter.printDebugValues(options);
         }
         phaseTransition("final");
 
-        SnippetCounter.printGroups(TTY.out().out());
-        BenchmarkCounters.shutdown(runtime(), runtimeStartTime);
+        if (snippetCounterGroups != null) {
+            for (Group group : snippetCounterGroups) {
+                TTY.out().out().println(group);
+            }
+        }
+        BenchmarkCounters.shutdown(runtime(), options, runtimeStartTime);
     }
 
     void clearMeters() {