[vmkit-commits] [vmkit] r198518 - Implements the lookupswitch opcode
Gael Thomas
gael.thomas at lip6.fr
Sat Jan 4 14:56:59 PST 2014
Author: gthomas
Date: Sat Jan 4 16:56:59 2014
New Revision: 198518
URL: http://llvm.org/viewvc/llvm-project?rev=198518&view=rev
Log:
Implements the lookupswitch opcode
Modified:
vmkit/branches/mcjit/include/j3/j3codegen.h
vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc
vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
Modified: vmkit/branches/mcjit/include/j3/j3codegen.h
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/include/j3/j3codegen.h?rev=198518&r1=198517&r2=198518&view=diff
==============================================================================
--- vmkit/branches/mcjit/include/j3/j3codegen.h (original)
+++ vmkit/branches/mcjit/include/j3/j3codegen.h Sat Jan 4 16:56:59 2014
@@ -145,6 +145,8 @@ namespace j3 {
void newArray(J3ArrayClass* type);
void newObject(J3Class* cl);
+ void lookupSwitch();
+
void ldc(uint32_t idx);
void selectExceptionNode(uint32_t idx);
Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc?rev=198518&r1=198517&r2=198518&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegen.cc Sat Jan 4 16:56:59 2014
@@ -40,13 +40,16 @@ J3CodeGen::J3CodeGen(vmkit::BumpAllocato
vm = J3Thread::get()->vm();
#if 0
- if(m->cl()->name() == vm->names()->get("java/util/concurrent/atomic/AtomicInteger"))
- vm->options()->debugTranslate = 4;
+ /* usefull to debug a single function */
+ if( cl->name() == vm->names()->get("java/nio/Bits") &&
+ method->name() == vm->names()->get("<clinit>") &&
+ method->signature()->name() == vm->names()->get("()V") )
+ vm->options()->debugTranslate = 3;
#endif
if(vm->options()->debugTranslate)
fprintf(stderr, " translating bytecode of: %s::%s%s\n",
- method->cl()->name()->cStr(),
+ cl->name()->cStr(),
method->name()->cStr(),
method->signature()->name()->cStr());
@@ -697,6 +700,21 @@ void J3CodeGen::ldc(uint32_t idx) {
stack.push(res);
}
+void J3CodeGen::lookupSwitch() {
+ codeReader->seek(((codeReader->tell() - 1) & -4) + 4, J3Reader::SeekSet);
+ llvm::Value* val = stack.pop();
+ llvm::BasicBlock* def = forwardBranch("lookupswitch-match", javaPC + codeReader->readU4(), 1, 1);
+ uint32_t n = codeReader->readU4();
+
+ for(uint32_t i=0; i<n; i++) {
+ int32_t match = codeReader->readS4();
+ llvm::BasicBlock* ok = forwardBranch("lookupswitch-match", javaPC + codeReader->readS4(), 1, 1);
+ llvm::BasicBlock* nok = i == (n - 1) ? def : newBB("lookupswitch-next");
+ builder->CreateCondBr(builder->CreateICmpEQ(val, builder->getInt32(match)), ok, nok);
+ builder->SetInsertPoint(nok);
+ }
+}
+
llvm::BasicBlock* J3CodeGen::newBB(const char* name) {
return llvm::BasicBlock::Create(llvmFunction->getContext(), name, llvmFunction);
}
@@ -708,6 +726,8 @@ void J3CodeGen::condBr(llvm::Value* op)
}
llvm::BasicBlock* J3CodeGen::forwardBranch(const char* id, uint32_t pc, bool doAlloc, bool doPush) {
+ if(vm->options()->debugTranslate > 2)
+ fprintf(stderr, " forward branch at %d\n", pc);
llvm::BasicBlock* res = opInfos[pc].bb;
if(res)
@@ -908,7 +928,6 @@ void J3CodeGen::translate() {
llvmFunction->dump();
case 4:
case 3:
- fprintf(stderr, "stack:\n");
stack.dump();
case 2:
fprintf(stderr, " [%4d] decoding: %s\n", javaPC, J3Cst::opcodeNames[bc]);
@@ -921,7 +940,7 @@ void J3CodeGen::translate() {
if(vm->options()->genDebugExecute) {
char buf[256];
snprintf(buf, 256, " [%4d] executing: %-20s in %s::%s", javaPC,
- J3Cst::opcodeNames[bc], method->cl()->name()->cStr(), method->name()->cStr());
+ J3Cst::opcodeNames[bc], cl->name()->cStr(), method->name()->cStr());
builder->CreateCall3(funcEchoDebugExecute,
builder->getInt32(2),
buildString("%s\n"),
@@ -1412,7 +1431,10 @@ void J3CodeGen::translate() {
case J3Cst::BC_jsr: nyi(); /* 0xa8 */
case J3Cst::BC_ret: nyi(); /* 0xa9 wide */
case J3Cst::BC_tableswitch: nyi(); /* 0xaa */
- case J3Cst::BC_lookupswitch: nyi(); /* 0xab */
+
+ case J3Cst::BC_lookupswitch:
+ lookupSwitch();
+ break;
case J3Cst::BC_ireturn: /* 0xac */
case J3Cst::BC_lreturn: /* 0xad */
@@ -1529,7 +1551,7 @@ void J3CodeGen::translate() {
#if 0
void J3CodeGen::explore() {
- printf(" exploring bytecode of: %s::%s%s\n", method->cl()->name()->cStr(), method->name()->cStr(), method->signature()->cStr());
+ printf(" exploring bytecode of: %s::%s%s\n", cl->name()->cStr(), method->name()->cStr(), method->signature()->cStr());
while(codeReader->remaining()) {
uint8_t bc = codeReader->readU1();
@@ -1591,7 +1613,7 @@ void J3CodeGen::generateJava() {
if(vm->options()->genDebugExecute) {
char buf[256];
- snprintf(buf, 256, "%s::%s", method->cl()->name()->cStr(), method->name()->cStr());
+ snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr());
#if 0
fprintf(stderr, "bitcast: ");
@@ -1643,7 +1665,7 @@ void J3CodeGen::generateJava() {
builder->SetInsertPoint(bbRet);
if(vm->options()->genDebugExecute) {
char buf[256];
- snprintf(buf, 256, "%s::%s", method->cl()->name()->cStr(), method->name()->cStr());
+ snprintf(buf, 256, "%s::%s", cl->name()->cStr(), method->name()->cStr());
builder->CreateCall3(funcEchoDebugEnter,
builder->getInt32(1),
buildString("%s\n"),
@@ -1684,7 +1706,7 @@ llvm::Type* J3CodeGen::doNativeType(llvm
llvm::Function* J3CodeGen::lookupNative() {
J3Mangler mangler(cl);
- mangler.mangle(mangler.javaId)->mangle(method->cl()->name(), method->name());
+ mangler.mangle(mangler.javaId)->mangle(cl->name(), method->name());
uint32_t length = mangler.length();
mangler.mangle(method->signature());
Modified: vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc?rev=198518&r1=198517&r2=198518&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3codegenvar.cc Sat Jan 4 16:56:59 2014
@@ -70,26 +70,8 @@ void J3CodeGenVar::init(J3CodeGen* _code
void J3CodeGenVar::dump() {
for(uint32_t i=0; i<topStack; i++) {
- fprintf(stderr, " [%u]: ", i);
- llvm::Type* t = metaStack[i];
- llvm::Value* v;
-
- if(t->isIntegerTy(64))
- v = doubleStack[i];
- else if(t->isIntegerTy())
- v = intStack[i];
- else if(t->isFloatTy())
- v = floatStack[i];
- else if(t->isDoubleTy())
- v = doubleStack[i];
- else if(t->isPointerTy())
- v = refStack[i];
- else {
- t->dump();
- J3::internalError("should not happen");
- }
-
- v->dump();
+ fprintf(stderr, " [%u]: ", i);
+ stackOf(metaStack[i])[i]->dump();
//fprintf(stderr, "\n");
}
}
Modified: vmkit/branches/mcjit/lib/j3/vm/j3jni.cc
URL: http://llvm.org/viewvc/llvm-project/vmkit/branches/mcjit/lib/j3/vm/j3jni.cc?rev=198518&r1=198517&r2=198518&view=diff
==============================================================================
--- vmkit/branches/mcjit/lib/j3/vm/j3jni.cc (original)
+++ vmkit/branches/mcjit/lib/j3/vm/j3jni.cc Sat Jan 4 16:56:59 2014
@@ -255,6 +255,13 @@ jmethodID JNICALL GetStaticMethodID(JNIE
return res.val##j3type; \
}
+#define defSetField(jtype, id, j3type) \
+ void JNICALL SetStatic##id##Field(JNIEnv* env, jclass clazz, jfieldID fieldID, jtype value) { \
+ enterJVM(); \
+ J3ObjectType::nativeClass(clazz)->asClass()->staticInstance()->set##j3type(fieldID, value); \
+ leaveJVM(); \
+ }
+
#define defNewArray(jtype, id, j3type) \
jtype##Array JNICALL New##id##Array(JNIEnv* env, jsize len) { \
jtype##Array res; \
@@ -271,13 +278,6 @@ jmethodID JNICALL GetStaticMethodID(JNIE
leaveJVM(); \
}
-#define defSetField(jtype, id, j3type) \
- void JNICALL SetStatic##id##Field(JNIEnv* env, jclass clazz, jfieldID fieldID, jtype value) { \
- enterJVM(); \
- J3ObjectType::nativeClass(clazz)->asClass()->staticInstance()->set##j3type(fieldID, value); \
- leaveJVM(); \
- }
-
#define defJNIObj(jtype, id, j3type) \
defCall(jtype, id, j3type) \
defNonVirtualCall(jtype, id, j3type) \
More information about the vmkit-commits
mailing list