[vmkit-commits] [vmkit] r61857 - in /vmkit/trunk/lib/JnJVM/VMCore: JnjvmModule.cpp JnjvmModule.h
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Wed Jan 7 04:58:47 PST 2009
Author: geoffray
Date: Wed Jan 7 06:58:43 2009
New Revision: 61857
URL: http://llvm.org/viewvc/llvm-project?rev=61857&view=rev
Log:
Bugfix for getMethodInClass.
Modified:
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=61857&r1=61856&r2=61857&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Jan 7 06:58:43 2009
@@ -198,54 +198,35 @@
return ConstantExpr::getIntToPtr(CI, ConstantPoolType);
}
}
-#include <iostream>
+
Constant* JnjvmModule::getMethodInClass(JavaMethod* meth) {
if (staticCompilation) {
- method_iterator SI = methods.find(meth);
- if (SI != methods.end()) {
- return SI->second;
- } else {
- Class* cl = meth->classDef;
- Constant* MOffset = 0;
- Constant* COffset = 0;
- uint32 nbMethods;
-
- if (isVirtual(meth->access)) {
- COffset = ConstantInt::get(Type::Int32Ty, 9);
- nbMethods = cl->nbVirtualMethods;
- for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) {
- if (&cl->virtualMethods[i] == meth) {
- MOffset = ConstantInt::get(Type::Int32Ty, i);
- break;
- }
+ Class* cl = meth->classDef;
+ Constant* MOffset = 0;
+ Constant* Array = 0;
+ if (isVirtual(meth->access)) {
+ method_iterator SI = virtualMethods.find(cl);
+ for (uint32 i = 0; i < cl->nbVirtualMethods; ++i) {
+ if (&cl->virtualMethods[i] == meth) {
+ MOffset = ConstantInt::get(Type::Int32Ty, i);
+ break;
}
- } else {
- COffset = ConstantInt::get(Type::Int32Ty, 11);
- nbMethods = cl->nbStaticMethods;
- for (uint32 i = 0; i < cl->nbStaticMethods; ++i) {
- if (&cl->staticMethods[i] == meth) {
- MOffset = ConstantInt::get(Type::Int32Ty, i);
- break;
- }
+ }
+ Array = SI->second;
+ } else {
+ method_iterator SI = staticMethods.find(cl);
+ for (uint32 i = 0; i < cl->nbStaticMethods; ++i) {
+ if (&cl->staticMethods[i] == meth) {
+ MOffset = ConstantInt::get(Type::Int32Ty, i);
+ break;
}
}
-
- assert(MOffset && "Offset not found!");
- Constant* C = getNativeClass(cl);
-
- Value* Elts[2] = { constantZero, COffset};
- Constant* res = ConstantExpr::getGetElementPtr(C, Elts, 2);
- const Type* ATy = ArrayType::get(JavaMethodType->getContainedType(0),
- nbMethods);
- ATy = PointerType::getUnqual(ATy);
- res = ConstantExpr::getBitCast(res, ATy);
- Elts[0] = constantZero;
- Elts[1] = MOffset;
- res = ConstantExpr::getGetElementPtr(res, Elts, 2);
- methods.insert(std::make_pair(meth, res));
- return res;
+ Array = SI->second;
}
+ Constant* GEPs[2] = { constantZero, MOffset };
+ return ConstantExpr::getGetElementPtr(Array, GEPs, 2);
+
} else {
ConstantInt* CI = ConstantInt::get(Type::Int64Ty, (int64_t)meth);
return ConstantExpr::getIntToPtr(CI, JavaMethodType);
@@ -1095,9 +1076,11 @@
Constant* methods = ConstantArray::get(ATy, TempElts);
TempElts.clear();
- methods = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage,
- methods, "", this);
- methods = ConstantExpr::getCast(Instruction::BitCast, methods,
+ GlobalVariable* GV = new GlobalVariable(ATy, false,
+ GlobalValue::InternalLinkage,
+ methods, "", this);
+ virtualMethods.insert(std::make_pair(cl, GV));
+ methods = ConstantExpr::getCast(Instruction::BitCast, GV,
JavaMethodType);
ClassElts.push_back(methods);
} else {
@@ -1118,10 +1101,11 @@
Constant* methods = ConstantArray::get(ATy, TempElts);
TempElts.clear();
- methods = new GlobalVariable(ATy, false, GlobalValue::InternalLinkage,
- methods, "", this);
- methods = ConstantExpr::getCast(Instruction::BitCast, methods,
- JavaMethodType);
+ GlobalVariable* GV = new GlobalVariable(ATy, false,
+ GlobalValue::InternalLinkage,
+ methods, "", this);
+ staticMethods.insert(std::make_pair(cl, GV));
+ methods = ConstantExpr::getCast(Instruction::BitCast, GV, JavaMethodType);
ClassElts.push_back(methods);
} else {
ClassElts.push_back(Constant::getNullValue(JavaMethodType));
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=61857&r1=61856&r2=61857&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Jan 7 06:58:43 2009
@@ -191,9 +191,10 @@
std::map<const Enveloppe*, llvm::Constant*> enveloppes;
std::map<const JavaMethod*, llvm::Constant*> nativeFunctions;
std::map<const UTF8*, llvm::Constant*> utf8s;
- std::map<const JavaMethod*, llvm::Constant*> methods;
+ std::map<const Class*, llvm::GlobalVariable*> virtualMethods;
+ std::map<const Class*, llvm::GlobalVariable*> staticMethods;
- typedef std::map<const JavaMethod*, llvm::Constant*>::iterator
+ typedef std::map<const Class*, llvm::GlobalVariable*>::iterator
method_iterator;
typedef std::map<const CommonClass*, llvm::Constant*>::iterator
More information about the vmkit-commits
mailing list