Skip to content

Commit a477a6d

Browse files
committed
[GR-42693] First draft of native-image bundle support.
PullRequest: graal/13289
2 parents 43db4c7 + de68a51 commit a477a6d

File tree

43 files changed

+1573
-528
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1573
-528
lines changed

compiler/mx.compiler/suite.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2039,7 +2039,7 @@
20392039
"org.graalvm.compiler.truffle.jfr to jdk.internal.vm.compiler.truffle.jfr",
20402040
"org.graalvm.libgraal to jdk.internal.vm.compiler.management",
20412041
"org.graalvm.util to jdk.internal.vm.compiler.management",
2042-
"org.graalvm.util.json to org.graalvm.nativeimage.librarysupport,org.graalvm.nativeimage.agent.tracing,org.graalvm.nativeimage.configure",
2042+
"org.graalvm.util.json to org.graalvm.nativeimage.librarysupport,org.graalvm.nativeimage.agent.tracing,org.graalvm.nativeimage.configure,org.graalvm.nativeimage.driver",
20432043
],
20442044
"uses" : [
20452045
"com.oracle.truffle.api.impl.TruffleLocator",

substratevm/mx.substratevm/mx_substratevm.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -277,7 +277,7 @@ def query_native_image(all_args, option):
277277
stdoutdata = []
278278
def stdout_collector(x):
279279
stdoutdata.append(x.rstrip())
280-
_native_image(['--dry-run'] + all_args, out=stdout_collector)
280+
_native_image(['--dry-run', '--verbose'] + all_args, out=stdout_collector)
281281

282282
def remove_quotes(val):
283283
if len(val) >= 2 and val.startswith("'") and val.endswith("'"):

substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/LocatableOption.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727

2828
public final class LocatableOption {
2929

30-
final String name;
31-
final String origin;
30+
public final String name;
31+
public final String origin;
3232

33-
static LocatableOption from(String rawOptionName) {
33+
public static LocatableOption from(String rawOptionName) {
3434
return new LocatableOption(rawOptionName);
3535
}
3636

@@ -54,6 +54,10 @@ public String toString() {
5454
return result + " from '" + origin + "'";
5555
}
5656

57+
public String rawName() {
58+
return origin == null ? name : name + '@' + origin;
59+
}
60+
5761
private static final class LocatableOptionValue {
5862
private final Object value;
5963
private final String origin;

substratevm/src/com.oracle.svm.common/src/com/oracle/svm/common/option/MultiOptionValue.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
package com.oracle.svm.common.option;
2727

2828
import java.util.List;
29+
import java.util.Optional;
2930

3031
public interface MultiOptionValue<T> {
3132

@@ -38,6 +39,8 @@ public interface MultiOptionValue<T> {
3839
*/
3940
List<T> values();
4041

42+
Optional<T> lastValue();
43+
4144
void valueUpdate(Object value);
4245

4346
MultiOptionValue<T> createCopy();

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/FallbackExecutor.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,15 @@
5757
public class FallbackExecutor {
5858
public static class Options {
5959
@Option(help = "Internal option used to specify system properties for FallbackExecutor.")//
60-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> FallbackExecutorSystemProperty = new HostedOptionKey<>(new LocatableMultiOptionValue.Strings());
60+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> FallbackExecutorSystemProperty = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.build());
6161
@Option(help = "Internal option used to specify MainClass for FallbackExecutor.")//
6262
public static final HostedOptionKey<String> FallbackExecutorMainClass = new HostedOptionKey<>(null);
6363
@Option(help = "Internal option used to specify Classpath for FallbackExecutor.")//
6464
public static final HostedOptionKey<String> FallbackExecutorClasspath = new HostedOptionKey<>(null);
6565
@Option(help = "Internal option used to specify java arguments for FallbackExecutor.")//
66-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> FallbackExecutorJavaArg = new HostedOptionKey<>(new LocatableMultiOptionValue.Strings());
66+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> FallbackExecutorJavaArg = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.build());
6767
@Option(help = "Internal option used to specify runtime java arguments for FallbackExecutor.")//
68-
public static final RuntimeOptionKey<LocatableMultiOptionValue.Strings> FallbackExecutorRuntimeJavaArg = new RuntimeOptionKey<>(new LocatableMultiOptionValue.Strings());
68+
public static final RuntimeOptionKey<LocatableMultiOptionValue.Strings> FallbackExecutorRuntimeJavaArg = new RuntimeOptionKey<>(LocatableMultiOptionValue.Strings.build());
6969
}
7070

7171
public static void main(String[] args) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/RuntimeAssertionsSupport.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,7 @@ public static class Options {
9696
@APIOption(name = {"-da", "-disableassertions"}, valueSeparator = VALUE_SEPARATOR, valueTransformer = RuntimeAssertionsOptionTransformer.Disable.class, defaultValue = "", //
9797
customHelp = "also -da[:[packagename]...|:classname] or -disableassertions[:[packagename]...|:classname]. Disable assertions with specified granularity.")//
9898
@Option(help = "Enable or disable Java assert statements at run time") //
99-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> RuntimeAssertions = new HostedOptionKey<>(new LocatableMultiOptionValue.Strings());
99+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> RuntimeAssertions = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.build());
100100

101101
@APIOption(name = {"-esa", "-enablesystemassertions"}, customHelp = "also -enablesystemassertions. Enables assertions in all system classes.") //
102102
@APIOption(name = {"-dsa", "-disablesystemassertions"}, kind = APIOption.APIOptionKind.Negated, customHelp = "also -disablesystemassertions. Disables assertions in all system classes.") //

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/SubstrateOptions.java

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@
5959
import com.oracle.svm.core.heap.ReferenceHandler;
6060
import com.oracle.svm.core.option.APIOption;
6161
import com.oracle.svm.core.option.APIOptionGroup;
62+
import com.oracle.svm.core.option.BundleMember;
6263
import com.oracle.svm.core.option.HostedOptionKey;
6364
import com.oracle.svm.core.option.HostedOptionValues;
6465
import com.oracle.svm.core.option.LocatableMultiOptionValue;
@@ -80,7 +81,7 @@ public class SubstrateOptions {
8081
@Option(help = "Preserve the local variable information for every Java source line to allow line-by-line stepping in the debugger. Allow the lookup of Java-level method information, e.g., in stack traces.")//
8182
public static final HostedOptionKey<Boolean> SourceLevelDebug = new HostedOptionKey<>(false);
8283
@Option(help = "Constrain debug info generation to the comma-separated list of package prefixes given to this option.")//
83-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> SourceLevelDebugFilter = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.commaSeparated());
84+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> SourceLevelDebugFilter = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.buildWithCommaDelimiter());
8485

8586
public static boolean parseOnce() {
8687
/*
@@ -267,10 +268,11 @@ public static void setOptimizeValueUpdateHandler(ValueUpdateHandler<Optimization
267268
public static final HostedOptionKey<Boolean> IncludeNodeSourcePositions = new HostedOptionKey<>(false);
268269

269270
@Option(help = "Search path for C libraries passed to the linker (list of comma-separated directories)")//
270-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> CLibraryPath = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.commaSeparated());
271+
@BundleMember(role = BundleMember.Role.Input)//
272+
public static final HostedOptionKey<LocatableMultiOptionValue.Paths> CLibraryPath = new HostedOptionKey<>(LocatableMultiOptionValue.Paths.buildWithCommaDelimiter());
271273

272274
@Option(help = "Path passed to the linker as the -rpath (list of comma-separated directories)")//
273-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> LinkerRPath = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.commaSeparated());
275+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> LinkerRPath = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.buildWithCommaDelimiter());
274276

275277
@Option(help = "Directory of the image file to be generated", type = OptionType.User)//
276278
public static final HostedOptionKey<String> Path = new HostedOptionKey<>(null);
@@ -342,11 +344,11 @@ protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, Boolean o
342344

343345
@APIOption(name = "trace-class-initialization")//
344346
@Option(help = "Comma-separated list of fully-qualified class names that class initialization is traced for.")//
345-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> TraceClassInitialization = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.commaSeparated());
347+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> TraceClassInitialization = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.buildWithCommaDelimiter());
346348

347349
@APIOption(name = "trace-object-instantiation")//
348350
@Option(help = "Comma-separated list of fully-qualified class names that object instantiation is traced for.")//
349-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> TraceObjectInstantiation = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.commaSeparated());
351+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> TraceObjectInstantiation = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.buildWithCommaDelimiter());
350352

351353
@Option(help = "Trace all native tool invocations as part of image building", type = User)//
352354
public static final HostedOptionKey<Boolean> TraceNativeToolUsage = new HostedOptionKey<>(false);
@@ -361,10 +363,10 @@ protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, Boolean o
361363
@APIOption(name = "enable-https", fixedValue = "https", customHelp = "enable https support in the generated image")//
362364
@APIOption(name = "enable-url-protocols")//
363365
@Option(help = "List of comma separated URL protocols to enable.")//
364-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> EnableURLProtocols = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.commaSeparated());
366+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> EnableURLProtocols = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.buildWithCommaDelimiter());
365367

366368
@Option(help = "List of comma separated URL protocols that must never be included.")//
367-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> DisableURLProtocols = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.commaSeparated());
369+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> DisableURLProtocols = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.buildWithCommaDelimiter());
368370

369371
@SuppressWarnings("unused") //
370372
@APIOption(name = "enable-all-security-services")//
@@ -413,10 +415,11 @@ protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, Boolean o
413415
@Option(help = "Print GC warnings as part of build output", type = OptionType.User)//
414416
public static final HostedOptionKey<Boolean> BuildOutputGCWarnings = new HostedOptionKey<>(true);
415417

418+
@BundleMember(role = BundleMember.Role.Output)//
416419
@Option(help = "Print build output statistics as JSON to the specified file. " +
417420
"The output conforms to the JSON schema located at: " +
418421
"docs/reference-manual/native-image/assets/build-output-schema-v0.9.1.json", type = OptionType.User)//
419-
public static final HostedOptionKey<String> BuildOutputJSONFile = new HostedOptionKey<>("");
422+
public static final HostedOptionKey<LocatableMultiOptionValue.Paths> BuildOutputJSONFile = new HostedOptionKey<>(LocatableMultiOptionValue.Paths.build());
420423

421424
/*
422425
* Object and array allocation options.
@@ -481,7 +484,7 @@ public static long getTearDownFailureNanos() {
481484
public static final HostedOptionKey<Boolean> AOTTrivialInline = new HostedOptionKey<>(true);
482485

483486
@Option(help = "file:doc-files/NeverInlineHelp.txt", type = OptionType.Debug)//
484-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> NeverInline = new HostedOptionKey<>(new LocatableMultiOptionValue.Strings());
487+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> NeverInline = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.build());
485488

486489
@Option(help = "Maximum number of nodes in a method so that it is considered trivial.")//
487490
public static final HostedOptionKey<Integer> MaxNodesInTrivialMethod = new HostedOptionKey<>(20);
@@ -502,7 +505,7 @@ public static long getTearDownFailureNanos() {
502505
public static final HostedOptionKey<Boolean> UseCompressedFrameEncodings = new HostedOptionKey<>(true);
503506

504507
@Option(help = "Report error if <typename>[:<UsageKind>{,<UsageKind>}] is discovered during analysis (valid values for UsageKind: InHeap, Allocated, Reachable).", type = OptionType.Debug)//
505-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> ReportAnalysisForbiddenType = new HostedOptionKey<>(new LocatableMultiOptionValue.Strings());
508+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> ReportAnalysisForbiddenType = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.build());
506509

507510
@Option(help = "Backend used by the compiler", type = OptionType.User)//
508511
public static final HostedOptionKey<String> CompilerBackend = new HostedOptionKey<>("lir") {
@@ -569,7 +572,7 @@ public static boolean useLIRBackend() {
569572
public static final HostedOptionKey<String> CCompilerPath = new HostedOptionKey<>(null);
570573
@APIOption(name = "native-compiler-options")//
571574
@Option(help = "Provide custom C compiler option used for query code compilation.", type = OptionType.User)//
572-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> CCompilerOption = new HostedOptionKey<>(new LocatableMultiOptionValue.Strings());
575+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> CCompilerOption = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.build());
573576

574577
@Option(help = "Use strict checks when performing query code compilation.", type = OptionType.User)//
575578
public static final HostedOptionKey<Boolean> StrictQueryCodeCompilation = new HostedOptionKey<>(true);
@@ -625,7 +628,7 @@ protected void onValueUpdate(EconomicMap<OptionKey<?>, Object> values, Integer o
625628
};
626629

627630
@Option(help = "Search path for source files for Application or GraalVM classes (list of comma-separated directories or jar files)")//
628-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> DebugInfoSourceSearchPath = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.commaSeparated());
631+
public static final HostedOptionKey<LocatableMultiOptionValue.Paths> DebugInfoSourceSearchPath = new HostedOptionKey<>(LocatableMultiOptionValue.Paths.buildWithCommaDelimiter());
629632

630633
@Option(help = "Directory under which to create source file cache for Application or GraalVM classes")//
631634
public static final HostedOptionKey<String> DebugInfoSourceCacheRoot = new HostedOptionKey<>("sources");

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/VMInspectionOptions.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ public final class VMInspectionOptions {
5555
@APIOption(name = ENABLE_MONITORING_OPTION, defaultValue = MONITORING_DEFAULT_NAME) //
5656
@Option(help = "Enable monitoring features that allow the VM to be inspected at run time. Comma-separated list can contain " + MONITORING_ALLOWED_VALUES + ". " +
5757
"For example: `--" + ENABLE_MONITORING_OPTION + "=" + MONITORING_HEAPDUMP_NAME + "," + MONITORING_JFR_NAME + "`.", type = OptionType.User) //
58-
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> EnableMonitoringFeatures = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.commaSeparated(),
58+
public static final HostedOptionKey<LocatableMultiOptionValue.Strings> EnableMonitoringFeatures = new HostedOptionKey<>(LocatableMultiOptionValue.Strings.buildWithCommaDelimiter(),
5959
VMInspectionOptions::validateEnableMonitoringFeatures);
6060

6161
public static void validateEnableMonitoringFeatures(@SuppressWarnings("unused") OptionKey<?> optionKey) {

substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/c/ProjectHeaderFile.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,8 +169,8 @@ static class MainHeaderResolver implements HeaderResolver {
169169
@Override
170170
public HeaderSearchResult resolveHeader(String projectName, String headerFile) {
171171
List<String> locations = new ArrayList<>();
172-
for (String clibPathComponent : SubstrateOptions.CLibraryPath.getValue().values()) {
173-
Path clibPathHeaderFile = Paths.get(clibPathComponent).resolve(headerFile).normalize().toAbsolutePath();
172+
for (Path clibPathComponent : SubstrateOptions.CLibraryPath.getValue().values()) {
173+
Path clibPathHeaderFile = clibPathComponent.resolve(headerFile).normalize().toAbsolutePath();
174174
locations.add(clibPathHeaderFile.toString());
175175
if (Files.exists(clibPathHeaderFile)) {
176176
return new HeaderSearchResult(Optional.of("\"" + clibPathHeaderFile + "\""), locations);

0 commit comments

Comments
 (0)