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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Fri Nov 6 16:12:02 PST 2009


Author: geoffray
Date: Fri Nov  6 18:12:01 2009
New Revision: 86309

URL: http://llvm.org/viewvc/llvm-project?rev=86309&view=rev
Log:
Add mising llvm.gcroots.


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

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/Jnjvm.cpp Fri Nov  6 18:12:01 2009
@@ -261,19 +261,26 @@
 JavaObject* Jnjvm::CreateError(UserClass* cl, JavaMethod* init,
                                const char* str) {
   JavaObject* obj = cl->doNew(this);
+  llvm_gcroot(obj, 0);
   init->invokeIntSpecial(this, cl, obj, str ? asciizToStr(str) : 0);
   return obj;
 }
 
 JavaObject* Jnjvm::CreateError(UserClass* cl, JavaMethod* init,
                                JavaString* str) {
-  JavaObject* obj = cl->doNew(this);
+  JavaObject* obj = 0;
+  llvm_gcroot(str, 0);
+  llvm_gcroot(obj, 0);
+  obj = cl->doNew(this);
   init->invokeIntSpecial(this, cl, obj, str);
   return obj;
 }
 
 void Jnjvm::error(UserClass* cl, JavaMethod* init, JavaString* str) {
-  JavaObject* obj = CreateError(cl, init, str);
+  JavaObject* obj = 0;
+  llvm_gcroot(obj, 0);
+  llvm_gcroot(str, 0);
+  obj = CreateError(cl, init, str);
   JavaThread::get()->throwException(obj);
 }
 
@@ -286,6 +293,7 @@
   JavaString* str = (JavaString*)
     upcalls->IntToString->invokeJavaObjectStatic(this, upcalls->intClass,
                                                  entry, 10);
+  llvm_gcroot(str, 0);
   error(upcalls->ArrayIndexOutOfBoundsException,
         upcalls->InitArrayIndexOutOfBoundsException, str);
 }
@@ -294,6 +302,7 @@
   JavaString* str = (JavaString*)
     upcalls->IntToString->invokeJavaObjectStatic(this, upcalls->intClass,
                                                  size, 10);
+  llvm_gcroot(str, 0);
   error(upcalls->NegativeArraySizeException,
         upcalls->InitNegativeArraySizeException, str);
 }
@@ -307,6 +316,7 @@
   JavaString* str = (JavaString*)
     upcalls->IntToString->invokeJavaObjectStatic(this, upcalls->intClass,
                                                  entry, 10);
+  llvm_gcroot(str, 0);
   return CreateError(upcalls->ArrayIndexOutOfBoundsException,
                      upcalls->InitArrayIndexOutOfBoundsException, str);
 }
@@ -318,13 +328,16 @@
 }
 
 JavaObject* Jnjvm::CreateUnsatisfiedLinkError(JavaMethod* meth) {
+  JavaString* str = constructString(meth->toString());
+  llvm_gcroot(str, 0);
   return CreateError(upcalls->UnsatisfiedLinkError,
                      upcalls->InitUnsatisfiedLinkError,
-                     constructString(meth->toString()));
+                     str);
 }
 
 JavaObject* Jnjvm::CreateArithmeticException() {
   JavaString* str = asciizToStr("/ by zero");
+  llvm_gcroot(str, 0);
   return CreateError(upcalls->ArithmeticException,
                      upcalls->InitArithmeticException, str);
 }
@@ -337,6 +350,7 @@
 
 JavaObject* Jnjvm::CreateOutOfMemoryError() {
   JavaString* str = asciizToStr("Java heap space");
+  llvm_gcroot(str, 0);
   return CreateError(upcalls->OutOfMemoryError,
                      upcalls->InitOutOfMemoryError, str);
 }
