[vmkit-commits] [vmkit] r137022 - in /vmkit/trunk/lib: J3/VMCore/JavaClass.cpp J3/VMCore/JavaClass.h J3/VMCore/Jnjvm.cpp J3/VMCore/JnjvmClassLoader.h J3/VMCore/Precompiled.cpp Mvm/StaticGCPrinter/VmkitGCPrinter.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Aug 6 11:17:11 PDT 2011


Author: geoffray
Date: Sat Aug  6 13:17:11 2011
New Revision: 137022

URL: http://llvm.org/viewvc/llvm-project?rev=137022&view=rev
Log:
No need to read the frames when reading precompiled methods: the JavaMethod metadata is already encoded.


Modified:
    vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
    vmkit/trunk/lib/J3/VMCore/JavaClass.h
    vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
    vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
    vmkit/trunk/lib/J3/VMCore/Precompiled.cpp
    vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.cpp?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.cpp Sat Aug  6 13:17:11 2011
@@ -1737,15 +1737,6 @@
 }
 
 
-void JavaMethod::updateFrames() {
-  mvm::FrameIterator iterator(*frames);
-
-  while (iterator.hasNext()) {
-    mvm::FrameInfo* frame = iterator.next();
-    frame->Metadata = this;
-  }
-}
-
 void Class::acquire() {
   JavaObject* delegatee = NULL;
   llvm_gcroot(delegatee, 0);

Modified: vmkit/trunk/lib/J3/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JavaClass.h?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JavaClass.h Sat Aug  6 13:17:11 2011
@@ -902,10 +902,6 @@
   ///
   uint32 offset;
 
-  /// updateFrames - Set the meta information on frames.
-  ///
-  void updateFrames();
-
   /// lookupAttribut - Look up an attribut in the method's attributs. Returns
   /// null if the attribut is not found.
   ///

Modified: vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Jnjvm.cpp Sat Aug  6 13:17:11 2011
@@ -1326,8 +1326,6 @@
   bootstrapLoader = loader;
   upcalls = bootstrapLoader->upcalls;
   throwable = upcalls->newThrowable;
-
-  Precompiled::ReadFrames(this, this->bootstrapLoader);
 }
 
 Jnjvm::~Jnjvm() {

Modified: vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/J3/VMCore/JnjvmClassLoader.h Sat Aug  6 13:17:11 2011
@@ -426,7 +426,6 @@
 class Precompiled {
  public:
   static bool Init(JnjvmBootstrapLoader* loader);
-  static void ReadFrames(Jnjvm* vm, JnjvmClassLoader* loader);
 };
 
 /// VMClassLoader - The vmdata object that will be placed in and will only

Modified: vmkit/trunk/lib/J3/VMCore/Precompiled.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/J3/VMCore/Precompiled.cpp?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/J3/VMCore/Precompiled.cpp (original)
+++ vmkit/trunk/lib/J3/VMCore/Precompiled.cpp Sat Aug  6 13:17:11 2011
@@ -121,29 +121,6 @@
 }
 
 
