I am currently working with vmkit (especially on J3) for a student project,
I want to made some experimentations on J3.
I see in the file lib/j3/VMCore/JavaClass.h that if I want to add some attributes in the class JavaClass I must change a few thing in LLVMRuntime/* and in JnjvmModule.cpp.
But JnjvmModule.cpp does not exist anymore. So my first question is : what is the equivalent of JnjvmModule.cpp right now ?
Secondly, I also want to add attributes in class JavaVirtualClass. When I do I immediately got this error :
vmjc: JavaClass.cpp:492: j3::JavaObject *j3::Class::doNew(j3::Jnjvm *): Assertion `this && “No class when allocating.”’ failed.
I tried to change offsets in the class (like getDepthIndex(), getOffsetIndex()) but I still have this error.
Do you know what I must change to fix this ? Maybe that I forgot to made the changes in another file like with JavaClass ?
I also tried to add a field and get the same error as you.
In theory, to add a field in JavaClass or JavaCommonClass you have to put your field at the end of the declaration list (in order to minimize index changes in J3Intrinsics)
in C++ code and in LLVMRuntime/runtime-single.ll
We are working on this issue to see what is going wrong.
The problem is the fact that the error is not deterministic which makes it difficult to solve.
I will tell you more as soon as I solve the issue.
I found out what was missing for adding a field to JavaClass.
While precompiling Java code (JavaAOTCompiler) we create an equivalent LLVM Constant object for each class.
So modifying the internal representation of a class means that you also have to modify the AOTCompiler.
Here is a patch with a tiny example where an int is added to JavaClass.
If you want to add more complex structures, take a look at how intrinsics are managed (J3Intrinsics).
new_field_patch.diff (2.71 KB)
I tested your patch and it works, so thanks
If anyone else wants to do this (add a field in class or vtable) : you must pay attention as keeping the offsets correct in the vtable. You must also change the base size of the virtual table object and add the field at the correct position in JavaAOTCompiler (like in the patch).