@@ -344,18 +358,21 @@
 JavaObject* Jnjvm::CreateStackOverflowError() {
   // Don't call init, or else we'll get a new stack overflow error.
   JavaObject* obj = upcalls->StackOverflowError->doNew(this);
+  llvm_gcroot(obj, 0);
   ((JavaObjectThrowable*)obj)->fillInStackTrace();
   return obj;
 }
 
 JavaObject* Jnjvm::CreateArrayStoreException(JavaVirtualTable* VT) {
   JavaString* str = JavaString::internalToJava(VT->cl->name, this);
+  llvm_gcroot(str, 0);
   return CreateError(upcalls->ArrayStoreException,
                      upcalls->InitArrayStoreException, str);
 }
 
 JavaObject* Jnjvm::CreateClassCastException(JavaObject* obj,
                                             UserCommonClass* cl) {
+  llvm_gcroot(obj, 0);
   return CreateError(upcalls->ClassCastException,
                      upcalls->InitClassCastException,
                      (JavaString*)0);
@@ -363,23 +380,27 @@
 
 JavaObject* Jnjvm::CreateLinkageError(const char* msg) {
   JavaString* str = asciizToStr(msg);
+  llvm_gcroot(str, 0);
   return CreateError(upcalls->LinkageError,
                      upcalls->InitLinkageError, str);
 }
 
 void Jnjvm::illegalAccessException(const char* msg) {
   JavaString* str = asciizToStr(msg);
+  llvm_gcroot(str, 0);
   error(upcalls->IllegalAccessException,
         upcalls->InitIllegalAccessException, str);
 }
 
 void Jnjvm::illegalMonitorStateException(const JavaObject* obj) {
+  llvm_gcroot(obj, 0);
   error(upcalls->IllegalMonitorStateException,
         upcalls->InitIllegalMonitorStateException,
         (JavaString*)0);
 }
 
 void Jnjvm::interruptedException(const JavaObject* obj) {
+  llvm_gcroot(obj, 0);
   error(upcalls->InterruptedException,
         upcalls->InitInterruptedException,
         (JavaString*)0);
@@ -387,12 +408,14 @@
 
 
 void Jnjvm::initializerError(const JavaObject* excp) {
+  llvm_gcroot(excp, 0);
   errorWithExcp(upcalls->ExceptionInInitializerError,
                 upcalls->ErrorWithExcpExceptionInInitializerError,
                 excp);
 }
 
 void Jnjvm::invocationTargetException(const JavaObject* excp) {
+  llvm_gcroot(excp, 0);
   errorWithExcp(upcalls->InvocationTargetException,
                 upcalls->ErrorWithExcpInvocationTargetException,
                 excp);
@@ -400,23 +423,27 @@
 
 void Jnjvm::outOfMemoryError() {
   JavaString* str = asciizToStr("Java heap space");
+  llvm_gcroot(str, 0);
   error(upcalls->OutOfMemoryError,
         upcalls->InitOutOfMemoryError, str);
 }
 
 void Jnjvm::illegalArgumentException(const char* msg) {
   JavaString* str = asciizToStr(msg);
+  llvm_gcroot(str, 0);
   error(upcalls->IllegalArgumentException,
         upcalls->InitIllegalArgumentException, str);
 }
 
 void Jnjvm::classCastException(JavaObject* obj, UserCommonClass* cl) {
+  llvm_gcroot(obj, 0);
   error(upcalls->ClassCastException,
         upcalls->InitClassCastException,
         (JavaString*)0);
 }
 
 void Jnjvm::noClassDefFoundError(JavaObject* obj) {
+  llvm_gcroot(obj, 0);
   errorWithExcp(upcalls->NoClassDefFoundError,
         upcalls->ErrorWithExcpNoClassDefFoundError, 
         obj);
@@ -424,12 +451,14 @@
 
 void Jnjvm::instantiationException(UserCommonClass* cl) {
   JavaString* str = internalUTF8ToStr(cl->name);
+  llvm_gcroot(str, 0);
   error(upcalls->InstantiationException, upcalls->InitInstantiationException,
         str);
 }
 
 void Jnjvm::instantiationError(UserCommonClass* cl) {
   JavaString* str = internalUTF8ToStr(cl->name);
+  llvm_gcroot(str, 0);
   error(upcalls->InstantiationError, upcalls->InitInstantiationError, str);
 }
   
@@ -438,6 +467,9 @@
                                    Jnjvm* vm) {
   ArrayUInt16* msg = (ArrayUInt16*)
     vm->upcalls->ArrayOfChar->doNew(19 + cl->name->size + name->size, vm);
+  JavaString* str = 0;
+  llvm_gcroot(msg, 0);
+  llvm_gcroot(str, 0);
 
   uint32 i = 0;
 
@@ -471,19 +503,21 @@
     else msg->elements[i++] = cl->name->elements[j];
   }
 
-  JavaString* str = vm->constructString(msg);
+  str = vm->constructString(msg);
 
   return str;
 }
 
 void Jnjvm::noSuchFieldError(CommonClass* cl, const UTF8* name) { 
   JavaString* str = CreateNoSuchMsg(cl, name, this);
+  llvm_gcroot(str, 0);
   error(upcalls->NoSuchFieldError,
         upcalls->InitNoSuchFieldError, str);
 }
 
 void Jnjvm::noSuchMethodError(CommonClass* cl, const UTF8* name) {
   JavaString* str = CreateNoSuchMsg(cl, name, this);
+  llvm_gcroot(str, 0);
   error(upcalls->NoSuchMethodError,
         upcalls->InitNoSuchMethodError, str);
 }
@@ -491,6 +525,9 @@
 static JavaString* CreateUnableToLoad(const UTF8* name, Jnjvm* vm) {
   ArrayUInt16* msg = (ArrayUInt16*)
     vm->upcalls->ArrayOfChar->doNew(15 + name->size, vm);
+  JavaString* str = 0;
+  llvm_gcroot(msg, 0);
+  llvm_gcroot(str, 0);
   uint32 i = 0;
 
 
@@ -515,14 +552,17 @@
     else msg->elements[i++] = name->elements[j];
   }
 
-  JavaString* str = vm->constructString(msg);
+  str = vm->constructString(msg);
 
   return str;
 }
 
 static JavaString* CreateUnableToLoad(JavaString* name, Jnjvm* vm) {
+  JavaString* str = 0;
   ArrayUInt16* msg = (ArrayUInt16*)
     vm->upcalls->ArrayOfChar->doNew(15 + name->count, vm);
+  llvm_gcroot(msg, 0);
+  llvm_gcroot(str, 0);
   uint32 i = 0;
 
 
@@ -547,7 +587,7 @@
     else msg->elements[i++] = name->value->elements[j];
   }
 
-  JavaString* str = vm->constructString(msg);
+  str = vm->constructString(msg);
 
   return str;
 }