-void Precompiled::ReadFrames(Jnjvm* vm, JnjvmClassLoader* loader) {
-  for (ClassMap::iterator i = loader->getClasses()->map.begin(),
-       e = loader->getClasses()->map.end(); i != e; ++i) {
-    CommonClass* cl = i->second;
-    if (cl->isClass()) {
-      Class* C = cl->asClass(); 
-      for (uint32 i = 0; i < C->nbVirtualMethods; ++i) {
-        JavaMethod& meth = C->virtualMethods[i];
-        if (meth.code != NULL) {
-          meth.updateFrames();
-        }
-      }
-      
-      for (uint32 i = 0; i < C->nbStaticMethods; ++i) {
-        JavaMethod& meth = C->staticMethods[i];
-        if (meth.code != NULL) {
-          meth.updateFrames();
-        }
-      }
-    }
-  }
-}
-
 bool Precompiled::Init(JnjvmBootstrapLoader* loader) {
   Class* javaLangObject = (Class*)dlsym(SELF_HANDLE, "java_lang_Object");
   void* nativeHandle = SELF_HANDLE;

Modified: vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp?rev=137022&r1=137021&r2=137022&view=diff
==============================================================================
--- vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp (original)
+++ vmkit/trunk/lib/Mvm/StaticGCPrinter/VmkitGCPrinter.cpp Sat Aug  6 13:17:11 2011
@@ -7,6 +7,9 @@
 //
 //===----------------------------------------------------------------------===//
 
+#include "llvm/Constants.h"
+#include "llvm/DerivedTypes.h"
+#include "llvm/Type.h"
 #include "llvm/CodeGen/GCs.h"
 #include "llvm/CodeGen/GCStrategy.h"
 #include "llvm/CodeGen/AsmPrinter.h"
@@ -24,7 +27,9 @@
 #include "llvm/Support/Compiler.h"
 #include "llvm/Support/ErrorHandling.h"
 #include "llvm/Support/FormattedStream.h"
+#include "llvm/Support/raw_ostream.h"
 #include <cctype>
+#include <cstdio>
 
 using namespace llvm;
 
@@ -112,6 +117,37 @@
   AP.OutStreamer.EmitLabel(Sym);
 }
 
+Constant* FindMetadata(const Function& F) {
+  LLVMContext& context = F.getParent()->getContext();
+  for (Value::const_use_iterator I = F.use_begin(), E = F.use_end(); I != E; ++I) {
+    if (const Constant* C = dyn_cast<Constant>(*I)) {
+      if (PointerType* PTy = dyn_cast<PointerType>(C->getType())) {
+        if (isa<IntegerType>(PTy->getContainedType(0))) {
+          // We have found the bitcast constant that casts the method in a i8*
+          for (Value::const_use_iterator CI = C->use_begin(), CE = C->use_end(); CI != CE; ++CI) {
+            if (StructType* STy = dyn_cast<StructType>((*CI)->getType())) {
+              if (STy->getName().equals("JavaMethod")) {
+                const Constant* Method = dyn_cast<Constant>(*CI);
+                const Constant* Array = dyn_cast<Constant>(*((*CI)->use_begin()));
+                Constant* VirtualMethods = dyn_cast<Constant>(const_cast<User*>((*(Array->use_begin()))));
+                uint32_t index = 0;
+                for (; index < Array->getNumOperands(); index++) {
+                  if (Array->getOperand(index) == Method) break;
+                }
+                assert(index != Array->getNumOperands());
+                Constant* GEPs[2] = { ConstantInt::get(Type::getInt32Ty(context), 0),
+                                      ConstantInt::get(Type::getInt32Ty(context), index) };
+                return ConstantExpr::getGetElementPtr(VirtualMethods, GEPs, 2);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+  return NULL;
+}
+
 /// emitAssembly - Print the frametable. The ocaml frametable format is thus:
 ///
 ///   extern "C" struct align(sizeof(intptr_t)) {
@@ -146,6 +182,8 @@
   for (iterator I = begin(), IE = end(); I != IE; ++I) {
     GCFunctionInfo &FI = **I;
 
+    Constant* Metadata = FindMetadata(FI.getFunction());
+
     // Emit the frame symbol
     SmallString<128> TmpStr;
     AP.Mang->getNameWithPrefix(TmpStr, FI.getFunction().getName() + "_frame");
@@ -189,11 +227,16 @@
       DebugLoc DL = J->Loc;
       uint32_t sourceIndex = DL.getLine();
 
-      // Metada
-      AP.EmitInt32(0);
-      if (IntPtrSize == 8) {
+      // Metadata
+      if (Metadata != NULL) {
+        AP.EmitGlobalConstant(Metadata);
+      } else {
         AP.EmitInt32(0);
+        if (IntPtrSize == 8) {
+          AP.EmitInt32(0);
+        }
       }
+
       // Return address
       AP.OutStreamer.EmitSymbolValue(J->Label, IntPtrSize, 0);
       AP.EmitInt16(sourceIndex);





More information about the vmkit-commits mailing list