Skip to content

Commit

Permalink
Use HewlettPackard/kraal to prevent "Non-reducible loop"
Browse files Browse the repository at this point in the history
Use Kraal to prevent GraalVM native-image from failing with "Non-reducible loop".

oracle/graal#366
https://github.com/HewlettPackard/kraal

Without Kraal, here is the native-image's stacktrace:

	Error: Non-reducible loop
	Call path from entry point to pullpitok.AppKt$main$1.invokeSuspend(Object):
		at pullpitok.AppKt$main$1.invokeSuspend(App.kt)
		at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:32)
		at kotlinx.coroutines.DispatchedTask.run(Dispatched.kt:285)
		at java.lang.Shutdown.runHooks(Shutdown.java:123)
		at java.lang.Shutdown.sequence(Shutdown.java:167)
		at java.lang.Shutdown.shutdown(Shutdown.java:234)
		at com.oracle.svm.core.jdk.RuntimeSupport.shutdown(RuntimeSupport.java:181)
		at com.oracle.svm.core.JavaMainWrapper.run(JavaMainWrapper.java:177)
		at com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(generated:0)
	Original exception that caused the problem: org.graalvm.compiler.core.common.PermanentBailoutException: Non-reducible loop
		at org.graalvm.compiler.java.BciBlockMapping.computeBlockOrder(BciBlockMapping.java:882)
		at org.graalvm.compiler.java.BciBlockMapping.build(BciBlockMapping.java:527)
		at org.graalvm.compiler.java.BciBlockMapping.create(BciBlockMapping.java:1109)
		at org.graalvm.compiler.java.BytecodeParser.build(BytecodeParser.java:806)
		at org.graalvm.compiler.java.BytecodeParser.buildRootMethod(BytecodeParser.java:784)
		at org.graalvm.compiler.java.GraphBuilderPhase$Instance.run(GraphBuilderPhase.java:95)
		at org.graalvm.compiler.phases.Phase.run(Phase.java:49)
		at org.graalvm.compiler.phases.BasePhase.apply(BasePhase.java:197)
		at org.graalvm.compiler.phases.Phase.apply(Phase.java:42)
		at org.graalvm.compiler.phases.Phase.apply(Phase.java:38)
		at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.parse(MethodTypeFlowBuilder.java:205)
		at com.oracle.graal.pointsto.flow.MethodTypeFlowBuilder.apply(MethodTypeFlowBuilder.java:324)
		at com.oracle.graal.pointsto.flow.MethodTypeFlow.doParse(MethodTypeFlow.java:310)
		at com.oracle.graal.pointsto.flow.MethodTypeFlow.ensureParsed(MethodTypeFlow.java:300)
		at com.oracle.graal.pointsto.flow.MethodTypeFlow.addContext(MethodTypeFlow.java:107)
		at com.oracle.graal.pointsto.flow.SpecialInvokeTypeFlow.onObservedUpdate(InvokeTypeFlow.java:421)
		at com.oracle.graal.pointsto.flow.TypeFlow.notifyObservers(TypeFlow.java:347)
		at com.oracle.graal.pointsto.flow.TypeFlow.update(TypeFlow.java:389)
		at com.oracle.graal.pointsto.BigBang$2.run(BigBang.java:508)
		at com.oracle.graal.pointsto.util.CompletionExecutor.lambda$execute$0(CompletionExecutor.java:174)
		at java.util.concurrent.ForkJoinTask$RunnableExecuteAction.exec(ForkJoinTask.java:1402)
		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:157)
  • Loading branch information
nicokosi committed Feb 26, 2019
1 parent 544738a commit 141bc94
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 10 deletions.
21 changes: 15 additions & 6 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import org.jetbrains.kotlin.gradle.dsl.KotlinCompile
import org.gradle.jvm.tasks.Jar

plugins {
val kotlinVersion = "1.3.20"
id("org.jetbrains.kotlin.jvm").version(kotlinVersion)
id("com.adarshr.test-logger").version("1.6.0")
id("se.patrikerdes.use-latest-versions") version "0.2.7"
id("com.github.ben-manes.versions") version "0.20.0"
id("com.github.johnrengelman.shadow") version "4.0.4"
id("com.hpe.kraal") version "0.0.14"
application
}

Expand All @@ -32,10 +32,19 @@ application {
mainClassName = "pullpitok.AppKt"
}

shadow {
applicationDistribution.from("src/dist")
val fatjar by tasks.creating(Jar::class) {
from(kraal.outputZipTrees) {
exclude("META-INF/*.SF")
exclude("META-INF/*.DSA")
exclude("META-INF/*.RSA")
}
manifest {
attributes("Main-Class" to application.mainClassName)
}
destinationDir = project.buildDir.resolve("fatjar")
archiveName = "pullpitok.jar"
}

tasks.shadowJar {
minimize()
tasks.named("assemble").configure {
dependsOn(fatjar)
}
10 changes: 6 additions & 4 deletions generate-executable.sh
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
set -e

echo "Build nicokosi/pullpitoK JAR file:"
./gradlew shadowJar
./gradlew assemble

echo "Build nicokosi/ipullpitoK's executable from JAR via GraalVM:"
echo "Build nicokosi/pullpitoK's executable from JAR via GraalVM:"
graalvmDockerImage="oracle/graalvm-ce:1.0.0-rc12"
docker pull ${graalvmDockerImage}
docker run \
Expand All @@ -15,7 +15,9 @@ docker run \
--volume $(pwd):/app \
${graalvmDockerImage} \
sh -c "native-image \
-jar /app/build/libs/pullpitoK-all.jar \
--static \
--report-unsupported-elements-at-runtime \
-jar /app/build/fatjar/pullpitok.jar \
pullpitoK && \
echo ' => Check the executable: ' && ./pullpitoK || \
echo ' => Copy it to current directory: ' && cp pullpitoK /app/"
echo ' => Copy it to current directory: ' && cp ./pullpitoK /app/"

0 comments on commit 141bc94

Please sign in to comment.