@@ -556,12 +596,14 @@
 
 void Jnjvm::noClassDefFoundError(const UTF8* name) {
   JavaString* str = CreateUnableToLoad(name, this);
+  llvm_gcroot(str, 0);
   error(upcalls->NoClassDefFoundError,
         upcalls->InitNoClassDefFoundError, str);
 }
 
 void Jnjvm::classNotFoundException(JavaString* name) {
   JavaString* str = CreateUnableToLoad(name, this);
+  llvm_gcroot(str, 0);
   error(upcalls->ClassNotFoundException,
         upcalls->InitClassNotFoundException, str);
 }
@@ -569,6 +611,9 @@
 void Jnjvm::classFormatError(UserClass* cl, const UTF8* name) {
   uint32 size = 35 + name->size + cl->name->size;
   ArrayUInt16* msg = (ArrayUInt16*)upcalls->ArrayOfChar->doNew(size, this);
+  JavaString* str = 0;
+  llvm_gcroot(msg, 0);
+  llvm_gcroot(str, 0);
   uint32 i = 0;
 
 
@@ -621,13 +666,14 @@
  
   assert(i == size && "Array overflow");
 
-  JavaString* str = constructString(msg);
+  str = constructString(msg);
   error(upcalls->ClassFormatError, upcalls->InitClassFormatError, str);
 }
 
 
 void Jnjvm::classFormatError(const char* msg) {
   JavaString* str = asciizToStr(msg);
+  llvm_gcroot(str, 0);
   error(upcalls->ClassFormatError, upcalls->InitClassFormatError, str);
 }
 
