X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FClassFileCompiler.java;h=931f1b909b2d9f8e3f07515d818fed644df1be76;hb=98f786ce8ee1fcd9568d1c367160851d32e1c786;hp=0c4dd67a25f78fd1b25f509510fc671181e11ace;hpb=034a42fa65955289442614ef9914e5474fac62aa;p=nestedvm.git diff --git a/src/org/ibex/nestedvm/ClassFileCompiler.java b/src/org/ibex/nestedvm/ClassFileCompiler.java index 0c4dd67..931f1b9 100644 --- a/src/org/ibex/nestedvm/ClassFileCompiler.java +++ b/src/org/ibex/nestedvm/ClassFileCompiler.java @@ -360,12 +360,20 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const cl.addMethod(getCPUState.getMethod()); - // FEATURE: Catch RuntimeException and turn it into a fault exception MethodGen execute = newMethod(ACC_PROTECTED,Type.VOID,Type.NO_ARGS,"_execute"); selectMethod(execute); - a(InstructionConstants.ALOAD_0); - a(fac.createInvoke(fullClassName,"trampoline",Type.VOID,Type.NO_ARGS,INVOKESPECIAL)); + InstructionHandle tryStart = a(InstructionConstants.ALOAD_0); + InstructionHandle tryEnd = a(fac.createInvoke(fullClassName,"trampoline",Type.VOID,Type.NO_ARGS,INVOKESPECIAL)); a(InstructionConstants.RETURN); + + InstructionHandle catchInsn = a(InstructionConstants.ASTORE_1); + a(fac.createNew("org.ibex.nestedvm.Runtime$FaultException")); + a(InstructionConstants.DUP); + a(InstructionConstants.ALOAD_1); + a(fac.createInvoke("org.ibex.nestedvm.Runtime$FaultException","",Type.VOID,new Type[]{new ObjectType("java.lang.RuntimeException")},INVOKESPECIAL)); + a(InstructionConstants.ATHROW); + + execute.addExceptionHandler(tryStart,tryEnd,catchInsn,new ObjectType("java.lang.RuntimeException")); execute.setMaxLocals(); execute.setMaxStack(); cl.addMethod(execute.getMethod()); @@ -390,6 +398,8 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const main.setMaxStack(); cl.addMethod(main.getMethod()); + if(printStats) + System.out.println("Constant Pool Size: " + cp.getSize()); cl.getJavaClass().dump(os); } @@ -1063,22 +1073,10 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const if(pc == -1) throw new Exn("pc modifying insn in delay slot"); int target = (pc&0xf0000000)|(jumpTarget << 2); emitInstruction(-1,nextInsn,-1); - if(optimizedMemcpy && (target == memcpy || target == memset)) { - a(InstructionConstants.ALOAD_0); - pushRegZ(R+4); - pushRegZ(R+5); - pushRegZ(R+6); - a(fac.createInvoke(fullClassName,target==memcpy ? "memcpy" : "memset", Type.VOID, new Type[]{Type.INT,Type.INT,Type.INT},INVOKEVIRTUAL)); - preSetReg(R+2); - pushReg(R+4); - setReg(); - branch(pc,pc+8); - } else { - preSetReg(R+RA); - pushConst(pc+8); - setReg(); - branch(pc, target); - } + preSetReg(R+RA); + pushConst(pc+8); + setReg(); + branch(pc, target); unreachable = true; break; } @@ -1720,7 +1718,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const memWrite(); break; } - // FEATURE: This need to be atomic if we ever support threads (see SWC0/SC) + // This need to be atomic if we ever support threads (see SWC0/SC) case 48: // LWC0/LL preSetReg(R+rt); memRead(R+rs,signedImmediate); @@ -1733,7 +1731,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const setReg(); break; - /* FEATURE: This needs to fail (set rt to 0) if the memory location was modified + /* This needs to fail (set rt to 0) if the memory location was modified * between the LL and SC if we every support threads. */ case 56: // SWC0/SC