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

Nicolas Geoffray nicolas.geoffray at lip6.fr
Sat Jan 3 15:43:53 PST 2009


Author: geoffray
Date: Sat Jan  3 17:43:53 2009
New Revision: 61616

URL: http://llvm.org/viewvc/llvm-project?rev=61616&view=rev
Log:
Provide static values for native class arrays so that static-compiled code
can reference them directly.



Modified:
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp
    vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h
    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=61616&r1=61615&r2=61616&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.cpp Sat Jan  3 17:43:53 2009
@@ -46,6 +46,15 @@
 
 using namespace jnjvm;
 
+ClassArray ArrayOfBool;
+ClassArray ArrayOfByte;
+ClassArray ArrayOfChar;
+ClassArray ArrayOfShort;
+ClassArray ArrayOfInt;
+ClassArray ArrayOfFloat;
+ClassArray ArrayOfDouble;
+ClassArray ArrayOfLong;
+
 JnjvmBootstrapLoader::JnjvmBootstrapLoader(bool staticCompilation) {
   
   TheModule = new JnjvmModule("Bootstrap JnJVM", staticCompilation);
@@ -81,7 +90,8 @@
   upcalls->OfChar = UPCALL_PRIMITIVE_CLASS(this, "char", 2);
   
   // Create the char array.
-  upcalls->ArrayOfChar = constructArray(utf8OfChar, upcalls->OfChar);
+  upcalls->ArrayOfChar = constructPrimitiveArray(ArrayOfChar, utf8OfChar,
+                                                 upcalls->OfChar);
 
   // Alright, now we can repair the damage: set the class to the UTF8s created
   // and set the array class of UTF8s.
@@ -91,8 +101,9 @@
  
   // Create the byte array, so that bytes for classes can be created.
   upcalls->OfByte = UPCALL_PRIMITIVE_CLASS(this, "byte", 1);
-  upcalls->ArrayOfByte = constructArray(asciizConstructUTF8("[B"),
-                                        upcalls->OfByte);
+  upcalls->ArrayOfByte = constructPrimitiveArray(ArrayOfByte,
+                                                 asciizConstructUTF8("[B"),
+                                                 upcalls->OfByte);
 
   InterfacesArray = 
     (Class**)allocator.Allocate(2 * sizeof(UserClass*));
@@ -130,23 +141,29 @@
   upcalls->OfVoid = UPCALL_PRIMITIVE_CLASS(this, "void", 0);
   
   // And finally create the primitive arrays.
-  upcalls->ArrayOfInt = constructArray(asciizConstructUTF8("[I"),
-                                       upcalls->OfInt);
-  
-  upcalls->ArrayOfBool = constructArray(asciizConstructUTF8("[Z"),
-                                        upcalls->OfBool);
-  
-  upcalls->ArrayOfLong = constructArray(asciizConstructUTF8("[J"),
-                                        upcalls->OfLong);
-  
-  upcalls->ArrayOfFloat = constructArray(asciizConstructUTF8("[F"),
-                                         upcalls->OfFloat);
-  
-  upcalls->ArrayOfDouble = constructArray(asciizConstructUTF8("[D"),
-                                          upcalls->OfDouble);
-  
-  upcalls->ArrayOfShort = constructArray(asciizConstructUTF8("[S"),
-                                         upcalls->OfShort);
+  upcalls->ArrayOfInt = constructPrimitiveArray(ArrayOfInt,
+                                                asciizConstructUTF8("[I"),
+                                                upcalls->OfInt);
+  
+  upcalls->ArrayOfBool = constructPrimitiveArray(ArrayOfBool,
+                                                 asciizConstructUTF8("[Z"),
+                                                 upcalls->OfBool);
+  
+  upcalls->ArrayOfLong = constructPrimitiveArray(ArrayOfLong,
+                                                 asciizConstructUTF8("[J"),
+                                                 upcalls->OfLong);
+  
+  upcalls->ArrayOfFloat = constructPrimitiveArray(ArrayOfFloat,
+                                                  asciizConstructUTF8("[F"),
+                                                  upcalls->OfFloat);
+  
+  upcalls->ArrayOfDouble = constructPrimitiveArray(ArrayOfDouble,
+                                                   asciizConstructUTF8("[D"),
+                                                   upcalls->OfDouble);
+  
+  upcalls->ArrayOfShort = constructPrimitiveArray(ArrayOfShort,
+                                                  asciizConstructUTF8("[S"),
+                                                  upcalls->OfShort);
   
   upcalls->ArrayOfString = 
     constructArray(asciizConstructUTF8("[Ljava/lang/String;"));
@@ -567,6 +584,15 @@
   return res;
 }
 
+ClassArray* 
+JnjvmBootstrapLoader::constructPrimitiveArray(ClassArray& cl, const UTF8* name,
+                                              ClassPrimitive* baseClass) {
+    
+  cl = ClassArray(this, name, baseClass);
+  classes->map.insert(std::make_pair(name, &cl));
+  return &cl;
+}
+
 Typedef* JnjvmClassLoader::internalConstructType(const UTF8* name) {
   short int cur = name->elements[0];
   Typedef* res = 0;

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmClassLoader.h Sat Jan  3 17:43:53 2009
@@ -289,6 +289,11 @@
   /// of byte.
   ///
   ArrayUInt8* openName(const UTF8* utf8);
+  
+  /// constructPrimitiveArray - Hashes the primitive array.
+  ///
+  ClassArray* constructPrimitiveArray(ClassArray& cl, const UTF8* name,
+                                      ClassPrimitive* prim);
 
 public:
   

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

==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Sat Jan  3 17:43:53 2009
@@ -37,6 +37,15 @@
 extern void* ArrayObjectVT[];
 extern void* JavaObjectVT[];
 
+extern ClassArray ArrayOfBool;
+extern ClassArray ArrayOfByte;
+extern ClassArray ArrayOfChar;
+extern ClassArray ArrayOfShort;
+extern ClassArray ArrayOfInt;
+extern ClassArray ArrayOfFloat;
+extern ClassArray ArrayOfDouble;
+extern ClassArray ArrayOfLong;
+
 #ifdef WITH_TRACER
 const llvm::FunctionType* JnjvmModule::MarkAndTraceType = 0;
 #endif
@@ -1878,6 +1887,28 @@
     ReferenceArrayVT = new GlobalVariable(ATy, true, 
                                           GlobalValue::ExternalLinkage,
                                           0, "ArrayObjectVT", this);
+
+
+
+    ATy = JavaClassArrayType->getContainedType(0);
+    GlobalVariable* varGV = 0;
+    
+#define PRIMITIVE_ARRAY(name) \
+    varGV = new GlobalVariable(ATy, true, GlobalValue::ExternalLinkage, \
+                               0, #name, this); \
+    arrayClasses.insert(std::make_pair(&name, varGV));
+    
+    PRIMITIVE_ARRAY(ArrayOfBool)
+    PRIMITIVE_ARRAY(ArrayOfByte)
+    PRIMITIVE_ARRAY(ArrayOfChar)
+    PRIMITIVE_ARRAY(ArrayOfShort)
+    PRIMITIVE_ARRAY(ArrayOfInt)
+    PRIMITIVE_ARRAY(ArrayOfFloat)
+    PRIMITIVE_ARRAY(ArrayOfDouble)
+    PRIMITIVE_ARRAY(ArrayOfLong)
+
+#undef PRIMITIVE_ARRAY
+
   } else {
     PrimitiveArrayVT = ConstantExpr::getIntToPtr(ConstantInt::get(Type::Int64Ty,
                                                          uint64(JavaArrayVT)),





More information about the vmkit-commits mailing list