[vmkit-commits] [vmkit] r62510 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmClassLoader.cpp JnjvmModule.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Mon Jan 19 05:43:06 PST 2009
Author: geoffray
Date: Mon Jan 19 07:43:06 2009
New Revision: 62510
URL: http://llvm.org/viewvc/llvm-project?rev=62510&view=rev
Log:
Do not set staticFields and staticMethods statically: LLVM could align the
array so that the assembly can reference in the middle of it. Rather
initialize the fields at runtime, when adding the class to a classloader.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp?rev=62510&r1=62509&r2=62510&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Mon Jan 19 07:43:06 2009
@@ -1010,6 +1010,13 @@
// Extern "C" functions called by the vmjc static intializer.
extern "C" void vmjcAddPreCompiledClass(JnjvmClassLoader* JCL,
CommonClass* cl) {
+ // To avoid data alignment in the llvm assembly emitter, we set the
+ // staticMethods and staticFields fields here.
+ if (cl->isClass()) {
+ Class* realCl = cl->asClass();
+ realCl->staticMethods = realCl->virtualMethods + realCl->nbVirtualMethods;
+ realCl->staticFields = realCl->virtualFields + realCl->nbVirtualFields;
+ }
JCL->getClasses()->map.insert(std::make_pair(cl->name, cl));
cl->classLoader = JCL;
}
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=62510&r1=62509&r2=62510&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Mon Jan 19 07:43:06 2009
@@ -1061,14 +1061,9 @@
ClassElts.push_back(nbVirtualFields);
// staticFields
- if (cl->nbStaticFields + cl->nbVirtualFields) {
-
- Constant* I[1] = { nbVirtualFields };
- Constant* C = ConstantExpr::getGetElementPtr(fields, I, 1);
- ClassElts.push_back(C);
- } else {
- ClassElts.push_back(Constant::getNullValue(JavaFieldType));
- }
+ // Output null, this will be set in the initializer. Otherwise, the
+ // assembly emitter of LLVM will try to align the data.
+ ClassElts.push_back(Constant::getNullValue(JavaFieldType));
// nbStaticFields
ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbStaticFields));
@@ -1114,13 +1109,8 @@
ClassElts.push_back(nbVirtualMethods);
// staticMethods
- if (cl->nbStaticMethods + cl->nbVirtualMethods) {
- Constant* I[1] = { nbVirtualMethods };
- Constant* C = ConstantExpr::getGetElementPtr(methods, I, 1);
- ClassElts.push_back(C);
- } else {
- ClassElts.push_back(Constant::getNullValue(JavaMethodType));
- }
+ // Output null, this will be set in the initializer.
+ ClassElts.push_back(Constant::getNullValue(JavaMethodType));
// nbStaticMethods
ClassElts.push_back(ConstantInt::get(Type::Int16Ty, cl->nbStaticMethods));
More information about the vmkit-commits
mailing list