[vmkit-commits] [vmkit] r61587 - in /vmkit/trunk/lib/JnJVM/VMCore: Jnjvm.cpp JnjvmModule.cpp JnjvmModule.h

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Jan 2 09:05:18 PST 2009


Author: geoffray
Date: Fri Jan  2 11:05:18 2009
New Revision: 61587

URL: http://llvm.org/viewvc/llvm-project?rev=61587&view=rev
Log:
Do not define external values when static compiling.


Modified:
    vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h

Modified: vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp?rev=61587&r1=61586&r2=61587&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Jan  2 11:05:18 2009
@@ -1095,6 +1095,11 @@
 
 
 static void compileClass(Class* cl) {
+  // Use the owner class field of the class so that we know if the class
+  // belongs to the list of classes that we are static compiling.
+  cl->setOwnerClass(JavaThread::get());
+  llvm::Value* LCL = cl->classLoader->getModule()->getNativeClass(cl);
+  cl->classLoader->getModule()->getInitializationState(LCL);
 
   for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) {
     JavaMethod& meth = cl->virtualMethods[i];

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61587&r1=61586&r2=61587&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Fri Jan  2 11:05:18 2009
@@ -87,6 +87,12 @@
 llvm::ConstantInt*  JnjvmModule::JavaObjectLockOffsetConstant;
 llvm::ConstantInt*  JnjvmModule::JavaObjectClassOffsetConstant;
 
+
+static bool isCompiling(Class* cl) {
+  // A class is being static compiled if owner class is not null.
+  return (cl->getOwnerClass() != 0);
+}
+
 Constant* JnjvmModule::getNativeClass(CommonClass* classDef) {
 
   if (staticCompilation) {
@@ -109,16 +115,18 @@
       
       nativeClasses.insert(std::make_pair(classDef, varGV));
 
-      Constant* C = 0;
-      if (classDef->isClass()) {
-        C = CreateConstantFromClass((Class*)classDef);
-      } else if (classDef->isPrimitive()) {
-        C = CreateConstantFromClassPrimitive((ClassPrimitive*)classDef);
-      } else {
-        C = CreateConstantFromClassArray((ClassArray*)classDef);
-      }
+      if (classDef->isClass() && isCompiling(classDef->asClass())) {
+        Constant* C = 0;
+        if (classDef->isClass()) {
+          C = CreateConstantFromClass((Class*)classDef);
+        } else if (classDef->isPrimitive()) {
+          C = CreateConstantFromClassPrimitive((ClassPrimitive*)classDef);
+        } else {
+          C = CreateConstantFromClassArray((ClassArray*)classDef);
+        }
 
-      varGV->setInitializer(C);
+        varGV->setInitializer(C);
+      }
 
       return varGV;
 
@@ -246,7 +254,9 @@
                                             JavaObjectType);
     
       javaClasses.insert(std::make_pair(cl, res));
-      varGV->setInitializer(CreateConstantFromJavaClass(cl));
+      if (cl->isClass() && isCompiling(cl->asClass())) {
+        varGV->setInitializer(CreateConstantFromJavaClass(cl));
+      }
       return res;
     } else {
       return I->second;
@@ -309,6 +319,11 @@
     virtual_table_iterator End = virtualTables.end();
     virtual_table_iterator I = virtualTables.find(classDef);
     if (I == End) {
+      
+      if (isCompiling(classDef)) {
+        classDef->virtualVT = makeVT(classDef);
+      }
+
       const ArrayType* ATy = dyn_cast<ArrayType>(VTType->getContainedType(0));
       const PointerType* PTy = dyn_cast<PointerType>(ATy->getContainedType(0));
       ATy = ArrayType::get(PTy, classDef->virtualTableSize);
@@ -318,13 +333,16 @@
     
       res = ConstantExpr::getCast(Instruction::BitCast, varGV, VTType);
       virtualTables.insert(std::make_pair(classDef, res));
-     
-      Function* Finalizer = ((Function**)classDef->virtualVT)[0];
-      Function* Tracer = LCI->getVirtualTracer();
-      Constant* C = CreateConstantFromVT(classDef->virtualVT,
-                                         classDef->virtualTableSize, Finalizer,
-                                         Tracer);
-      varGV->setInitializer(C);
+    
+      if (isCompiling(classDef)) {
+        classDef->virtualVT = makeVT(classDef);
+        Function* Finalizer = ((Function**)classDef->virtualVT)[0];
+        Function* Tracer = LCI->getVirtualTracer();
+        Constant* C = CreateConstantFromVT(classDef->virtualVT,
+                                           classDef->virtualTableSize,
+                                           Finalizer, Tracer);
+        varGV->setInitializer(C);
+      }
       
       return res;
     } else {
@@ -1076,7 +1094,7 @@
   ClassElts.push_back(Constant::getNullValue(ptrType));
 
   // staticTracer
-  Function* F = (Function*)(uintptr_t)cl->staticTracer;
+  Function* F = makeTracer(cl, true);
   const Type* FTy = STy->getContainedType(STy->getNumContainedTypes() - 1);
   Constant* staticTracer = ConstantExpr::getCast(Instruction::BitCast, F, FTy);
   ClassElts.push_back(staticTracer);
@@ -1169,6 +1187,10 @@
   memcpy(VT, JavaObjectVT, VT_SIZE);
 #else
   if (cl->super) {
+    if (isStaticCompiling() && !cl->super->virtualVT) {
+      cl->super->virtualVT = makeVT(cl->super);
+    }
+
     cl->virtualTableSize = cl->super->virtualTableSize;
   } else {
     cl->virtualTableSize = VT_NB_FUNCS;
@@ -1284,9 +1306,10 @@
     virtualSizeConstant = ConstantInt::get(Type::Int32Ty, size);
     
     JnjvmModule* Mod = classDef->classLoader->getModule();
-    classDef->virtualVT = Mod->makeVT((Class*)classDef);
+    if (!Mod->isStaticCompiling()) {
+      classDef->virtualVT = Mod->makeVT((Class*)classDef);
+    }
   
-
   }
 
   return virtualType;
@@ -1321,10 +1344,8 @@
     cl->staticSize = size;
     
     JnjvmModule* Mod = cl->classLoader->getModule();
-    Function* F = Mod->makeTracer(cl, true);
-    if (Mod->isStaticCompiling()) {
-      cl->staticTracer = (void (*)(void*)) (uintptr_t) F;
-    } else {
+    if (!Mod->isStaticCompiling()) {
+      Function* F = Mod->makeTracer(cl, true);
       cl->staticTracer = (void (*)(void*)) (uintptr_t)
         Mod->executionEngine->getPointerToFunction(F);
       F->deleteBody();

Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61587&r1=61586&r2=61587&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Fri Jan  2 11:05:18 2009
@@ -421,7 +421,9 @@
   llvm::Value* getIsolate(Jnjvm* vm, llvm::Value* Where);
 #endif
   
-  
+
+  void cleanupStaticCompiler(JnjvmClassLoader* loader);
+
 private:
   static llvm::Module* initialModule;
   





More information about the vmkit-commits mailing list