[vmkit-commits] [vmkit] r75458 - /vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Mon Jul 13 02:28:53 PDT 2009
Author: geoffray
Date: Mon Jul 13 04:28:52 2009
New Revision: 75458
URL: http://llvm.org/viewvc/llvm-project?rev=75458&view=rev
Log:
Bugfix when static emitting Java objects.
Modified:
vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
Modified: vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp?rev=75458&r1=75457&r2=75458&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp (original)
+++ vmkit/trunk/lib/JnJVM/Compiler/JavaAOTCompiler.cpp Mon Jul 13 04:28:52 2009
@@ -222,20 +222,59 @@
if (I == End) {
if (mvm::Collector::begOf(obj)) {
+ const Type* Ty = 0;
+ CommonClass* cl = obj->getClass();
+
+ if (cl->isArray()) {
+ Classpath* upcalls = cl->classLoader->bootstrapLoader->upcalls;
+ CommonClass* subClass = cl->asArrayClass()->baseClass();
+ if (subClass->isPrimitive()) {
+ if (subClass == upcalls->OfBool) {
+ Ty = Type::Int8Ty;
+ } else if (subClass == upcalls->OfByte) {
+ Ty = Type::Int8Ty;
+ } else if (subClass == upcalls->OfShort) {
+ Ty = Type::Int16Ty;
+ } else if (subClass == upcalls->OfChar) {
+ Ty = Type::Int16Ty;
+ } else if (subClass == upcalls->OfInt) {
+ Ty = Type::Int32Ty;
+ } else if (subClass == upcalls->OfFloat) {
+ Ty = Type::FloatTy;
+ } else if (subClass == upcalls->OfLong) {
+ Ty = Type::Int64Ty;
+ } else if (subClass == upcalls->OfDouble) {
+ Ty = Type::DoubleTy;
+ } else {
+ abort();
+ }
+ } else {
+ Ty = JnjvmModule::JavaObjectType;
+ }
+
+ std::vector<const Type*> Elemts;
+ const ArrayType* ATy = ArrayType::get(Ty, ((JavaArray*)obj)->size);
+ Elemts.push_back(JnjvmModule::JavaObjectType->getContainedType(0));
+ Elemts.push_back(JnjvmModule::pointerSizeType);
+ Elemts.push_back(ATy);
+ Ty = StructType::get(Elemts);
+
+ } else {
+ LLVMClassInfo* LCI = getClassInfo(cl->asClass());
+ Ty = LCI->getVirtualType()->getContainedType(0);
+ }
- const Type* Ty = JnjvmModule::JavaObjectType->getContainedType(0);
varGV = new GlobalVariable(Ty, false, GlobalValue::InternalLinkage,
0, "", getLLVMModule());
+ Constant* C = ConstantExpr::getBitCast(varGV,
+ JnjvmModule::JavaObjectType);
- finalObjects.insert(std::make_pair(obj, varGV));
- reverseFinalObjects.insert(std::make_pair(varGV, obj));
-
- Constant* C = ConstantExpr::getBitCast(CreateConstantFromJavaObject(obj),
- Ty);
+ finalObjects.insert(std::make_pair(obj, C));
+ reverseFinalObjects.insert(std::make_pair(C, obj));
- varGV->setInitializer(C);
- return varGV;
+ varGV->setInitializer(CreateConstantFromJavaObject(obj));
+ return C;
} else {
Constant* CI = ConstantInt::get(Type::Int64Ty, uint64_t(obj));
CI = ConstantExpr::getIntToPtr(CI, JnjvmModule::JavaObjectType);
More information about the vmkit-commits
mailing list