[vmkit-commits] [vmkit] r59183 - in /vmkit/trunk/lib/JnJVM: LLVMRuntime/runtime-default.ll VMCore/JavaClass.h VMCore/JnjvmModule.cpp VMCore/JnjvmModule.h VMCore/LowerConstantCalls.cpp
Nicolas Geoffray
nicolas.geoffray at lip6.fr
Wed Nov 12 14:26:30 PST 2008
Author: geoffray
Date: Wed Nov 12 16:26:28 2008
New Revision: 59183
URL: http://llvm.org/viewvc/llvm-project?rev=59183&view=rev
Log:
Optimize initialization check and static instance getter in an isolate environment.
Modified:
vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp
Modified: vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll?rev=59183&r1=59182&r2=59183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll (original)
+++ vmkit/trunk/lib/JnJVM/LLVMRuntime/runtime-default.ll Wed Nov 12 16:26:28 2008
@@ -10,6 +10,12 @@
%Jnjvm = type {%VT, %JavaClass*, [9 x %JavaClass*]}
+;;; The task class mirror in an isolate environment.
+;;; Field 1: The class state
+;;; Field 2: The class delegatee (java/lang/Class)
+;;; Field 3: The static instance
+%TaskClassMirror = type { i32, %JavaObject*, %JavaObject* }
+
;;; The type of internal classes. This is not complete, but we only need
;;; the first fields for now.
;;; Field 1 - The VT of a class C++ object.
@@ -18,9 +24,9 @@
;;; Field 4 - The list of super classes of this class.
;;; Field 5 - The depth of the class in its super hierarchy.
;;; Field 6 - The class state (resolved, initialized, ...)
-;;; field 7 - The constant pool, only for multi vm environment.
-;;; field 8 - The static instance, only for multi vm environment.
-%JavaClass = type { %VT, i32, %VT ,%JavaClass**, i32, i32, %ConstantPool*, %JavaObject* }
+;;; field 7 - The task class mirror, for an isolate environment
+%JavaClass = type { %VT, i32, %VT ,%JavaClass**, i32, i32,
+ [0 x %TaskClassMirror] }
;;; The root of all Java Objects: a VT, a class and a lock.
%JavaObject = type { %VT, %JavaClass*, i8* }
Modified: vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h?rev=59183&r1=59182&r2=59183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JavaClass.h Wed Nov 12 16:26:28 2008
@@ -173,6 +173,10 @@
/// status - The loading/resolve/initialization state of the class.
///
JavaState status;
+
+#ifdef ISOLATE
+ TaskClassMirror IsolateInfo[NR_ISOLATES];
+#endif
//===----------------------------------------------------------------------===//
//
@@ -512,7 +516,6 @@
#else
#if defined(ISOLATE)
- TaskClassMirror IsolateInfo[NR_ISOLATES];
TaskClassMirror& getCurrentTaskClassMirror();
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp?rev=59183&r1=59182&r2=59183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.cpp Wed Nov 12 16:26:28 2008
@@ -46,24 +46,26 @@
const llvm::Type* JnjvmModule::JnjvmType = 0;
const llvm::Type* JnjvmModule::ConstantPoolType = 0;
-llvm::Constant* JnjvmModule::JavaObjectNullConstant;
-llvm::Constant* JnjvmModule::UTF8NullConstant;
-llvm::Constant* JnjvmModule::JavaClassNullConstant;
-llvm::Constant* JnjvmModule::MaxArraySizeConstant;
-llvm::Constant* JnjvmModule::JavaObjectSizeConstant;
-llvm::ConstantInt* JnjvmModule::OffsetObjectSizeInClassConstant;
-llvm::ConstantInt* JnjvmModule::OffsetVTInClassConstant;
-llvm::ConstantInt* JnjvmModule::OffsetDepthInClassConstant;
-llvm::ConstantInt* JnjvmModule::OffsetDisplayInClassConstant;
-llvm::ConstantInt* JnjvmModule::OffsetStatusInClassConstant;
-llvm::ConstantInt* JnjvmModule::OffsetCtpInClassConstant;
-llvm::ConstantInt* JnjvmModule::ClassReadyConstant;
-const llvm::Type* JnjvmModule::JavaClassType;
-const llvm::Type* JnjvmModule::VTType;
-llvm::ConstantInt* JnjvmModule::JavaArrayElementsOffsetConstant;
-llvm::ConstantInt* JnjvmModule::JavaArraySizeOffsetConstant;
-llvm::ConstantInt* JnjvmModule::JavaObjectLockOffsetConstant;
-llvm::ConstantInt* JnjvmModule::JavaObjectClassOffsetConstant;
+llvm::Constant* JnjvmModule::JavaObjectNullConstant;
+llvm::Constant* JnjvmModule::UTF8NullConstant;
+llvm::Constant* JnjvmModule::JavaClassNullConstant;
+llvm::Constant* JnjvmModule::MaxArraySizeConstant;
+llvm::Constant* JnjvmModule::JavaObjectSizeConstant;
+llvm::ConstantInt* JnjvmModule::OffsetObjectSizeInClassConstant;
+llvm::ConstantInt* JnjvmModule::OffsetVTInClassConstant;
+llvm::ConstantInt* JnjvmModule::OffsetDepthInClassConstant;
+llvm::ConstantInt* JnjvmModule::OffsetDisplayInClassConstant;
+llvm::ConstantInt* JnjvmModule::OffsetStatusInClassConstant;
+llvm::ConstantInt* JnjvmModule::OffsetTaskClassMirrorInClassConstant;
+llvm::ConstantInt* JnjvmModule::OffsetStaticInstanceInTaskClassMirrorConstant;
+llvm::ConstantInt* JnjvmModule::OffsetStatusInTaskClassMirrorConstant;
+llvm::ConstantInt* JnjvmModule::ClassReadyConstant;
+const llvm::Type* JnjvmModule::JavaClassType;
+const llvm::Type* JnjvmModule::VTType;
+llvm::ConstantInt* JnjvmModule::JavaArrayElementsOffsetConstant;
+llvm::ConstantInt* JnjvmModule::JavaArraySizeOffsetConstant;
+llvm::ConstantInt* JnjvmModule::JavaObjectLockOffsetConstant;
+llvm::ConstantInt* JnjvmModule::JavaObjectClassOffsetConstant;
Value* JnjvmModule::getNativeClass(CommonClass* classDef) {
llvm::GlobalVariable* varGV = 0;
@@ -991,7 +993,9 @@
OffsetDisplayInClassConstant = mvm::MvmModule::constantThree;
OffsetDepthInClassConstant = mvm::MvmModule::constantFour;
OffsetStatusInClassConstant = mvm::MvmModule::constantFive;
- OffsetCtpInClassConstant = mvm::MvmModule::constantSix;
+ OffsetTaskClassMirrorInClassConstant = mvm::MvmModule::constantSix;
+ OffsetStaticInstanceInTaskClassMirrorConstant = mvm::MvmModule::constantTwo;
+ OffsetStatusInTaskClassMirrorConstant = mvm::MvmModule::constantZero;
ClassReadyConstant = ConstantInt::get(Type::Int32Ty, ready);
Modified: vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h?rev=59183&r1=59182&r2=59183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/JnjvmModule.h Wed Nov 12 16:26:28 2008
@@ -329,7 +329,9 @@
static llvm::ConstantInt* OffsetDepthInClassConstant;
static llvm::ConstantInt* OffsetDisplayInClassConstant;
static llvm::ConstantInt* OffsetStatusInClassConstant;
- static llvm::ConstantInt* OffsetCtpInClassConstant;
+ static llvm::ConstantInt* OffsetTaskClassMirrorInClassConstant;
+ static llvm::ConstantInt* OffsetStaticInstanceInTaskClassMirrorConstant;
+ static llvm::ConstantInt* OffsetStatusInTaskClassMirrorConstant;
static llvm::ConstantInt* ClassReadyConstant;
Modified: vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp
URL: http://llvm.org/viewvc/llvm-project/vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp?rev=59183&r1=59182&r2=59183&view=diff
==============================================================================
--- vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp (original)
+++ vmkit/trunk/lib/JnJVM/VMCore/LowerConstantCalls.cpp Wed Nov 12 16:26:28 2008
@@ -22,6 +22,7 @@
using namespace llvm;
using namespace jnjvm;
+#include <iostream>
namespace mvm {
class VISIBILITY_HIDDEN LowerConstantCalls : public FunctionPass {
@@ -229,23 +230,44 @@
}
} else if (V == module->GetStaticInstanceFunction) {
Changed = true;
-#if !defined(ISOLATE) && !defined(ISOLATE_SHARING)
+#if !defined(ISOLATE_SHARING) && !defined(ISOLATE)
ConstantExpr* CE = dyn_cast<ConstantExpr>(Call.getArgument(0));
assert(CE && "Wrong use of GetStaticInstanceFunction");
ConstantInt* C = (ConstantInt*)CE->getOperand(0);
Class* cl = (Class*)C->getZExtValue();
-
+
Value* Replace = module->getStaticInstance(cl);
Replace = new LoadInst(Replace, "", CI);
CI->replaceAllUsesWith(Replace);
CI->eraseFromParent();
+#elif defined(ISOLATE)
+ std::vector<Value*> GEP;
+ GEP.push_back(module->constantZero);
+ GEP.push_back(module->OffsetTaskClassMirrorInClassConstant);
+ Value* TCMArray = GetElementPtrInst::Create(Call.getArgument(0),
+ GEP.begin(), GEP.end(),
+ "", CI);
+ GEP.clear();
+ GEP.push_back(module->constantZero);
+ // TODO get the isolate id
+ GEP.push_back(module->constantZero);
+ Value* TCM = GetElementPtrInst::Create(TCMArray, GEP.begin(),
+ GEP.end(), "", CI);
+ GEP.clear();
+ GEP.push_back(module->constantZero);
+ GEP.push_back(module->OffsetStaticInstanceInTaskClassMirrorConstant);
+ Value* Replace = GetElementPtrInst::Create(TCM, GEP.begin(),
+ GEP.end(), "", CI);
+ Replace = new LoadInst(Replace, "", CI);
+ CI->replaceAllUsesWith(Replace);
+ CI->eraseFromParent();
+#else
+ abort();
#endif
} else if (V == module->InitialisationCheckFunction) {
Changed = true;
-#ifdef ISOLATE
- Call.setCalledFunction(module->InitialiseClassFunction);
-#else
+
BasicBlock* NBB = 0;
if (CI->getParent()->getTerminator() != CI) {
NBB = II->getParent()->splitBasicBlock(II);
@@ -257,13 +279,33 @@
}
Value* Cl = Call.getArgument(0);
+#if !defined(ISOLATE)
std::vector<Value*> indexes;
indexes.push_back(mvm::MvmModule::constantZero);
indexes.push_back(module->OffsetStatusInClassConstant);
Value* StatusPtr = GetElementPtrInst::Create(Cl, indexes.begin(),
indexes.end(), "", CI);
- Value* Status = new LoadInst(StatusPtr, "", CI);
+
+#else
+ std::vector<Value*> GEP;
+ GEP.push_back(module->constantZero);
+ GEP.push_back(module->OffsetTaskClassMirrorInClassConstant);
+ Value* TCMArray = GetElementPtrInst::Create(Cl, GEP.begin(),
+ GEP.end(), "", CI);
+ GEP.clear();
+ GEP.push_back(module->constantZero);
+ // TODO get the isolate id
+ GEP.push_back(module->constantZero);
+ Value* TCM = GetElementPtrInst::Create(TCMArray, GEP.begin(),
+ GEP.end(), "", CI);
+ GEP.clear();
+ GEP.push_back(module->constantZero);
+ GEP.push_back(module->OffsetStatusInTaskClassMirrorConstant);
+ Value* StatusPtr = GetElementPtrInst::Create(TCM, GEP.begin(),
+ GEP.end(), "", CI);
+#endif
+ Value* Status = new LoadInst(StatusPtr, "", CI);
Value* test = new ICmpInst(ICmpInst::ICMP_EQ, Status,
jnjvm::JnjvmModule::ClassReadyConstant,
@@ -318,7 +360,6 @@
CI->eraseFromParent();
BranchInst::Create(NBB, trueCl);
break;
-#endif
} else if (V == module->GetConstantPoolAtFunction) {
Function* resolver = dyn_cast<Function>(Call.getArgument(0));
assert(resolver && "Wrong use of GetConstantPoolAt");
More information about the vmkit-commits
mailing list