@@ -646,13 +692,16 @@
 }
 
 JavaString* Jnjvm::constructString(const ArrayUInt16* array) { 
+  llvm_gcroot(array, 0);
   JavaString* res = hashStr.lookupOrCreate(array, this, JavaString::stringDup);
   return res;
 }
 
 JavaString* Jnjvm::asciizToStr(const char* asciiz) {
   assert(asciiz && "No asciiz given");
-  ArrayUInt16* var = asciizToArray(asciiz);
+  ArrayUInt16* var = 0;
+  llvm_gcroot(var, 0);
+  var = asciizToArray(asciiz);
   return constructString(var);
 }
 
@@ -685,6 +734,7 @@
 }
 
 JavaObject* const* UserCommonClass::getClassDelegateePtr(Jnjvm* vm, JavaObject* pd) {
+  llvm_gcroot(pd, 0);
   // Make sure it's created.
   getClassDelegatee(vm, pd);
   return getDelegateePtr();
@@ -692,7 +742,7 @@
 
 //===----------------------------------------------------------------------===//
 // The command line parsing tool does not manipulate any GC-allocated objects.
-//
+// The ArrayUInt8 is allocated with malloc and free'd after parsing.
 //===----------------------------------------------------------------------===//
 
 #define PATH_MANIFEST "META-INF/MANIFEST.MF"

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.cpp Fri Nov  6 18:12:01 2009
@@ -21,5 +21,6 @@
 using namespace jnjvm;
 
 void StringMap::insert(JavaString* str) {
+  llvm_gcroot(str, 0);
   map.insert(std::make_pair(str->value, str));
 }

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LockedMap.h Fri Nov  6 18:12:01 2009
@@ -55,7 +55,25 @@
   }
 };
 
-template<class Key, class Container, class Compare, class Meta, class TLock>
+  class MapNoGC {
+  public:
+    static void gcroot(void* val, void* unused) 
+      __attribute__ ((always_inline)) {}
+
+  };  
+  
+  class MapWithGC {
+  public:
+    static void gcroot(void* val, void* unused) 
+      __attribute__ ((always_inline)) {
+      llvm_gcroot(val, unused);
+    }   
+    
+  };  
+
+
+template<class Key, class Container, class Compare, class Meta, class TLock,
+         class IsGC>
 class LockedMap : public mvm::PermanentObject {
 public:
   typedef typename std::map<const Key, Container, Compare>::iterator iterator;
@@ -66,6 +84,8 @@
            gc_allocator<std::pair<const Key, Container> > > map;
   
   inline Container lookupOrCreate(Key& V, Meta meta, funcCreate func) {
+    Container res = 0;
+    IsGC::gcroot(res, 0);
     lock.lock();
     iterator End = map.end();
     iterator I = map.find(V);
@@ -87,12 +107,14 @@
   }
   
   inline void remove(Key V, Container C) {
+    IsGC::gcroot(C, 0);
     lock.lock();
     removeUnlocked(V, C); 
     lock.unlock();
   }
   
   inline void removeUnlocked(Key V, Container C) {
+    IsGC::gcroot(C, 0);
     iterator End = map.end();
     iterator I = map.find(V);
     
@@ -109,6 +131,7 @@
   }
 
   inline void hash(Key k, Container c) {
+    IsGC::gcroot(c, 0);
     lock.lock();
     map.insert(std::make_pair(k, c));
     lock.unlock();
@@ -119,7 +142,7 @@
 
 class ClassMap : 
   public LockedMap<const UTF8*, UserCommonClass*, ltutf8, JnjvmClassLoader*,
-                   mvm::LockRecursive > {
+                   mvm::LockRecursive, MapNoGC > {
 
 #ifdef USE_GC_BOEHM
 public:
@@ -131,7 +154,7 @@
 
 class StringMap :
   public LockedMap<const ArrayUInt16*, JavaString*, ltarray16, Jnjvm*,
-                   mvm::LockNormal> {
+                   mvm::LockNormal, MapWithGC> {
 
 public:
   void insert(JavaString* str);





More information about the vmkit-commits mailing list