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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Wed Jan 7 04:58:47 PST 2009


Author: geoffray
Date: Wed Jan  7 06:58:43 2009
New Revision: 61857

URL: http://llvm.org/viewvc/llvm-project?rev=61857&view=rev
Log:
Bugfix for getMethodInClass.


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

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan  7 06:58:43 2009
@@ -198,54 +198,35 @@
     return ConstantExpr::getIntToPtr(CI, ConstantPoolType);
   }
 }
-#include <iostream>
+
 Constant* JnjvmModule::getMethodInClass(JavaMethod* meth) {
   if (staticCompilation) {
-    method_iterator SI = methods.find(meth);
-    if (SI != methods.end()) {
-      return SI->second;
-    } else {
-      Class* cl = meth->classDef;
-      Constant* MOffset = 0;
-      Constant* COffset = 0;
-      uint32 nbMethods;
-      
-      if (isVirtual(meth->access)) {
-        COffset = ConstantInt::get(Type::Int32Ty, 9);
-        nbMethods = cl->nbVirtualMethods;
-        for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) {
-          if (&cl->virtualMethods[i] == meth) {
-            MOffset = ConstantInt::get(Type::Int32Ty, i);
-            break;
-          }
+    Class* cl = meth->classDef;
+    Constant* MOffset = 0;
+    Constant* Array = 0;
+    if (isVirtual(meth->access)) {
+      method_iterator SI = virtualMethods.find(cl);
+      for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) {
+        if (&cl->virtualMethods[i] == meth) {
+          MOffset = ConstantInt::get(Type::Int32Ty, i);
+          break;
         }
-      } else {
-        COffset = ConstantInt::get(Type::Int32Ty, 11);
-        nbMethods = cl->nbStaticMethods;
-        for (uint32 i = 0; i < cl->nbStaticMethods; ++i) {
-          if (&cl->staticMethods[i] == meth) {
-            MOffset = ConstantInt::get(Type::Int32Ty, i);
-            break;
-          }
+      }
+      Array = SI->second;
+    } else {
+      method_iterator SI = staticMethods.find(cl);
+      for (uint32 i = 0; i < cl->nbStaticMethods; ++i) {
+        if (&cl->staticMethods[i] == meth) {
+          MOffset = ConstantInt::get(Type::Int32Ty, i);
+          break;
         }
       }
-      
-      assert(MOffset && "Offset not found!");
-      Constant* C = getNativeClass(cl);
-
-      Value* Elts[2]  = { constantZero, COffset};
-      Constant* res = ConstantExpr::getGetElementPtr(C, Elts, 2);
-      const Type* ATy = ArrayType::get(JavaMethodType->getContainedType(0),
-                                       nbMethods);
-      ATy = PointerType::getUnqual(ATy);
-      res = ConstantExpr::getBitCast(res, ATy);
-      Elts[0] = constantZero;
-      Elts[1] = MOffset;
-      res = ConstantExpr::getGetElementPtr(res, Elts, 2);
-      methods.insert(std::make_pair(meth, res));
-      return res;
+      Array = SI->second;
     }
     
+    Constant* GEPs[2] = { constantZero, MOffset };
+    return ConstantExpr::getGetElementPtr(Array, GEPs, 2);
+    
   } else {
     ConstantInt* CI = ConstantInt::get(Type::Int64Ty, (int64_t)meth);
     return ConstantExpr::getIntToPtr(CI, JavaMethodType);
@@ -1095,9 +1076,11 @@
 
     Constant* methods = ConstantArray::get(ATy, TempElts);
     TempElts.clear();
-    methods = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage,
-                                 methods, "", this);
-    methods = ConstantExpr::getCast(Instruction::BitCast, methods,
+    GlobalVariable* GV = new GlobalVariable(ATy, false,
+                                            GlobalValue::InternalLinkage,
+                                            methods, "", this);
+    virtualMethods.insert(std::make_pair(cl, GV));
+    methods = ConstantExpr::getCast(Instruction::BitCast, GV,
                                     JavaMethodType);
     ClassElts.push_back(methods);
   } else {
@@ -1118,10 +1101,11 @@
 
     Constant* methods = ConstantArray::get(ATy, TempElts);
     TempElts.clear();
-    methods = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage,
-                                 methods, "", this);
-    methods = ConstantExpr::getCast(Instruction::BitCast, methods,
-                                  JavaMethodType);
+    GlobalVariable* GV = new GlobalVariable(ATy, false,
+                                            GlobalValue::InternalLinkage,
+                                            methods, "", this);
+    staticMethods.insert(std::make_pair(cl, GV));
+    methods = ConstantExpr::getCast(Instruction::BitCast, GV, JavaMethodType);
     ClassElts.push_back(methods);
   } else {
     ClassElts.push_back(Constant::getNullValue(JavaMethodType));

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Jan  7 06:58:43 2009
@@ -191,9 +191,10 @@
   std::map<const Enveloppe*, llvm::Constant*> enveloppes;
   std::map<const JavaMethod*, llvm::Constant*> nativeFunctions;
   std::map<const UTF8*, llvm::Constant*> utf8s;
-  std::map<const JavaMethod*, llvm::Constant*> methods;
+  std::map<const Class*, llvm::GlobalVariable*> virtualMethods;
+  std::map<const Class*, llvm::GlobalVariable*> staticMethods;
   
-  typedef std::map<const JavaMethod*, llvm::Constant*>::iterator
+  typedef std::map<const Class*, llvm::GlobalVariable*>::iterator
     method_iterator;
   
   typedef std::map<const CommonClass*, llvm::Constant*>::iterator





More information about the vmkit-commits mailing list