Unable to generate native image with GraalVM
wsuchy opened this issue · comments
Christopher Suchanek commented
Parallel collections used in Scala 2.13.3 can't be compiled via native-image / GraalVM due to the following error.
Note, that the same code compiles correctly, when downgraded to Scala 2.12.12.
Invoke with MethodHandle argument could not be reduced to at most a single call or single field access. The method handle must be a compile time constant, e.g., be loaded from a `static final` field. Method that contains the method handle invocation: java.lang.invoke.LambdaForm$MH/1773403092.invoke_MT(Object, Object)
To diagnose the issue, you can add the option --report-unsupported-elements-at-runtime. The error is then reported at run time when the invoke is executed.
Detailed message:
Trace:
at parsing scala.runtime.Statics.releaseFence(Statics.java:148)
Call path from entry point to scala.runtime.Statics.releaseFence():
at scala.runtime.Statics.releaseFence(Statics.java:148)
at scala.collection.immutable.List.map(List.scala:255)
at scala.collection.immutable.List.map(List.scala:79)
at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.split(Tasks.scala:305)
at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.spawnSubtasks(Tasks.scala:184)
at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.spawnSubtasks$(Tasks.scala:180)
at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.spawnSubtasks(Tasks.scala:303)
at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.internal(Tasks.scala:157)
at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.internal$(Tasks.scala:156)
at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.internal(Tasks.scala:303)
at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute(Tasks.scala:149)
at scala.collection.parallel.AdaptiveWorkStealingTasks$WrappedTask.compute$(Tasks.scala:148)
at scala.collection.parallel.AdaptiveWorkStealingForkJoinTasks$WrappedTask.compute(Tasks.scala:303)
at java.util.concurrent.RecursiveAction.exec(RecursiveAction.java:189)
at java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.java:289)
at java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.java:1056)
at java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.java:1692)
at java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.java:163)
at com.oracle.svm.core.thread.JavaThreads.threadStartRoutine(JavaThreads.java:517)
at com.oracle.svm.core.posix.thread.PosixJavaThreads.pthreadStartRoutine(PosixJavaThreads.java:192)
at com.oracle.svm.core.code.IsolateEnterStub.PosixJavaThreads_pthreadStartRoutine_e1f4a8c0039f8337338252cd8734f63a79b5e3df(generated:0)
When running the program with --report-unsupported-elements-at-runtime
flag
Exception in thread "main" com.oracle.svm.core.jdk.UnsupportedFeatureError: Invoke with MethodHandle argument could not be reduced to at most a single call or single field access. The method handle must be a compile time constant, e.g., be loaded from a `static final` field. Method that contains the method handle invocation: java.lang.invoke.LambdaForm$MH/810172214.invoke_MT(Object, Object)
at com.oracle.svm.core.util.VMError.unsupportedFeature(VMError.java:86)
at scala.runtime.Statics.releaseFence(Statics.java:148)
at scala.collection.parallel.mutable.ResizableParArrayCombiner$ResizableParArrayCombinerC$1.<init>(ResizableParArrayCombiner.scala:87)
at scala.collection.parallel.mutable.ResizableParArrayCombiner$.apply(ResizableParArrayCombiner.scala:88)
at scala.collection.parallel.mutable.ResizableParArrayCombiner$.apply(ResizableParArrayCombiner.scala:90)
at scala.collection.parallel.mutable.ParArray$.newCombiner(ParArray.scala:698)
at scala.collection.parallel.ParIterableLike.$anonfun$flatMap$1(ParIterableLike.scala:498)
at scala.collection.parallel.ParIterableLike.combinerFactory(ParIterableLike.scala:563)
at scala.collection.parallel.ParIterableLike.combinerFactory$(ParIterableLike.scala:562)
at scala.collection.parallel.mutable.ParArray.combinerFactory(ParArray.scala:55)
at scala.collection.parallel.ParIterableLike.flatMap(ParIterableLike.scala:498)
at scala.collection.parallel.ParIterableLike.flatMap$(ParIterableLike.scala:497)
at scala.collection.parallel.mutable.ParArray.flatMap(ParArray.scala:55)
Marissa | April commented
workaround: scala/bug#12116 (comment)
Seth Tisue commented
if the workaround doesn't solve it for scala-parallel-collections in particular, let us know and we can reopen the issue