Skip to content

Commit 00ae6bc

Browse files
committed
feat(graalvm): eliminate module symbols
chore: drop all symbols for js modules chore: implement build-time intrinsics gathering chore: impelment build-time polyfills parsing chore: ffm config chore: general cleanups Signed-off-by: Sam Gammon <sam@elide.dev>
1 parent 480f847 commit 00ae6bc

File tree

57 files changed

+532
-413
lines changed

Some content is hidden

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

57 files changed

+532
-413
lines changed

packages/cli/build.gradle.kts

+60-54
Original file line numberDiff line numberDiff line change
@@ -147,7 +147,7 @@ val enableEmbeddedJvm = false
147147
val enableEmbeddedBuilder = false
148148
val enableBuildReport = true
149149
val enableHeapReport = false
150-
val enableG1 = true
150+
val enableG1 = false
151151
val enablePreinit = true
152152
val enablePgo = findProperty("elide.pgo") != "false"
153153
val enablePgoSampling = false
@@ -160,12 +160,14 @@ val enableSbomStrict = false
160160
val enableJfr = false
161161
val enableNmt = false
162162
val enableHeapDump = false
163+
val enableJvmstat = false
163164
val enableJmx = false
164165
val enableVerboseClassLoading = false
165166
val jniDebug = false
166167
val glibcTarget = if (enableStatic) "musl" else "glibc"
167168
val dumpPointsTo = false
168169
val elideTarget = TargetInfo.current(project)
170+
val fallbackGc = findProperty("elide.gc") ?: "serial"
169171
val defaultArchTarget = when {
170172
TargetCriteria.allOf(elideTarget, Criteria.Amd64) -> "x86-64-v3"
171173
TargetCriteria.allOf(elideTarget, Criteria.MacArm64) -> "armv8.1-a"
@@ -184,7 +186,7 @@ val exclusions = listOfNotNull(
184186
libs.jline.terminal.jna,
185187

186188
// only include jline jni integration if ffm is disabled
187-
if (enableFfm) libs.jline.terminal.jni else null,
189+
//if (enableFfm) libs.jline.terminal.jni else null,
188190

189191
// exclude kotlin compiler if kotlin is not enabled; it includes shadowed jline configs
190192
if (enableKotlin) null else libs.kotlin.compiler.embedded,
@@ -407,7 +409,8 @@ dependencies {
407409
api(mn.micronaut.inject)
408410
implementation(projects.packages.terminal)
409411
implementation(libs.dirs)
410-
jvmOnly(libs.snakeyaml)
412+
implementation(libs.snakeyaml)
413+
implementation(mn.micronaut.json.core)
411414

412415
// Native-image transitive compile dependencies
413416
implementation(libs.jakarta.validation)
@@ -446,7 +449,7 @@ dependencies {
446449
implementation(libs.jline.terminal.jni)
447450

448451
if (enableFfm) {
449-
implementation(libs.jline.terminal.ffm)
452+
//implementation(libs.jline.terminal.ffm)
450453
}
451454

452455
implementation(libs.jline.builtins)
@@ -728,7 +731,6 @@ val enabledSecurityProviders = listOfNotNull(
728731

729732
val preinitializedContexts = if (!enablePreinit) emptyList() else listOfNotNull(
730733
"js",
731-
"ts",
732734
onlyIf(enablePreinitializeAll && enablePython, "python"),
733735
onlyIf(enablePreinitializeAll && enableRuby, "ruby"),
734736
onlyIf(enablePreinitializeAll && enableJvm, "java"),
@@ -771,26 +773,20 @@ if (!pluginApiHeader.exists()) {
771773
}
772774

773775
val initializeAtBuildtime: List<String> = listOf(
776+
"kotlin",
774777
"kotlinx.atomicfu",
775-
"elide.tool.io.RuntimeWorkdirManager",
776-
"elide.tool.io.RuntimeWorkdirManager\$Companion",
778+
"org.slf4j",
779+
"ch.qos.logback",
777780
"io.micronaut.context.DefaultApplicationContextBuilder",
778-
"elide.tool.err.DefaultErrorHandler",
779-
"elide.tool.err.DefaultErrorHandler\$Companion",
780-
"elide.tool.err.DefaultStructuredErrorRecorder",
781-
"elide.tool.err.DefaultStructuredErrorRecorder\$Companion",
782-
"elide.runtime.core.internals.graalvm.GraalVMEngine\$Companion",
783781
"org.fusesource.jansi.io.AnsiOutputStream",
784782
"com.google.common.jimfs.SystemJimfsFileSystemProvider",
785783
"com.google.common.collect.MapMakerInternalMap\$1",
786784
"elide.tool.cli.AbstractToolCommand\$Companion",
787785
"elide.tool.cli.Elide\$Companion",
788786
"com.google.common.base.Equivalence\$Equals",
789-
"kotlin",
790787
"com.google.common.collect.MapMakerInternalMap",
791788
"com.google.common.collect.MapMakerInternalMap\$StrongKeyWeakValueSegment",
792789
"com.google.common.collect.MapMakerInternalMap\$StrongKeyWeakValueEntry\$Helper",
793-
"ch.qos.logback",
794790
"com.sun.tools.javac.resources.compiler",
795791
"com.sun.tools.javac.resources.javac",
796792
"sun.tools.jar.resources.jar",
@@ -801,33 +797,61 @@ val initializeAtBuildtime: List<String> = listOf(
801797
"elide.runtime.gvm.internals.sqlite.SqliteModule",
802798
"elide.runtime.lang.javascript.JavaScriptPrecompiler",
803799
"java.sql",
804-
"org.slf4j",
805800
"org.sqlite",
806801
"org.pkl.core.runtime.VmLanguageProvider",
807802
"elide.runtime.lang.typescript",
808803
"elide.runtime.typescript",
804+
"elide.runtime.plugins.js.JavaScript",
805+
"elide.tool.io.RuntimeWorkdirManager",
806+
"elide.tool.io.RuntimeWorkdirManager\$Companion",
807+
"elide.tool.err.DefaultErrorHandler",
808+
"elide.tool.err.DefaultErrorHandler\$Companion",
809+
"elide.tool.err.DefaultStructuredErrorRecorder",
810+
"elide.tool.err.DefaultStructuredErrorRecorder\$Companion",
811+
"elide.runtime.core.internals.graalvm.GraalVMEngine\$Companion",
812+
"elide.runtime.gvm.intrinsics.BuildTimeIntrinsicsResolver",
809813
)
810814

811815
val initializeAtBuildTimeTest: List<String> = listOf(
812816
"org.junit.platform.launcher.core.LauncherConfig",
813817
"org.junit.jupiter.engine.config.InstantiatingConfigurationParameterConverter",
814818
)
815819

816-
val initializeAtRuntimeNonLinux: List<String> = listOfNotNull(
820+
val initializeAtRuntime: List<String> = listOfNotNull(
821+
onlyIf(!enableSqliteStatic, "org.sqlite.SQLiteJDBCLoader"),
822+
onlyIf(!enableSqliteStatic, "org.sqlite.core.NativeDB"),
823+
"org.fusesource.jansi.internal.CLibrary",
824+
"com.github.ajalt.mordant.rendering.TextStyles",
825+
"elide.tool.err.ErrPrinter",
826+
"com.google.protobuf.RuntimeVersion",
827+
"elide.tool.err.ErrorHandler${'$'}ErrorContext",
828+
"com.google.protobuf.RuntimeVersion",
829+
"sun.java2d.pipe.Region",
830+
"sun.rmi.server.Util",
831+
"sun.awt.X11.XWM",
832+
"sun.awt.X11.XSystemTrayPeer",
833+
"sun.awt.X11.XDragAndDropProtocols",
834+
"com.github.ajalt.mordant.terminal.terminalinterface.ffm.TerminalInterfaceFfmLinux",
835+
"com.github.ajalt.mordant.internal.MppInternalKt",
836+
837+
// @TODO switch to built-in brotli
838+
"org.apache.commons.compress.compressors.brotli.BrotliCompressorInputStream",
839+
"org.apache.commons.compress.compressors.xz.XZCompressorOutputStream",
840+
841+
// --- JNA + OSHI -----
842+
843+
"com.sun.jna.platform.linux.LibC",
844+
"com.sun.jna.platform.linux.Udev",
845+
"oshi.software.os.linux.LinuxOperatingSystem",
817846
"oshi.hardware.platform.linux",
818847
"oshi.jna.platform.linux.LinuxLibc",
819848
"oshi.util.UserGroupInfo",
820849
"oshi.driver.linux.Lshw",
821-
"com.sun.jna.platform.linux.LibC",
822850
"oshi.software.os",
823851
"oshi.software.os.linux",
824-
"oshi.software.os.linux.LinuxOperatingSystem",
825852
"oshi.util.platform.linux.DevPath",
826853
"oshi.util.platform.linux.ProcPath",
827854
"oshi.util.platform.linux.SysPath",
828-
)
829-
830-
val initializeAtRuntimeNonMac: List<String> = listOfNotNull(
831855
"com.sun.jna.platform.mac.CoreFoundation",
832856
"oshi.hardware.platform.mac",
833857
"oshi.hardware.platform.mac.MacFirmware",
@@ -847,19 +871,6 @@ val initializeAtRuntimeNonMac: List<String> = listOfNotNull(
847871
"oshi.util.platform.mac.CFUtil",
848872
"oshi.util.platform.mac.SmcUtil",
849873
"oshi.util.platform.mac.SysctlUtil",
850-
)
851-
852-
val initializeAtRuntime: List<String> = listOfNotNull(
853-
onlyIf(!enableSqliteStatic, "org.sqlite.SQLiteJDBCLoader"),
854-
onlyIf(!enableSqliteStatic, "org.sqlite.core.NativeDB"),
855-
onlyIf(enableNativeTransportV2, "io.netty.channel.kqueue.Native"),
856-
onlyIf(enableNativeTransportV2, "io.netty.channel.kqueue.KQueueEventLoop"),
857-
"org.fusesource.jansi.internal.CLibrary",
858-
"com.github.ajalt.mordant.rendering.TextStyles",
859-
"elide.tool.err.ErrPrinter",
860-
"com.google.protobuf.RuntimeVersion",
861-
"elide.tool.err.ErrorHandler${'$'}ErrorContext",
862-
"com.google.protobuf.RuntimeVersion",
863874

864875
// pkl needs this
865876
"org.msgpack.core.buffer.DirectBufferAccess",
@@ -1017,10 +1028,6 @@ val initializeAtRuntime: List<String> = listOfNotNull(
10171028
"elide.tool.cli.cmd.discord",
10181029
"elide.tool.cli.cmd.discord.ToolDiscordCommand",
10191030
"elide.tool.cli.cmd.selftest.SelfTestCommand",
1020-
).plus(
1021-
initializeAtRuntimeNonLinux.onlyIf(!HostManager.hostIsLinux)
1022-
).plus(
1023-
initializeAtRuntimeNonMac.onlyIf(!HostManager.hostIsMac)
10241031
)
10251032

10261033
val initializeAtRuntimeTest: List<String> = emptyList()
@@ -1055,7 +1062,7 @@ val nativeMonitoring = listOfNotNull(
10551062
onlyIf(enableJfr, "jfr"),
10561063
onlyIf(enableNmt, "nmt"),
10571064
onlyIf(enableHeapDump, "heapdump"),
1058-
"jvmstat",
1065+
onlyIf(enableJvmstat, "jvmstat"),
10591066
onlyIf(enableJmx, "jmxserver"),
10601067
onlyIf(enableJmx, "jmxclient"),
10611068
onlyIf(enableJmx, "threaddump"),
@@ -1093,14 +1100,14 @@ val commonNativeArgs = listOfNotNull(
10931100
// "--exact-reachability-metadata",
10941101
"--enable-url-protocols=http,https",
10951102
"--color=always",
1096-
// "--link-at-build-time",
1103+
"--initialize-at-build-time",
10971104
"--exact-reachability-metadata",
10981105
"--link-at-build-time=elide",
10991106
"--link-at-build-time=dev.elide",
11001107
"--link-at-build-time=org.pkl",
11011108
"--link-at-build-time=picocli",
11021109
"--enable-native-access=org.graalvm.truffle,ALL-UNNAMED",
1103-
"--enable-monitoring=${nativeMonitoring}",
1110+
onlyIf(nativeMonitoring.isNotEmpty(), "--enable-monitoring=${nativeMonitoring}"),
11041111
"-J--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jdk=ALL-UNNAMED",
11051112
"-J--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.hosted=ALL-UNNAMED",
11061113
"-J--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.hosted.c=ALL-UNNAMED",
@@ -1202,7 +1209,6 @@ val commonNativeArgs = listOfNotNull(
12021209
onlyIf(enablePgoSampling, "--pgo-sampling"),
12031210
onlyIf(enableHeapReport, "-H:+BuildReportMappedCodeSizeBreakdown"),
12041211
onlyIf(enableHeapReport, "-H:+TrackNodeSourcePosition"),
1205-
onlyIf(enableHeapReport, "-R:-TrackNodeSourcePosition"),
12061212
).asSequence().plus(
12071213
languagePluginPaths.plus(umbrellaNativesPath).plus(jniHeaderPaths).filter {
12081214
Files.exists(Path.of(it))
@@ -1225,9 +1231,9 @@ val debugFlags: List<String> = listOfNotNull(
12251231
"--verbose",
12261232
"-g",
12271233
"-H:+SourceLevelDebug",
1234+
"-H:-DeleteLocalSymbols",
12281235
// "-Dpolyglot.engine.TraceCache=true",
12291236
// "-J-Dpolyglot.engine.TraceCache=true",
1230-
// "-H:-DeleteLocalSymbols",
12311237
// "-H:+PrintMethodHistogram",
12321238
// "-H:+PrintPointsToStatistics",
12331239
// "-H:+PrintRuntimeCompileMethods",
@@ -1325,15 +1331,11 @@ val profiles: List<String> = if (enableEdge) listOf(
13251331
"ts-sqlite.iprof",
13261332
) else listOfNotNull(
13271333
"cli-help.iprof",
1328-
"js-cpu.iprof",
1329-
"js-fetch.iprof",
1330-
"js-fs.iprof",
1334+
"cli-version.iprof",
13311335
"js-hello.iprof",
1332-
"js-paths.iprof",
13331336
"pkl-eval.iprof",
13341337
onlyIf(enablePython, "py-hello.iprof"),
13351338
onlyIf(enablePython, "py-interop.iprof"),
1336-
"ts-hello.iprof",
13371339
"ts-sqlite.iprof",
13381340
)
13391341

@@ -1425,7 +1427,7 @@ val pklArgs: List<String> = listOf(
14251427
val defaultPlatformArgs: List<String> = listOf()
14261428

14271429
val windowsOnlyArgs = defaultPlatformArgs.plus(listOf(
1428-
"--gc=serial",
1430+
"--gc=$fallbackGc",
14291431
"-R:MaximumHeapSizePercent=80",
14301432
).plus(if (oracleGvm) listOf(
14311433
"-Delide.vm.engine.preinitialize=true",
@@ -1439,7 +1441,7 @@ val windowsOnlyArgs = defaultPlatformArgs.plus(listOf(
14391441
) else emptyList())
14401442

14411443
val darwinOnlyArgs = defaultPlatformArgs.plus(listOf(
1442-
"--gc=serial",
1444+
"--gc=$fallbackGc",
14431445
"-R:MaximumHeapSizePercent=80",
14441446
"--initialize-at-build-time=sun.awt.resources.awtosx",
14451447
"-H:NativeLinkerOption=-flto",
@@ -1468,7 +1470,7 @@ val windowsReleaseArgs = windowsOnlyArgs
14681470
val darwinReleaseArgs = darwinOnlyArgs.toList()
14691471

14701472
val linuxOnlyArgs = defaultPlatformArgs.plus(
1471-
listOf(
1473+
listOfNotNull(
14721474
"-g", // always generate debug info on linux
14731475
"-H:NativeLinkerOption=-flto",
14741476
"-H:NativeLinkerOption=-Wl,--gc-sections",
@@ -1490,6 +1492,9 @@ val linuxOnlyArgs = defaultPlatformArgs.plus(
14901492
"--initialize-at-run-time=io.netty.channel.kqueue.Native",
14911493
"--initialize-at-run-time=io.netty.channel.kqueue.Native",
14921494
"--initialize-at-run-time=io.netty.channel.kqueue.KQueueEventLoop",
1495+
"--initialize-at-run-time=io.netty.channel.kqueue.KQueueEventArray",
1496+
"--initialize-at-run-time=io.netty.channel.kqueue.KQueue",
1497+
onlyIf(enableNativeTransportV2, "io.netty.channel.kqueue.Native"),
14931498
).plus(
14941499
listOfNotNull(
14951500
onlyIf(enableStatic, "--libc=musl"),
@@ -1508,10 +1513,10 @@ val linuxOnlyArgs = defaultPlatformArgs.plus(
15081513
"--gc=G1",
15091514
"-H:-AuxiliaryEngineCache",
15101515
"-Delide.vm.engine.preinitialize=false",
1511-
) else listOf(
1512-
"--gc=serial",
1516+
) else listOfNotNull(
1517+
"--gc=$fallbackGc",
15131518
"-R:MaximumHeapSizePercent=80",
1514-
"-H:InitialCollectionPolicy=Adaptive",
1519+
onlyIf(fallbackGc == "serial", "-H:InitialCollectionPolicy=Adaptive"),
15151520
).plus(if (oracleGvm && enableAuxCache && !enableG1) listOf(
15161521
"-H:+AuxiliaryEngineCache",
15171522
"-Delide.vm.engine.preinitialize=true",
@@ -2128,6 +2133,7 @@ tasks {
21282133
"-Xmx4g",
21292134
"-XX:+UnlockExperimentalVMOptions",
21302135
"--enable-native-access=ALL-UNNAMED",
2136+
"-Xverify:none",
21312137
// "-agentpath:/opt/visualvm/visualvm/lib/deployed/jdk16/linux-amd64/libprofilerinterface.so=/opt/visualvm/visualvm/lib,5140",
21322138
)))
21332139

packages/cli/src/main/kotlin/elide/tool/cli/Elide.kt

+2-2
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ private const val DEFAULT_CMD_TIMEOUT = 30
5656
// Pre-initialized application builder.
5757
internal val applicationContextBuilder = ApplicationContext
5858
.builder()
59-
.environments("cli")
59+
.environments("cli", if (ImageInfo.inImageCode()) "native" else "jvm")
6060
.defaultEnvironments("cli")
6161
.eagerInitAnnotated(Eager::class.java)
6262
.eagerInitSingletons(false)
@@ -346,7 +346,7 @@ internal val applicationContextBuilder = ApplicationContext
346346
.deduceEnvironment(false)
347347
.deduceCloudEnvironment(false)
348348
.banner(false)
349-
.environments("cli")
349+
.environments("cli", if (ImageInfo.inImageCode()) "native" else "jvm")
350350
.defaultEnvironments("cli")
351351
.eagerInitAnnotated(Eager::class.java)
352352
.eagerInitConfiguration(true)

packages/cli/src/main/resources/META-INF/native-image/dev/elide/elide-cli/ffm.json

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@
22
"downcalls": [
33
{
44
"descriptor": "(long,int,long,long,long)int"
5+
},
6+
{
7+
"descriptor": "(long,int)int"
58
}
69
]
710
}

packages/engine/api/engine.api

+4-2
Original file line numberDiff line numberDiff line change
@@ -1106,8 +1106,10 @@ public final class elide/runtime/plugins/AbstractLanguagePlugin$PreinitScript :
11061106
}
11071107

11081108
public final class elide/runtime/plugins/AbstractLanguagePluginKt {
1109-
public static final fun default (Lorg/graalvm/polyglot/Context;)Lorg/graalvm/polyglot/Context;
1110-
public static final fun default (Lorg/graalvm/polyglot/Engine;)Lorg/graalvm/polyglot/Engine;
1109+
public static final fun defaultPolyglotContext ()Lorg/graalvm/polyglot/Context;
1110+
public static final fun defaultPolyglotContextBuilder ()Lorg/graalvm/polyglot/Context$Builder;
1111+
public static final fun defaultPolyglotEngine ()Lorg/graalvm/polyglot/Engine;
1112+
public static final fun defaultPolyglotEngineBuilder ()Lorg/graalvm/polyglot/Engine$Builder;
11111113
}
11121114

11131115
public final class elide/runtime/plugins/bindings/Bindings {

0 commit comments

Comments
 (0)