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","<init>",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());
new Type[]{Type.getType("Lorg/ibex/nestedvm/UnixRuntime;"),Type.STRING,new ArrayType(Type.STRING,1)},
INVOKESTATIC));
else
- a(fac.createInvoke(fullClassName,"run",Type.INT,new Type[]{Type.STRING,new ArrayType(Type.STRING,1)},INVOKEVIRTUAL));
+ a(fac.createInvoke(fullClassName,"run",Type.INT,new Type[]{Type.STRING,new ArrayType(Type.STRING,1)},INVOKEVIRTUAL));
a(fac.createInvoke("java.lang.System","exit",Type.VOID,new Type[]{Type.INT},INVOKESTATIC));
a(InstructionConstants.RETURN);
main.setMaxLocals();
main.setMaxStack();
cl.addMethod(main.getMethod());
+ if(printStats)
+ System.out.println("Constant Pool Size: " + cp.getSize());
cl.getJavaClass().dump(os);
}
private void addConstReturnMethod(String name, int val) {
- MethodGen method = newMethod(ACC_PROTECTED,Type.INT, Type.NO_ARGS,name);
+ MethodGen method = newMethod(ACC_PROTECTED,Type.INT, Type.NO_ARGS,name);
selectMethod(method);
pushConst(val);
a(InstructionConstants.IRETURN);
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;
}
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);
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