[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