From 8debd00eb50c2d67f7ac40d7d609e0fae3d2a98a Mon Sep 17 00:00:00 2001 From: Christian Wirth Date: Mon, 2 Jun 2025 16:40:04 +0200 Subject: [PATCH] use EconomicMap and EconomicSet in Native Image --- .../org.graalvm.collections/snapshot.sigtest | 2 ++ .../org/graalvm/collections/EconomicMap.java | 20 ++++++++++++++++++- .../org/graalvm/collections/EconomicSet.java | 16 +++++++++++++-- .../graal/pointsto/flow/MethodFlowsGraph.java | 2 +- .../flow/builder/TypeFlowBuilder.java | 16 +++++++-------- .../oracle/svm/agent/NativeImageAgent.java | 7 +++---- .../svm/common/option/CommonOptionParser.java | 19 +++++++++--------- .../IntentionallyUnsupportedOptions.java | 6 ++---- .../svm/configure/ConfigurationParser.java | 14 ++++++------- .../command/ConfigurationGenerateCommand.java | 7 +++---- ...figurationGenerateConditionalsCommand.java | 9 ++++----- .../configure/filters/ModuleFilterTools.java | 11 +++++----- .../SubstrateAArch64RegisterConfig.java | 5 ++--- .../amd64/SubstrateAMD64RegisterConfig.java | 5 ++--- .../oracle/svm/core/VMInspectionOptions.java | 20 ++++++++++--------- .../graal/meta/SubstrateReplacements.java | 13 ++++++------ .../core/hub/PredefinedClassesSupport.java | 9 ++++----- 17 files changed, 101 insertions(+), 80 deletions(-) diff --git a/sdk/src/org.graalvm.collections/snapshot.sigtest b/sdk/src/org.graalvm.collections/snapshot.sigtest index e5fb9ae3095a..8e250e8e9857 100644 --- a/sdk/src/org.graalvm.collections/snapshot.sigtest +++ b/sdk/src/org.graalvm.collections/snapshot.sigtest @@ -128,6 +128,7 @@ meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> or meth public static <%0 extends java.lang.Object, %1 extends java.lang.Object> org.graalvm.collections.MapCursor<{%%0},{%%1}> emptyCursor() meth public void putAll(org.graalvm.collections.EconomicMap<{org.graalvm.collections.EconomicMap%0},{org.graalvm.collections.EconomicMap%1}>) meth public void putAll(org.graalvm.collections.UnmodifiableEconomicMap) +meth public {org.graalvm.collections.EconomicMap%1} computeIfAbsent({org.graalvm.collections.EconomicMap%0},java.util.function.Function) meth public {org.graalvm.collections.EconomicMap%1} putIfAbsent({org.graalvm.collections.EconomicMap%0},{org.graalvm.collections.EconomicMap%1}) CLSS public final org.graalvm.collections.EconomicMapUtil @@ -163,6 +164,7 @@ meth public abstract void clear() meth public abstract void remove({org.graalvm.collections.EconomicSet%0}) meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create() meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(int) +meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(java.lang.Iterable<{%%0}>) meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(org.graalvm.collections.Equivalence) meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(org.graalvm.collections.Equivalence,int) meth public static <%0 extends java.lang.Object> org.graalvm.collections.EconomicSet<{%%0}> create(org.graalvm.collections.Equivalence,org.graalvm.collections.UnmodifiableEconomicSet<{%%0}>) diff --git a/sdk/src/org.graalvm.collections/src/org/graalvm/collections/EconomicMap.java b/sdk/src/org.graalvm.collections/src/org/graalvm/collections/EconomicMap.java index e0b2029cbb48..1a05e265ee09 100644 --- a/sdk/src/org.graalvm.collections/src/org/graalvm/collections/EconomicMap.java +++ b/sdk/src/org.graalvm.collections/src/org/graalvm/collections/EconomicMap.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2022, Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017, 2025, Oracle and/or its affiliates. All rights reserved. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. * * The Universal Permissive License (UPL), Version 1.0 @@ -42,6 +42,7 @@ import java.util.Map; import java.util.function.BiFunction; +import java.util.function.Function; /** * Memory efficient map data structure that dynamically changes its representation depending on the @@ -281,4 +282,21 @@ static EconomicMap of(K key1, V value1, K key2, V value2) { map.put(key2, value2); return map; } + + /** + * If the specified key is not already associated with a value (or is mapped to {@code null}), + * attempts to compute its value using the given mapping function and enters it into this map + * unless {@code null}. + * + * @since 25.1 + */ + default V computeIfAbsent(K key, Function mappingFunction) { + V value = get(key); + if (value == null) { + value = mappingFunction.apply(key); + put(key, value); + } + return value; + } + } diff --git a/sdk/src/org.graalvm.collections/src/org/graalvm/collections/EconomicSet.java b/sdk/src/org.graalvm.collections/src/org/graalvm/collections/EconomicSet.java index d247b3912ce1..8e049d731d22 100644 --- a/sdk/src/org.graalvm.collections/src/org/graalvm/collections/EconomicSet.java +++ b/sdk/src/org.graalvm.collections/src/org/graalvm/collections/EconomicSet.java @@ -167,8 +167,7 @@ static EconomicSet create(Equivalence strategy) { /** * Creates a new set guaranteeing insertion order when iterating over its elements with the - * default {@link Equivalence#DEFAULT} comparison strategy and inserts all elements of the - * specified collection. + * default {@link Equivalence#DEFAULT} comparison strategy. * * @since 19.0 */ @@ -207,6 +206,19 @@ static EconomicSet create(Equivalence strategy, UnmodifiableEconomicSet EconomicSet create(Iterable c) { + EconomicSet set = create(); + set.addAll(c); + return set; + } + /** * Return an empty, unmodifiable {@link EconomicSet}. * diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/MethodFlowsGraph.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/MethodFlowsGraph.java index b5527168241a..9373271a0658 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/MethodFlowsGraph.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/MethodFlowsGraph.java @@ -178,7 +178,7 @@ public final Iterable> flows() { private Iterator> flowsIterator() { return new Iterator<>() { final Deque> worklist = new ArrayDeque<>(); - final Set> seen = new HashSet<>(); + final Set> seen = new HashSet<>(); // no EconomicSet, null key is used TypeFlow next; { diff --git a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/builder/TypeFlowBuilder.java b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/builder/TypeFlowBuilder.java index 977b052b3158..221347c6846f 100644 --- a/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/builder/TypeFlowBuilder.java +++ b/substratevm/src/com.oracle.graal.pointsto/src/com/oracle/graal/pointsto/flow/builder/TypeFlowBuilder.java @@ -24,10 +24,7 @@ */ package com.oracle.graal.pointsto.flow.builder; -import java.util.Collection; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.function.Supplier; import com.oracle.graal.pointsto.PointsToAnalysis; @@ -39,6 +36,7 @@ import com.oracle.graal.pointsto.typestate.PointsToStats; import jdk.graal.compiler.phases.common.LazyValue; +import org.graalvm.collections.EconomicSet; /** * The type flow builder is a node in the type flow builder graph. The {@link #useDependencies} and @@ -90,9 +88,9 @@ private static boolean checkPredicate(PointsToAnalysis bb, Class clazz, Objec private final Class flowClass; private final LazyValue lazyTypeFlowCreator; /** Input dependency, i.e., builders that have this builder as an use. */ - private final Set> useDependencies; + private final EconomicSet> useDependencies; /** Input dependency, i.e., builders that have this builder as an observer. */ - private final Set> observerDependencies; + private final EconomicSet> observerDependencies; private boolean buildingAnActualParameter; private boolean isMaterialized; @@ -107,8 +105,8 @@ private TypeFlowBuilder(Object source, Object predicate, Class flowClass, Laz this.flowClass = flowClass; this.source = source; this.lazyTypeFlowCreator = creator; - this.useDependencies = new HashSet<>(); - this.observerDependencies = new HashSet<>(); + this.useDependencies = EconomicSet.create(); + this.observerDependencies = EconomicSet.create(); this.buildingAnActualParameter = false; this.isMaterialized = false; this.predicate = predicate; @@ -138,7 +136,7 @@ public void addUseDependency(TypeFlowBuilder dependency) { this.useDependencies.add(dependency); } - Collection> getUseDependencies() { + Iterable> getUseDependencies() { return useDependencies; } @@ -146,7 +144,7 @@ public void addObserverDependency(TypeFlowBuilder dependency) { this.observerDependencies.add(dependency); } - Collection> getObserverDependencies() { + Iterable> getObserverDependencies() { return observerDependencies; } diff --git a/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgent.java b/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgent.java index e8f2971d4c7d..f260fa59821d 100644 --- a/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgent.java +++ b/substratevm/src/com.oracle.svm.agent/src/com/oracle/svm/agent/NativeImageAgent.java @@ -47,9 +47,7 @@ import java.util.Arrays; import java.util.ConcurrentModificationException; import java.util.Date; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.TimeZone; import java.util.concurrent.ScheduledThreadPoolExecutor; import java.util.concurrent.TimeUnit; @@ -57,6 +55,7 @@ import java.util.function.Predicate; import java.util.function.Supplier; +import org.graalvm.collections.EconomicSet; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.ProcessProperties; import org.graalvm.nativeimage.hosted.Feature; @@ -109,7 +108,7 @@ public final class NativeImageAgent extends JvmtiAgentBase classPathEntries; + EconomicSet classPathEntries; private static String getTokenValue(String token) { return token.substring(token.indexOf('=') + 1); @@ -287,7 +286,7 @@ protected int onLoadCallback(JNIJavaVM vm, JvmtiEnv jvmti, JvmtiEventCallbacks c return error(USAGE_ERROR, "The agent can generate conditional configuration either for the current run or in the partial mode but not both at the same time."); } - classPathEntries = new HashSet<>(Arrays.asList(getClasspathEntries(jvmti))); + classPathEntries = EconomicSet.create(Arrays.asList(getClasspathEntries(jvmti))); boolean isConditionalConfigurationRun = !conditionalConfigUserPackageFilterFiles.isEmpty() || conditionalConfigPartialRun; boolean shouldTraceOriginInformation = configurationWithOrigins || isConditionalConfigurationRun; diff --git a/substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/CommonOptionParser.java b/substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/CommonOptionParser.java index 1e569e8eb27e..7aa5f6146389 100644 --- a/substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/CommonOptionParser.java +++ b/substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/CommonOptionParser.java @@ -32,9 +32,7 @@ import java.util.Arrays; import java.util.Comparator; import java.util.EnumSet; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.function.Consumer; import java.util.function.Predicate; @@ -70,13 +68,13 @@ public class CommonOptionParser { */ public static final class OptionParseResult { private final EnumSet printFlags; - private final Set optionNameFilter; + private final EconomicSet optionNameFilter; private final String error; private final OptionKey optionKey; private final boolean optionUnrecognized; private static final String EXTRA_HELP_OPTIONS_WILDCARD = "*"; - OptionParseResult(EnumSet printFlags, String error, Set optionNameFilter, OptionKey optionKey, boolean optionUnrecognized) { + OptionParseResult(EnumSet printFlags, String error, EconomicSet optionNameFilter, OptionKey optionKey, boolean optionUnrecognized) { this.printFlags = printFlags; this.error = error; this.optionNameFilter = optionNameFilter; @@ -85,7 +83,7 @@ public static final class OptionParseResult { } private OptionParseResult(EnumSet printFlags, String error, OptionKey optionKey) { - this(printFlags, error, new HashSet<>(), optionKey, false); + this(printFlags, error, EconomicSet.create(), optionKey, false); } static OptionParseResult error(String message) { @@ -93,7 +91,7 @@ static OptionParseResult error(String message) { } static OptionParseResult optionUnrecognizedError(String message) { - return new OptionParseResult(EnumSet.noneOf(OptionType.class), message, new HashSet<>(), null, true); + return new OptionParseResult(EnumSet.noneOf(OptionType.class), message, EconomicSet.create(), null, true); } static OptionParseResult correct(OptionKey optionKey) { @@ -104,10 +102,10 @@ static OptionParseResult printFlags(EnumSet selectedOptionTypes) { return new OptionParseResult(selectedOptionTypes, null, null); } - static OptionParseResult printFlagsWithExtraHelp(Set optionNameFilter) { - Set optionNames = optionNameFilter; + static OptionParseResult printFlagsWithExtraHelp(EconomicSet optionNameFilter) { + EconomicSet optionNames = optionNameFilter; if (optionNames.contains(EXTRA_HELP_OPTIONS_WILDCARD)) { - optionNames = new HashSet<>(); + optionNames = EconomicSet.create(); optionNames.add(EXTRA_HELP_OPTIONS_WILDCARD); } return new OptionParseResult(EnumSet.noneOf(OptionType.class), null, optionNames, null, false); @@ -292,7 +290,8 @@ public static OptionParseResult parseOption(EconomicMap selectedOptionNames = new HashSet<>(Arrays.asList(optionNames)); + EconomicSet selectedOptionNames = EconomicSet.create(); + selectedOptionNames.addAll(Arrays.asList(optionNames)); return OptionParseResult.printFlagsWithExtraHelp(selectedOptionNames); } return OptionParseResult.correct(optionKey); diff --git a/substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/IntentionallyUnsupportedOptions.java b/substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/IntentionallyUnsupportedOptions.java index deb8df3c7a15..8020a031e27a 100644 --- a/substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/IntentionallyUnsupportedOptions.java +++ b/substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/IntentionallyUnsupportedOptions.java @@ -24,12 +24,10 @@ */ package com.oracle.svm.common.option; -import java.util.HashSet; -import java.util.Set; - import jdk.graal.compiler.core.common.util.CompilationAlarm; import jdk.graal.compiler.hotspot.CompilerConfigurationFactory; import jdk.graal.compiler.options.OptionKey; +import org.graalvm.collections.EconomicSet; /** * Native image uses its own mechanisms to handle certain options, resulting in some Graal options @@ -39,7 +37,7 @@ */ public final class IntentionallyUnsupportedOptions { - private static final Set> unsupportedOptions = new HashSet<>(); + private static final EconomicSet> unsupportedOptions = EconomicSet.create(); static { unsupportedOptions.add(CompilerConfigurationFactory.Options.CompilerConfiguration); diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java index a98591503586..0ca6a715587d 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/ConfigurationParser.java @@ -37,14 +37,12 @@ import java.util.Collections; import java.util.Comparator; import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Optional; import java.util.Set; import org.graalvm.collections.EconomicMap; +import org.graalvm.collections.EconomicSet; import org.graalvm.nativeimage.ImageInfo; import com.oracle.svm.util.LogUtils; @@ -83,7 +81,7 @@ public static InputStream openStream(URI uri) throws IOException { public static final String MODULE_KEY = "module"; public static final String GLOB_KEY = "glob"; public static final String BUNDLE_KEY = "bundle"; - private final Map> seenUnknownAttributesByType = new HashMap<>(); + private final EconomicMap> seenUnknownAttributesByType = EconomicMap.create(); private final EnumSet parserOptions; protected ConfigurationParser(EnumSet parserOptions) { @@ -149,14 +147,15 @@ public static EconomicMap asMap(Object data, String errorMessage } protected void checkAttributes(EconomicMap map, String type, Collection requiredAttrs, Collection optionalAttrs) { - Set unseenRequired = new HashSet<>(requiredAttrs); + EconomicSet unseenRequired = EconomicSet.create(); + unseenRequired.addAll(requiredAttrs); for (String key : map.getKeys()) { unseenRequired.remove(key); } if (!unseenRequired.isEmpty()) { throw new JsonParserException("Missing attribute(s) [" + String.join(", ", unseenRequired) + "] in " + type); } - Set unknownAttributes = new HashSet<>(); + EconomicSet unknownAttributes = EconomicSet.create(); for (String key : map.getKeys()) { unknownAttributes.add(key); } @@ -170,7 +169,8 @@ protected void checkAttributes(EconomicMap map, String type, Col if (unknownAttributes.size() > 0) { String message = "Unknown attribute(s) [" + String.join(", ", unknownAttributes) + "] in " + type; warnOrFailOnSchemaError(message); - Set unknownAttributesForType = seenUnknownAttributesByType.computeIfAbsent(type, key -> new HashSet<>()); + + EconomicSet unknownAttributesForType = seenUnknownAttributesByType.computeIfAbsent(type, key -> EconomicSet.create()); unknownAttributesForType.addAll(unknownAttributes); } } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateCommand.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateCommand.java index 37927730cd4e..88a5c98b9255 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateCommand.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateCommand.java @@ -32,10 +32,8 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; -import java.util.HashSet; import java.util.Iterator; import java.util.List; -import java.util.Set; import java.util.function.Predicate; import com.oracle.svm.configure.ConfigurationUsageException; @@ -50,6 +48,7 @@ import com.oracle.svm.util.LogUtils; import jdk.graal.compiler.phases.common.LazyValue; +import org.graalvm.collections.EconomicSet; public class ConfigurationGenerateCommand extends ConfigurationCommand { @Override @@ -310,11 +309,11 @@ private static void parseFilterFiles(ComplexFilter filter, List filterFiles @SuppressWarnings("fallthrough") private static void failIfAgentLockFilesPresent(ConfigurationFileCollection... collections) { - Set paths = null; + EconomicSet paths = null; for (ConfigurationFileCollection coll : collections) { for (URI path : coll.getDetectedAgentLockPaths()) { if (paths == null) { - paths = new HashSet<>(); + paths = EconomicSet.create(); } paths.add(path.toString()); } diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateConditionalsCommand.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateConditionalsCommand.java index 43d051d5bca6..fe28951c778f 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateConditionalsCommand.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/command/ConfigurationGenerateConditionalsCommand.java @@ -29,9 +29,7 @@ import java.net.URI; import java.nio.file.Files; import java.nio.file.Path; -import java.util.HashSet; import java.util.Iterator; -import java.util.Set; import com.oracle.svm.configure.ConfigurationUsageException; import com.oracle.svm.configure.config.ConfigurationSet; @@ -44,6 +42,7 @@ import com.oracle.svm.configure.filters.FilterConfigurationParser; import com.oracle.svm.configure.filters.HierarchyFilterNode; import com.oracle.svm.configure.ConfigurationFile; +import org.graalvm.collections.EconomicSet; public final class ConfigurationGenerateConditionalsCommand extends ConfigurationCommand { @Override @@ -53,10 +52,10 @@ public String getName() { @Override public void apply(Iterator argumentsIterator) throws IOException { - Set configInputPaths = new HashSet<>(); - Set configOutputPaths = new HashSet<>(); + EconomicSet configInputPaths = EconomicSet.create(); + EconomicSet configOutputPaths = EconomicSet.create(); URI userCodeFilterUri = null; - Set classNameFiltersUri = new HashSet<>(); + EconomicSet classNameFiltersUri = EconomicSet.create(); while (argumentsIterator.hasNext()) { String argument = argumentsIterator.next(); String[] optionValue = argument.split(OPTION_VALUE_SEP); diff --git a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/ModuleFilterTools.java b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/ModuleFilterTools.java index 019b8c3e194a..59bb2628bc57 100644 --- a/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/ModuleFilterTools.java +++ b/substratevm/src/com.oracle.svm.configure/src/com/oracle/svm/configure/filters/ModuleFilterTools.java @@ -25,18 +25,17 @@ package com.oracle.svm.configure.filters; import java.lang.module.ModuleDescriptor; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; +import java.util.Arrays; import com.oracle.svm.configure.filters.ConfigurationFilter.Inclusion; import com.oracle.svm.util.LogUtils; +import org.graalvm.collections.EconomicSet; public class ModuleFilterTools { public static HierarchyFilterNode generateFromModules(String[] moduleNames, Inclusion rootInclusion, Inclusion exportedInclusion, Inclusion unexportedInclusion, boolean reduce) { - Set includedModuleNameSet = new HashSet<>(); - Collections.addAll(includedModuleNameSet, moduleNames); + EconomicSet includedModuleNameSet = EconomicSet.create(); + includedModuleNameSet.addAll(Arrays.asList(moduleNames)); for (Module module : ModuleLayer.boot().modules()) { if (includedModuleNameSet.contains(module.getName())) { checkDependencies(module, includedModuleNameSet); @@ -56,7 +55,7 @@ public static HierarchyFilterNode generateFromModules(String[] moduleNames, Incl return rootNode; } - private static void checkDependencies(Module module, Set includedModuleNames) { + private static void checkDependencies(Module module, EconomicSet includedModuleNames) { for (ModuleDescriptor.Requires require : module.getDescriptor().requires()) { if (!includedModuleNames.contains(require.name())) { LogUtils.warning("Dependency missing from input set of modules: " + module.getName() + " -> " + require.name()); diff --git a/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64RegisterConfig.java b/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64RegisterConfig.java index e5cb5c82833a..8e49d2cb5c75 100755 --- a/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64RegisterConfig.java +++ b/substratevm/src/com.oracle.svm.core.graal.aarch64/src/com/oracle/svm/core/graal/aarch64/SubstrateAArch64RegisterConfig.java @@ -67,10 +67,9 @@ import static jdk.vm.ci.aarch64.AArch64.zr; import java.util.ArrayList; -import java.util.HashSet; import java.util.List; -import java.util.Set; +import org.graalvm.collections.EconomicSet; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.impl.InternalPlatform; @@ -386,7 +385,7 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT } } } else { - Set usedRegisters = new HashSet<>(); + EconomicSet usedRegisters = EconomicSet.create(); VMError.guarantee(parameterTypes.length == type.fixedParameterAssignment.length, "Parameters/assignments size mismatch."); for (int i = firstActualArgument; i < locations.length; i++) { diff --git a/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64RegisterConfig.java b/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64RegisterConfig.java index 7ae077043f4b..e22671551a07 100644 --- a/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64RegisterConfig.java +++ b/substratevm/src/com.oracle.svm.core.graal.amd64/src/com/oracle/svm/core/graal/amd64/SubstrateAMD64RegisterConfig.java @@ -69,10 +69,9 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.HashSet; import java.util.List; -import java.util.Set; +import org.graalvm.collections.EconomicSet; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.impl.InternalPlatform; @@ -379,7 +378,7 @@ public CallingConvention getCallingConvention(Type t, JavaType returnType, JavaT } } else { final int baseStackOffset = currentStackOffset; - Set usedRegisters = new HashSet<>(); + EconomicSet usedRegisters = EconomicSet.create(); VMError.guarantee(parameterTypes.length == type.fixedParameterAssignment.length, "Parameters/assignments size mismatch."); for (int i = firstActualArgument; i < locations.length; i++) { diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/VMInspectionOptions.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/VMInspectionOptions.java index 97beff946992..91e346a35f77 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/VMInspectionOptions.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/VMInspectionOptions.java @@ -27,11 +27,11 @@ import static com.oracle.svm.core.jvmstat.PerfManager.Options.PerfDataMemoryMappedFile; import java.io.IOException; -import java.util.HashSet; import java.util.List; import java.util.Set; import org.graalvm.collections.EconomicMap; +import org.graalvm.collections.EconomicSet; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; import org.graalvm.nativeimage.impl.InternalPlatform.WINDOWS_BASE; @@ -66,8 +66,9 @@ public final class VMInspectionOptions { private static final Set MONITORING_ALL_VALUES = Set.of(MONITORING_HEAPDUMP_NAME, MONITORING_JFR_NAME, MONITORING_JVMSTAT_NAME, MONITORING_JMXCLIENT_NAME, MONITORING_JMXSERVER_NAME, MONITORING_THREADDUMP_NAME, MONITORING_NMT_NAME, MONITORING_JCMD_NAME, MONITORING_ALL_NAME, MONITORING_DEFAULT_NAME); - private static final List NOT_SUPPORTED_ON_WINDOWS = List.of(MONITORING_HEAPDUMP_NAME, MONITORING_JFR_NAME, MONITORING_JVMSTAT_NAME, MONITORING_JMXCLIENT_NAME, MONITORING_JMXSERVER_NAME, - MONITORING_JCMD_NAME); + private static final EconomicSet NOT_SUPPORTED_ON_WINDOWS = EconomicSet + .create(List.of(MONITORING_HEAPDUMP_NAME, MONITORING_JFR_NAME, MONITORING_JVMSTAT_NAME, MONITORING_JMXCLIENT_NAME, MONITORING_JMXSERVER_NAME, + MONITORING_JCMD_NAME)); private static final String MONITORING_ALLOWED_VALUES_TEXT = "" + "'" + MONITORING_HEAPDUMP_NAME + "'" + @@ -107,7 +108,7 @@ private static void notSupportedOnWindows(HostedOptionKey optionKey) { @Platforms(Platform.HOSTED_ONLY.class) public static void validateEnableMonitoringFeatures(@SuppressWarnings("unused") OptionKey optionKey) { - Set enabledFeatures = getEnabledMonitoringFeatures(); + EconomicSet enabledFeatures = getEnabledMonitoringFeatures(); if (enabledFeatures.contains(MONITORING_DEFAULT_NAME)) { LogUtils.warning( "'%s' without an argument is deprecated. Please always explicitly specify the list of monitoring features to be enabled (for example, '%s').", @@ -122,13 +123,12 @@ public static void validateEnableMonitoringFeatures(@SuppressWarnings("unused") } if (Platform.includedIn(WINDOWS_BASE.class)) { - Set notSupported = getEnabledMonitoringFeatures(); + EconomicSet notSupported = getEnabledMonitoringFeatures(); notSupported.retainAll(NOT_SUPPORTED_ON_WINDOWS); if (!PerfDataMemoryMappedFile.getValue()) { /* Only not supported on Windows, if a memory-mapped file is needed. */ notSupported.remove(MONITORING_JVMSTAT_NAME); } - if (!notSupported.isEmpty()) { String msg = String.format("the option '%s' contains value(s) that are not supported on Windows: %s. Those values will be ignored.", getDefaultMonitoringCommandArgument(), String.join(", ", notSupported)); @@ -154,12 +154,14 @@ public static String getJfrNotSupportedMessage() { SubstrateOptionsParser.commandArgument(EnableMonitoringFeatures, MONITORING_JFR_NAME) + "'."; } - private static Set getEnabledMonitoringFeatures() { - return new HashSet<>(EnableMonitoringFeatures.getValue().values()); + private static EconomicSet getEnabledMonitoringFeatures() { + EconomicSet set = EconomicSet.create(); + set.addAll(EnableMonitoringFeatures.getValue().values()); + return set; } private static boolean hasAllOrKeywordMonitoringSupport(String keyword) { - Set enabledFeatures = getEnabledMonitoringFeatures(); + EconomicSet enabledFeatures = getEnabledMonitoringFeatures(); return enabledFeatures.contains(MONITORING_ALL_NAME) || enabledFeatures.contains(MONITORING_DEFAULT_NAME) || enabledFeatures.contains(keyword); } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/SubstrateReplacements.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/SubstrateReplacements.java index 9e3f1d4689b3..9de9e3447a7d 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/SubstrateReplacements.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/graal/meta/SubstrateReplacements.java @@ -35,14 +35,13 @@ import java.util.Collection; import java.util.Deque; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import jdk.graal.compiler.nodes.NodeClassMap; +import org.graalvm.collections.EconomicSet; import org.graalvm.nativeimage.AnnotationAccess; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; @@ -112,15 +111,15 @@ protected static class Builder { protected final GraphMakerFactory graphMakerFactory; protected final Map graphs; protected final Deque deferred; - protected final HashSet registered; - protected final Set delayedInvocationPluginMethods; + protected final EconomicSet registered; + protected final EconomicSet delayedInvocationPluginMethods; protected Builder(GraphMakerFactory graphMakerFactory) { this.graphMakerFactory = graphMakerFactory; this.graphs = new HashMap<>(); this.deferred = new ArrayDeque<>(); - this.registered = new HashSet<>(); - this.delayedInvocationPluginMethods = new HashSet<>(); + this.registered = EconomicSet.create(); + this.delayedInvocationPluginMethods = EconomicSet.create(); } } @@ -301,7 +300,7 @@ public void run() { } @Platforms(Platform.HOSTED_ONLY.class) - public Set getDelayedInvocationPluginMethods() { + public EconomicSet getDelayedInvocationPluginMethods() { return builder.delayedInvocationPluginMethods; } diff --git a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/PredefinedClassesSupport.java b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/PredefinedClassesSupport.java index 49c15297f098..ce1cff7098a3 100644 --- a/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/PredefinedClassesSupport.java +++ b/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/hub/PredefinedClassesSupport.java @@ -42,12 +42,11 @@ import java.lang.constant.ClassDesc; import java.lang.reflect.Method; import java.security.ProtectionDomain; -import java.util.HashSet; -import java.util.Set; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; import org.graalvm.collections.EconomicMap; +import org.graalvm.collections.EconomicSet; import org.graalvm.nativeimage.ImageSingletons; import org.graalvm.nativeimage.Platform; import org.graalvm.nativeimage.Platforms; @@ -95,7 +94,7 @@ static PredefinedClassesSupport singleton() { } @Platforms(Platform.HOSTED_ONLY.class) // - private final Set> predefinedClasses = new HashSet<>(); + private final EconomicSet> predefinedClasses = EconomicSet.create(); private final ReentrantLock lock = new ReentrantLock(); @@ -299,8 +298,8 @@ private Class getLoaded(String name) { @Platforms(Platform.HOSTED_ONLY.class) public static class TestingBackdoor { - public static Set> getConfigurationPredefinedClasses() { - Set> set = new HashSet<>(); + public static EconomicSet> getConfigurationPredefinedClasses() { + EconomicSet> set = EconomicSet.create(); for (Class clazz : singleton().predefinedClassesByHash.getValues()) { set.add(clazz); }