X-Git-Url: http://git.megacz.com/?p=nestedvm.git;a=blobdiff_plain;f=src%2Forg%2Fibex%2Fnestedvm%2FClassFileCompiler.java;h=a7f035cc57a1461d78f32de415431ebe1ce75499;hp=def556a0a2f9c3af97d566f4b3c5d4dc593d8cc0;hb=897fa3c89674460aa4fad275f263cea2b341420d;hpb=ef1c27c7eff6c432f3ad7a21671947b87539acb2 diff --git a/src/org/ibex/nestedvm/ClassFileCompiler.java b/src/org/ibex/nestedvm/ClassFileCompiler.java index def556a..a7f035c 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()); @@ -383,7 +391,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const 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(); @@ -396,7 +404,7 @@ public class ClassFileCompiler extends Compiler implements org.apache.bcel.Const } 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); @@ -1065,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; } @@ -1722,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); @@ -1735,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