[vmkit-commits] [vmkit] r85239 - in /vmkit/trunk: include/jnjvm/JnjvmModule.h lib/JnJVM/Compiler/JavaAOTCompiler.cpp

Nicolas Geoffray nicolas.geoffray at lip6.fr
Tue Oct 27 07:43:35 PDT 2009


Author: geoffray
Date: Tue Oct 27 09:43:34 2009
New Revision: 85239

URL: http://llvm.org/viewvc/llvm-project?rev=85239&view=rev
Log:
Fix AOT code generation of float and double arrays.


Modified:
    vmkit/trunk/include/jnjvm/JnjvmModule.h
    vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp

Modified: vmkit/trunk/include/jnjvm/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/include/jnjvm/JnjvmModule.h?rev=85239&r1=85238&r2=85239&view=diff

==============================================================================
--- vmkit/trunk/include/jnjvm/JnjvmModule.h (original)
+++ vmkit/trunk/include/jnjvm/JnjvmModule.h Tue Oct 27 09:43:34 2009
@@ -35,6 +35,7 @@
 
 namespace jnjvm {
 
+class ArrayObject;
 class Attribut;
 class CacheNode;
 class CommonClass;
@@ -647,7 +648,12 @@
   llvm::Constant* getUTF8(const UTF8* val);
   
   template<typename T>
-  llvm::Constant* CreateConstantFromArray(const T* val, const llvm::Type* Ty);
+  llvm::Constant* CreateConstantFromIntArray(const T* val, const llvm::Type* Ty);
+  
+  template<typename T>
+  llvm::Constant* CreateConstantFromFPArray(const T* val, const llvm::Type* Ty);
+
+  llvm::Constant* CreateConstantFromObjectArray(const ArrayObject* val);
   
   std::map<const CommonClass*, llvm::Constant*> nativeClasses;
   std::map<const ClassArray*, llvm::GlobalVariable*> arrayClasses;

Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp?rev=85239&r1=85238&r2=85239&view=diff

==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Tue Oct 27 09:43:34 2009
@@ -576,35 +576,34 @@
     CommonClass* subClass = cl->asArrayClass()->baseClass();
     if (subClass->isPrimitive()) {
       if (subClass == upcalls->OfBool) {
-        return CreateConstantFromArray<ArrayUInt8>((ArrayUInt8*)obj,
+        return CreateConstantFromIntArray<ArrayUInt8>((ArrayUInt8*)obj,
                                         Type::getInt8Ty(getGlobalContext()));
       } else if (subClass == upcalls->OfByte) {
-        return CreateConstantFromArray<ArraySInt8>((ArraySInt8*)obj,
+        return CreateConstantFromIntArray<ArraySInt8>((ArraySInt8*)obj,
                                         Type::getInt8Ty(getGlobalContext()));
       } else if (subClass == upcalls->OfShort) {
-        return CreateConstantFromArray<ArraySInt16>((ArraySInt16*)obj,
+        return CreateConstantFromIntArray<ArraySInt16>((ArraySInt16*)obj,
                                         Type::getInt16Ty(getGlobalContext()));
       } else if (subClass == upcalls->OfChar) {
-        return CreateConstantFromArray<ArrayUInt16>((ArrayUInt16*)obj,
+        return CreateConstantFromIntArray<ArrayUInt16>((ArrayUInt16*)obj,
                                         Type::getInt16Ty(getGlobalContext()));
       } else if (subClass == upcalls->OfInt) {
-        return CreateConstantFromArray<ArraySInt32>((ArraySInt32*)obj,
+        return CreateConstantFromIntArray<ArraySInt32>((ArraySInt32*)obj,
                                         Type::getInt32Ty(getGlobalContext()));
       } else if (subClass == upcalls->OfFloat) {
-        return CreateConstantFromArray<ArrayFloat>((ArrayFloat*)obj,
+        return CreateConstantFromFPArray<ArrayFloat>((ArrayFloat*)obj,
                                         Type::getFloatTy(getGlobalContext()));
       } else if (subClass == upcalls->OfLong) {
-        return CreateConstantFromArray<ArrayLong>((ArrayLong*)obj,
+        return CreateConstantFromIntArray<ArrayLong>((ArrayLong*)obj,
                                         Type::getInt64Ty(getGlobalContext()));
       } else if (subClass == upcalls->OfDouble) {
-        return CreateConstantFromArray<ArrayDouble>((ArrayDouble*)obj,
+        return CreateConstantFromFPArray<ArrayDouble>((ArrayDouble*)obj,
                                         Type::getDoubleTy(getGlobalContext()));
       } else {
         abort();
       }
     } else {
-      return CreateConstantFromArray<ArrayObject>((ArrayObject*)obj,
-                                                  JnjvmModule::JavaObjectType);
+      return CreateConstantFromObjectArray((ArrayObject*)obj);
     }
   } else {
     
@@ -682,8 +681,8 @@
 
   Elmts.push_back(CreateConstantForBaseObject(cl));
 
-  Constant* Array =
-    CreateConstantFromArray<ArrayUInt16>(str->value, Type::getInt16Ty(getGlobalContext()));
+  Constant* Array = CreateConstantFromIntArray<ArrayUInt16>(str->value,
+                                        Type::getInt16Ty(getGlobalContext()));
   
 
   Module& Mod = *getLLVMModule();
@@ -1228,7 +1227,33 @@
 }
 
 template<typename T>
-Constant* JavaAOTCompiler::CreateConstantFromArray(const T* val, const Type* Ty) {
+Constant* JavaAOTCompiler::CreateConstantFromIntArray(const T* val, const Type* Ty) {
+  std::vector<const Type*> Elemts;
+  const ArrayType* ATy = ArrayType::get(Ty, val->size);
+  Elemts.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
+  Elemts.push_back(JnjvmModule::pointerSizeType);
+  
+
+  Elemts.push_back(ATy);
+
+  const StructType* STy = StructType::get(getLLVMModule()->getContext(), Elemts);
+  
+  std::vector<Constant*> Cts;
+  Cts.push_back(CreateConstantForBaseObject(val->getClass()));
+  Cts.push_back(ConstantInt::get(JnjvmModule::pointerSizeType, val->size));
+  
+  std::vector<Constant*> Vals;
+  for (sint32 i = 0; i < val->size; ++i) {
+    Vals.push_back(ConstantInt::get(Ty, (uint64)val->elements[i]));
+  }
+
+  Cts.push_back(ConstantArray::get(ATy, Vals));
+  
+  return ConstantStruct::get(STy, Cts);
+}
+
+template<typename T>
+Constant* JavaAOTCompiler::CreateConstantFromFPArray(const T* val, const Type* Ty) {
   std::vector<const Type*> Elemts;
   const ArrayType* ATy = ArrayType::get(Ty, val->size);
   Elemts.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
@@ -1245,16 +1270,36 @@
   
   std::vector<Constant*> Vals;
   for (sint32 i = 0; i < val->size; ++i) {
-    if (Ty->isInteger()) {
-      Vals.push_back(ConstantInt::get(Ty, (uint64)val->elements[i]));
-    } else if (Ty->isFloatingPoint()) {
-      Vals.push_back(ConstantFP::get(Ty, (double)(size_t)val->elements[i]));
+    Vals.push_back(ConstantFP::get(Ty, (double)val->elements[i]));
+  }
+
+  Cts.push_back(ConstantArray::get(ATy, Vals));
+  
+  return ConstantStruct::get(STy, Cts);
+}
+
+Constant* JavaAOTCompiler::CreateConstantFromObjectArray(const ArrayObject* val) {
+  std::vector<const Type*> Elemts;
+  const llvm::Type* Ty = JnjvmModule::JavaObjectType;
+  const ArrayType* ATy = ArrayType::get(Ty, val->size);
+  Elemts.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
+  Elemts.push_back(JnjvmModule::pointerSizeType);
+  
+
+  Elemts.push_back(ATy);
+
+  const StructType* STy = StructType::get(getLLVMModule()->getContext(), Elemts);
+  
+  std::vector<Constant*> Cts;
+  Cts.push_back(CreateConstantForBaseObject(val->getClass()));
+  Cts.push_back(ConstantInt::get(JnjvmModule::pointerSizeType, val->size));
+  
+  std::vector<Constant*> Vals;
+  for (sint32 i = 0; i < val->size; ++i) {
+    if (val->elements[i]) {
+      Vals.push_back(getFinalObject(val->elements[i]));
     } else {
-      if (val->elements[i]) {
-        Vals.push_back(getFinalObject((JavaObject*)(size_t)val->elements[i]));
-      } else {
-        Vals.push_back(Constant::getNullValue(JnjvmModule::JavaObjectType));
-      }
+      Vals.push_back(Constant::getNullValue(JnjvmModule::JavaObjectType));
     }
   }
 





More information about the vmkit-commits mailing list