Closed
Description
Describe the issue
Using -H:+PrintAnalysisCallTree
on the following java example:
public class CallTree {
private static void callA() {
callB(true);
callB(false);
}
private static void callB(boolean cond) {
if (cond) {
callD(true);
}
}
private static void callD(boolean cond) {
if (cond) {
callC();
} else {
System.out.println("Hello D");
}
}
private static void callC() {
System.out.println("Hello C");
}
private static void callW() {
callD(false);
}
private static void callX() {
callD(false);
}
private static void callZ() {
callD(false);
}
public static void main(String[] args) {
callA();
callW();
callX();
callZ();
}
}
results in the following call tree:
├── entry com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(int, org.graalvm.nativeimage.c.type.CCharPointerPointer):int id=85
│ └── directly calls com.oracle.svm.core.JavaMainWrapper.run(int, org.graalvm.nativeimage.c.type.CCharPointerPointer):int id=693 @bci=2
│ └── directly calls com.oracle.svm.core.JavaMainWrapper.runCore():int id=1029 @bci=0
│ ├── directly calls CallTree.main(java.lang.String[]):void id=1402 @bci=66
│ │ ├── directly calls CallTree.callA():void id=1973 @bci=0
│ │ │ ├── directly calls CallTree.callB(boolean):void id=2939 @bci=1
│ │ │ │ └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=5
│ │ │ └── directly calls CallTree.callB(boolean):void id-ref=2939 @bci=5
│ │ ├── directly calls CallTree.callW():void id=1974 @bci=3
│ │ │ └── directly calls CallTree.callD(boolean):void id=2940 @bci=1
│ │ │ ├── directly calls CallTree.callC():void id=3797 @bci=4
│ │ │ │ └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=5
│ │ │ │ └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938
│ │ │ └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=15
│ │ │ └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938
│ │ ├── directly calls CallTree.callX():void id=1975 @bci=6
│ │ │ └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=1
│ │ └── directly calls CallTree.callZ():void id=1976 @bci=9
│ │ └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=
while I would expect something like the following:
├── entry com.oracle.svm.core.code.IsolateEnterStub.JavaMainWrapper_run_5087f5482cc9a6abc971913ece43acb471d2631b(int, org.graalvm.nativeimage.c.type.CCharPointerPointer):int id=85
│ └── directly calls com.oracle.svm.core.JavaMainWrapper.run(int, org.graalvm.nativeimage.c.type.CCharPointerPointer):int id=693 @bci=2
│ └── directly calls com.oracle.svm.core.JavaMainWrapper.runCore():int id=1029 @bci=0
│ ├── directly calls CallTree.main(java.lang.String[]):void id=1402 @bci=66
│ │ ├── directly calls CallTree.callA():void id=1973 @bci=0
│ │ │ ├── directly calls CallTree.callB(boolean):void id=2939 @bci=1
│ │ │ │ └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=5
│ │ │ │ └── directly calls CallTree.callC():void id=3797 @bci=4
│ │ │ │ └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=5
│ │ │ │ └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938
│ │ │ └── directly calls CallTree.callB(boolean):void id-ref=2939 @bci=5
│ │ ├── directly calls CallTree.callW():void id=1974 @bci=3
│ │ │ └── directly calls CallTree.callD(boolean):void id=2940 @bci=1
│ │ │ └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=15
│ │ │ └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938
│ │ ├── directly calls CallTree.callX():void id=1975 @bci=6
│ │ │ └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=1
│ │ │ └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=15
│ │ │ └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938
│ │ └── directly calls CallTree.callZ():void id=1976 @bci=9
│ │ └── directly calls CallTree.callD(boolean):void id-ref=2940 @bci=
│ │ └── virtually calls java.io.PrintStream.println(java.lang.String):void @bci=15
│ │ └── is overridden by java.io.PrintStream.println(java.lang.String):void id-ref=938
Steps to reproduce the issue
Please include both build steps as well as run steps
- Copy the above Java example to CallTree.java
javac CallTree.java
native-image -H:+PrintAnalysisCallTree CallTree
grep -C10 CallTree reports/call_tree_calltree_*.txt
Describe GraalVM and your environment:
- GraalVM version: CE 21.0.0
- JDK major version: 11
- OS: Fedora 33
- Architecture: AMD64