Beispiel #1
0
        public static bool PerformsOverflowCheck(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Add_Ovf:
            case Mono.Cecil.Cil.Code.Add_Ovf_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I1_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I2_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I4_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I8_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U1_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U2_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U4_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U8_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U_Un:
            case Mono.Cecil.Cil.Code.Mul_Ovf:
            case Mono.Cecil.Cil.Code.Mul_Ovf_Un:
            case Mono.Cecil.Cil.Code.Sub_Ovf:
            case Mono.Cecil.Cil.Code.Sub_Ovf_Un: return(true);

            default: return(false);
            }
        }
Beispiel #2
0
        public static LoadMethodAddressOperation ToLoadMethodAddressOperation(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Ldftn: return(LoadMethodAddressOperation.Static);

            case Mono.Cecil.Cil.Code.Ldvirtftn: return(LoadMethodAddressOperation.Virtual);

            default: throw opcode.ToUnknownValueException();
            }
        }
Beispiel #3
0
        public static LoadFieldOperation ToLoadFieldOperation(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Ldfld:
            case Mono.Cecil.Cil.Code.Ldsfld: return(LoadFieldOperation.Content);

            case Mono.Cecil.Cil.Code.Ldflda:
            case Mono.Cecil.Cil.Code.Ldsflda: return(LoadFieldOperation.Address);

            default: throw opcode.ToUnknownValueException();
            }
        }
Beispiel #4
0
        public static MethodCallOperation ToMethodCallOperation(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Call: return(MethodCallOperation.Static);

            case Mono.Cecil.Cil.Code.Callvirt: return(MethodCallOperation.Virtual);

            case Mono.Cecil.Cil.Code.Jmp: return(MethodCallOperation.Jump);

            default: throw opcode.ToUnknownValueException();
            }
        }
Beispiel #5
0
        public static ConvertOperation ToConvertOperation(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Castclass:
            case Mono.Cecil.Cil.Code.Isinst: return(ConvertOperation.Cast);

            case Mono.Cecil.Cil.Code.Box: return(ConvertOperation.Box);

            case Mono.Cecil.Cil.Code.Unbox: return(ConvertOperation.UnboxPtr);

            case Mono.Cecil.Cil.Code.Unbox_Any: return(ConvertOperation.Unbox);

            case Mono.Cecil.Cil.Code.Conv_I:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I_Un:
            case Mono.Cecil.Cil.Code.Conv_I1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I1_Un:
            case Mono.Cecil.Cil.Code.Conv_I2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I2_Un:
            case Mono.Cecil.Cil.Code.Conv_I4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I4_Un:
            case Mono.Cecil.Cil.Code.Conv_I8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I8_Un:
            case Mono.Cecil.Cil.Code.Conv_U:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U_Un:
            case Mono.Cecil.Cil.Code.Conv_U1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U1_Un:
            case Mono.Cecil.Cil.Code.Conv_U2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U2_Un:
            case Mono.Cecil.Cil.Code.Conv_U4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U4_Un:
            case Mono.Cecil.Cil.Code.Conv_U8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U8_Un:
            case Mono.Cecil.Cil.Code.Conv_R4:
            case Mono.Cecil.Cil.Code.Conv_R8:
            case Mono.Cecil.Cil.Code.Conv_R_Un: return(ConvertOperation.Conv);

            default: throw opcode.ToUnknownValueException();
            }
        }
Beispiel #6
0
        public static LoadOperation ToLoadOperation(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Ldc_I4:
            case Mono.Cecil.Cil.Code.Ldc_I4_0:
            case Mono.Cecil.Cil.Code.Ldc_I4_1:
            case Mono.Cecil.Cil.Code.Ldc_I4_2:
            case Mono.Cecil.Cil.Code.Ldc_I4_3:
            case Mono.Cecil.Cil.Code.Ldc_I4_4:
            case Mono.Cecil.Cil.Code.Ldc_I4_5:
            case Mono.Cecil.Cil.Code.Ldc_I4_6:
            case Mono.Cecil.Cil.Code.Ldc_I4_7:
            case Mono.Cecil.Cil.Code.Ldc_I4_8:
            case Mono.Cecil.Cil.Code.Ldc_I4_M1:
            case Mono.Cecil.Cil.Code.Ldc_I4_S:
            case Mono.Cecil.Cil.Code.Ldc_I8:
            case Mono.Cecil.Cil.Code.Ldc_R4:
            case Mono.Cecil.Cil.Code.Ldc_R8:
            case Mono.Cecil.Cil.Code.Ldnull:
            case Mono.Cecil.Cil.Code.Ldstr: return(LoadOperation.Value);

            case Mono.Cecil.Cil.Code.Ldarg:
            case Mono.Cecil.Cil.Code.Ldarg_0:
            case Mono.Cecil.Cil.Code.Ldarg_1:
            case Mono.Cecil.Cil.Code.Ldarg_2:
            case Mono.Cecil.Cil.Code.Ldarg_3:
            case Mono.Cecil.Cil.Code.Ldarg_S:
            case Mono.Cecil.Cil.Code.Ldloc:
            case Mono.Cecil.Cil.Code.Ldloc_0:
            case Mono.Cecil.Cil.Code.Ldloc_1:
            case Mono.Cecil.Cil.Code.Ldloc_2:
            case Mono.Cecil.Cil.Code.Ldloc_3:
            case Mono.Cecil.Cil.Code.Ldloc_S: return(LoadOperation.Content);

            case Mono.Cecil.Cil.Code.Ldarga:
            case Mono.Cecil.Cil.Code.Ldarga_S:
            case Mono.Cecil.Cil.Code.Ldloca:
            case Mono.Cecil.Cil.Code.Ldloca_S: return(LoadOperation.Address);

            default: throw opcode.ToUnknownValueException();
            }
        }
Beispiel #7
0
        public static BranchOperation ToBranchOperation(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Brfalse:
            case Mono.Cecil.Cil.Code.Brfalse_S: return(BranchOperation.False);

            case Mono.Cecil.Cil.Code.Brtrue:
            case Mono.Cecil.Cil.Code.Brtrue_S: return(BranchOperation.True);

            case Mono.Cecil.Cil.Code.Beq:
            case Mono.Cecil.Cil.Code.Beq_S: return(BranchOperation.Eq);

            case Mono.Cecil.Cil.Code.Bne_Un:
            case Mono.Cecil.Cil.Code.Bne_Un_S: return(BranchOperation.Neq);

            case Mono.Cecil.Cil.Code.Bge:
            case Mono.Cecil.Cil.Code.Bge_S:
            case Mono.Cecil.Cil.Code.Bge_Un:
            case Mono.Cecil.Cil.Code.Bge_Un_S: return(BranchOperation.Ge);

            case Mono.Cecil.Cil.Code.Bgt:
            case Mono.Cecil.Cil.Code.Bgt_S:
            case Mono.Cecil.Cil.Code.Bgt_Un:
            case Mono.Cecil.Cil.Code.Bgt_Un_S: return(BranchOperation.Gt);

            case Mono.Cecil.Cil.Code.Ble:
            case Mono.Cecil.Cil.Code.Ble_S:
            case Mono.Cecil.Cil.Code.Ble_Un:
            case Mono.Cecil.Cil.Code.Ble_Un_S: return(BranchOperation.Le);

            case Mono.Cecil.Cil.Code.Blt:
            case Mono.Cecil.Cil.Code.Blt_S:
            case Mono.Cecil.Cil.Code.Blt_Un:
            case Mono.Cecil.Cil.Code.Blt_Un_S: return(BranchOperation.Lt);

            case Mono.Cecil.Cil.Code.Leave:
            case Mono.Cecil.Cil.Code.Leave_S: return(BranchOperation.Leave);

            default: throw opcode.ToUnknownValueException();
            }
        }
Beispiel #8
0
        public static bool OperandsAreUnsigned(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Add_Ovf_Un:
            case Mono.Cecil.Cil.Code.Bge_Un:
            case Mono.Cecil.Cil.Code.Bge_Un_S:
            case Mono.Cecil.Cil.Code.Bgt_Un:
            case Mono.Cecil.Cil.Code.Bgt_Un_S:
            case Mono.Cecil.Cil.Code.Ble_Un:
            case Mono.Cecil.Cil.Code.Ble_Un_S:
            case Mono.Cecil.Cil.Code.Blt_Un:
            case Mono.Cecil.Cil.Code.Blt_Un_S:
            case Mono.Cecil.Cil.Code.Bne_Un:
            case Mono.Cecil.Cil.Code.Bne_Un_S:
            case Mono.Cecil.Cil.Code.Cgt_Un:
            case Mono.Cecil.Cil.Code.Clt_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I1_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I2_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I4_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I8_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U1_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U2_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U4_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U8_Un:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U_Un:
            case Mono.Cecil.Cil.Code.Conv_R_Un:
            case Mono.Cecil.Cil.Code.Div_Un:
            case Mono.Cecil.Cil.Code.Mul_Ovf_Un:
            case Mono.Cecil.Cil.Code.Rem_Un:
            case Mono.Cecil.Cil.Code.Shr_Un:
            case Mono.Cecil.Cil.Code.Sub_Ovf_Un: return(true);

            default: return(false);
            }
        }
Beispiel #9
0
        private AnalysisNet.IInstruction ExtractInstruction(Cecil.Cil.Instruction operation)
        {
            AnalysisNet.IInstruction instruction = null;

            // cecil does not have an enum we require it for the switch statement
            Cecil.Cil.Code code = operation.OpCode.Code;
            switch (code)
            {
            case Mono.Cecil.Cil.Code.Add:
            case Mono.Cecil.Cil.Code.Add_Ovf:
            case Mono.Cecil.Cil.Code.Add_Ovf_Un:
            case Mono.Cecil.Cil.Code.And:
            case Mono.Cecil.Cil.Code.Ceq:
            case Mono.Cecil.Cil.Code.Cgt:
            case Mono.Cecil.Cil.Code.Cgt_Un:
            case Mono.Cecil.Cil.Code.Clt:
            case Mono.Cecil.Cil.Code.Clt_Un:
            case Mono.Cecil.Cil.Code.Div:
            case Mono.Cecil.Cil.Code.Div_Un:
            case Mono.Cecil.Cil.Code.Mul:
            case Mono.Cecil.Cil.Code.Mul_Ovf:
            case Mono.Cecil.Cil.Code.Mul_Ovf_Un:
            case Mono.Cecil.Cil.Code.Or:
            case Mono.Cecil.Cil.Code.Rem:
            case Mono.Cecil.Cil.Code.Rem_Un:
            case Mono.Cecil.Cil.Code.Shl:
            case Mono.Cecil.Cil.Code.Shr:
            case Mono.Cecil.Cil.Code.Shr_Un:
            case Mono.Cecil.Cil.Code.Sub:
            case Mono.Cecil.Cil.Code.Sub_Ovf:
            case Mono.Cecil.Cil.Code.Sub_Ovf_Un:
            case Mono.Cecil.Cil.Code.Xor:
                instruction = ProcessBasic(operation);
                break;

            //case Mono.Cecil.Cil.Code.Arglist:
            //    //expression = new RuntimeArgumentHandleExpression();
            //    break;

            //case Mono.Cecil.Cil.Code.Array_Create_WithLowerBound:
            //case Mono.Cecil.Cil.Code.Array_Create:
            case Mono.Cecil.Cil.Code.Newarr:
                instruction = ProcessCreateArray(operation);
                break;

            //case Mono.Cecil.Cil.Code.Array_Get:
            //    instruction = ProcessLoadArrayElement(operation, AnalysisNetBytecode.LoadArrayElementOperation.Content);
            //    break;
            //case Mono.Cecil.Cil.Code.Array_Addr:
            //    instruction = ProcessLoadArrayElement(operation, AnalysisNetBytecode.LoadArrayElementOperation.Address);
            //    break;

            //case Mono.Cecil.Cil.Code.Ldelem:
            case Mono.Cecil.Cil.Code.Ldelem_Any:
            case Mono.Cecil.Cil.Code.Ldelem_I:
            case Mono.Cecil.Cil.Code.Ldelem_I1:
            case Mono.Cecil.Cil.Code.Ldelem_I2:
            case Mono.Cecil.Cil.Code.Ldelem_I4:
            case Mono.Cecil.Cil.Code.Ldelem_I8:
            case Mono.Cecil.Cil.Code.Ldelem_R4:
            case Mono.Cecil.Cil.Code.Ldelem_R8:
            case Mono.Cecil.Cil.Code.Ldelem_U1:
            case Mono.Cecil.Cil.Code.Ldelem_U2:
            case Mono.Cecil.Cil.Code.Ldelem_U4:
            case Mono.Cecil.Cil.Code.Ldelem_Ref:
                instruction = ProcessLoadArrayElement(operation, AnalysisNetBytecode.LoadArrayElementOperation.Content);
                break;

            case Mono.Cecil.Cil.Code.Ldelema:
                instruction = ProcessLoadArrayElement(operation, AnalysisNetBytecode.LoadArrayElementOperation.Address);
                break;

            case Mono.Cecil.Cil.Code.Beq:
            case Mono.Cecil.Cil.Code.Beq_S:
            case Mono.Cecil.Cil.Code.Bne_Un:
            case Mono.Cecil.Cil.Code.Bne_Un_S:
            case Mono.Cecil.Cil.Code.Bge:
            case Mono.Cecil.Cil.Code.Bge_S:
            case Mono.Cecil.Cil.Code.Bge_Un:
            case Mono.Cecil.Cil.Code.Bge_Un_S:
            case Mono.Cecil.Cil.Code.Bgt:
            case Mono.Cecil.Cil.Code.Bgt_S:
            case Mono.Cecil.Cil.Code.Bgt_Un:
            case Mono.Cecil.Cil.Code.Bgt_Un_S:
            case Mono.Cecil.Cil.Code.Ble:
            case Mono.Cecil.Cil.Code.Ble_S:
            case Mono.Cecil.Cil.Code.Ble_Un:
            case Mono.Cecil.Cil.Code.Ble_Un_S:
            case Mono.Cecil.Cil.Code.Blt:
            case Mono.Cecil.Cil.Code.Blt_S:
            case Mono.Cecil.Cil.Code.Blt_Un:
            case Mono.Cecil.Cil.Code.Blt_Un_S:
                instruction = ProcessBinaryConditionalBranch(operation);
                break;

            case Mono.Cecil.Cil.Code.Br:
            case Mono.Cecil.Cil.Code.Br_S:
                instruction = ProcessUnconditionalBranch(operation);
                break;

            case Mono.Cecil.Cil.Code.Leave:
            case Mono.Cecil.Cil.Code.Leave_S:
                instruction = ProcessLeave(operation);
                break;

            case Mono.Cecil.Cil.Code.Break:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Nop:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Brfalse:
            case Mono.Cecil.Cil.Code.Brfalse_S:
            case Mono.Cecil.Cil.Code.Brtrue:
            case Mono.Cecil.Cil.Code.Brtrue_S:
                instruction = ProcessUnaryConditionalBranch(operation);
                break;

            case Mono.Cecil.Cil.Code.Call:
            case Mono.Cecil.Cil.Code.Callvirt:
            case Mono.Cecil.Cil.Code.Jmp:
                instruction = ProcessMethodCall(operation);
                break;

            case Mono.Cecil.Cil.Code.Calli:
                instruction = ProcessMethodCallIndirect(operation);
                break;

            case Mono.Cecil.Cil.Code.Castclass:
            case Mono.Cecil.Cil.Code.Isinst:
            case Mono.Cecil.Cil.Code.Box:
            case Mono.Cecil.Cil.Code.Unbox:
            case Mono.Cecil.Cil.Code.Unbox_Any:
            case Mono.Cecil.Cil.Code.Conv_I:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I_Un:
            case Mono.Cecil.Cil.Code.Conv_I1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I1_Un:
            case Mono.Cecil.Cil.Code.Conv_I2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I2_Un:
            case Mono.Cecil.Cil.Code.Conv_I4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I4_Un:
            case Mono.Cecil.Cil.Code.Conv_I8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I8_Un:
            case Mono.Cecil.Cil.Code.Conv_U:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U_Un:
            case Mono.Cecil.Cil.Code.Conv_U1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U1_Un:
            case Mono.Cecil.Cil.Code.Conv_U2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U2_Un:
            case Mono.Cecil.Cil.Code.Conv_U4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U4_Un:
            case Mono.Cecil.Cil.Code.Conv_U8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U8_Un:
            case Mono.Cecil.Cil.Code.Conv_R4:
            case Mono.Cecil.Cil.Code.Conv_R8:
            case Mono.Cecil.Cil.Code.Conv_R_Un:
                instruction = ProcessConversion(operation);
                break;

            //case Mono.Cecil.Cil.Code.Ckfinite:
            //    var operand = result = PopOperandStack();
            //    var chkfinite = new MutableCodeModel.MethodReference()
            //    {
            //        CallingConvention = Cci.CallingConvention.FastCall,
            //        ContainingType = host.PlatformType.SystemFloat64,
            //        Name = result = host.NameTable.GetNameFor("__ckfinite__"),
            //        Type = host.PlatformType.SystemFloat64,
            //        InternFactory = host.InternFactory,
            //    };
            //    expression = new MethodCall() { Arguments = new List<IExpression>(1) { operand }, IsStaticCall = true, Type = operand.Type, MethodToCall = chkfinite };
            //    break;

            case Mono.Cecil.Cil.Code.Constrained:
                instruction = ProcessConstrained(operation);
                break;

            case Mono.Cecil.Cil.Code.Cpblk:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Cpobj:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Dup:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Endfilter:
            case Mono.Cecil.Cil.Code.Endfinally:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Initblk:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Initobj:
                instruction = ProcessInitObj(operation);
                break;

            case Mono.Cecil.Cil.Code.Ldarg:
            case Mono.Cecil.Cil.Code.Ldarg_0:
            case Mono.Cecil.Cil.Code.Ldarg_1:
            case Mono.Cecil.Cil.Code.Ldarg_2:
            case Mono.Cecil.Cil.Code.Ldarg_3:
            case Mono.Cecil.Cil.Code.Ldarg_S:
            case Mono.Cecil.Cil.Code.Ldarga:
            case Mono.Cecil.Cil.Code.Ldarga_S:
                instruction = ProcessLoadArgument(operation);
                break;

            case Mono.Cecil.Cil.Code.Ldloc:
            case Mono.Cecil.Cil.Code.Ldloc_0:
            case Mono.Cecil.Cil.Code.Ldloc_1:
            case Mono.Cecil.Cil.Code.Ldloc_2:
            case Mono.Cecil.Cil.Code.Ldloc_3:
            case Mono.Cecil.Cil.Code.Ldloc_S:
            case Mono.Cecil.Cil.Code.Ldloca:
            case Mono.Cecil.Cil.Code.Ldloca_S:
                instruction = ProcessLoadLocal(operation);
                break;

            case Mono.Cecil.Cil.Code.Ldfld:
            case Mono.Cecil.Cil.Code.Ldsfld:
            case Mono.Cecil.Cil.Code.Ldflda:
            case Mono.Cecil.Cil.Code.Ldsflda:
                instruction = ProcessLoadField(operation);
                break;

            case Mono.Cecil.Cil.Code.Ldftn:
            case Mono.Cecil.Cil.Code.Ldvirtftn:
                instruction = ProcessLoadMethodAddress(operation);
                break;

            case Mono.Cecil.Cil.Code.Ldc_I4:
            case Mono.Cecil.Cil.Code.Ldc_I4_0:
            case Mono.Cecil.Cil.Code.Ldc_I4_1:
            case Mono.Cecil.Cil.Code.Ldc_I4_2:
            case Mono.Cecil.Cil.Code.Ldc_I4_3:
            case Mono.Cecil.Cil.Code.Ldc_I4_4:
            case Mono.Cecil.Cil.Code.Ldc_I4_5:
            case Mono.Cecil.Cil.Code.Ldc_I4_6:
            case Mono.Cecil.Cil.Code.Ldc_I4_7:
            case Mono.Cecil.Cil.Code.Ldc_I4_8:
            case Mono.Cecil.Cil.Code.Ldc_I4_M1:
            case Mono.Cecil.Cil.Code.Ldc_I4_S:
            case Mono.Cecil.Cil.Code.Ldc_I8:
            case Mono.Cecil.Cil.Code.Ldc_R4:
            case Mono.Cecil.Cil.Code.Ldc_R8:
            case Mono.Cecil.Cil.Code.Ldnull:
            case Mono.Cecil.Cil.Code.Ldstr:
                instruction = ProcessLoadConstant(operation);
                break;

            case Mono.Cecil.Cil.Code.Ldind_I:
            case Mono.Cecil.Cil.Code.Ldind_I1:
            case Mono.Cecil.Cil.Code.Ldind_I2:
            case Mono.Cecil.Cil.Code.Ldind_I4:
            case Mono.Cecil.Cil.Code.Ldind_I8:
            case Mono.Cecil.Cil.Code.Ldind_R4:
            case Mono.Cecil.Cil.Code.Ldind_R8:
            case Mono.Cecil.Cil.Code.Ldind_Ref:
            case Mono.Cecil.Cil.Code.Ldind_U1:
            case Mono.Cecil.Cil.Code.Ldind_U2:
            case Mono.Cecil.Cil.Code.Ldind_U4:
            case Mono.Cecil.Cil.Code.Ldobj:
                instruction = ProcessLoadIndirect(operation);
                break;

            case Mono.Cecil.Cil.Code.Ldlen:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Ldtoken:
                instruction = ProcessLoadToken(operation);
                break;

            case Mono.Cecil.Cil.Code.Localloc:
                instruction = ProcessBasic(operation);
                break;

            //case Mono.Cecil.Cil.Code.Mkrefany:
            //    expression = result = ParseMakeTypedReference(currentOperation);
            //    break;

            case Mono.Cecil.Cil.Code.Neg:
            case Mono.Cecil.Cil.Code.Not:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Newobj:
                instruction = ProcessCreateObject(operation);
                break;

            //case Mono.Cecil.Cil.Code.No_:
            //    // If code out there actually uses this, I need to know sooner rather than later.
            //    // TODO: need object model support
            //    throw new NotImplementedException("Invalid opcode: No.");

            case Mono.Cecil.Cil.Code.Pop:
                instruction = ProcessBasic(operation);
                break;

            //case Mono.Cecil.Cil.Code.Readonly_:
            //    result = sawReadonly = true;
            //    break;

            //case Mono.Cecil.Cil.Code.Refanytype:
            //    expression = result = ParseGetTypeOfTypedReference();
            //    break;

            //case Mono.Cecil.Cil.Code.Refanyval:
            //    expression = result = ParseGetValueOfTypedReference(currentOperation);
            //    break;

            case Mono.Cecil.Cil.Code.Ret:
                instruction = ProcessBasic(operation);
                break;

            case Mono.Cecil.Cil.Code.Sizeof:
                instruction = ProcessSizeof(operation);
                break;

            case Mono.Cecil.Cil.Code.Starg:
            case Mono.Cecil.Cil.Code.Starg_S:
                instruction = ProcessStoreArgument(operation);
                break;

            //case Mono.Cecil.Cil.Code.Array_Set:
            //case Mono.Cecil.Cil.Code.Stelem:
            case Mono.Cecil.Cil.Code.Stelem_Any:
            case Mono.Cecil.Cil.Code.Stelem_I:
            case Mono.Cecil.Cil.Code.Stelem_I1:
            case Mono.Cecil.Cil.Code.Stelem_I2:
            case Mono.Cecil.Cil.Code.Stelem_I4:
            case Mono.Cecil.Cil.Code.Stelem_I8:
            case Mono.Cecil.Cil.Code.Stelem_R4:
            case Mono.Cecil.Cil.Code.Stelem_R8:
            case Mono.Cecil.Cil.Code.Stelem_Ref:
                instruction = ProcessStoreArrayElement(operation);
                break;

            case Mono.Cecil.Cil.Code.Stfld:
            case Mono.Cecil.Cil.Code.Stsfld:
                instruction = ProcessStoreField(operation);
                break;

            case Mono.Cecil.Cil.Code.Stind_I:
            case Mono.Cecil.Cil.Code.Stind_I1:
            case Mono.Cecil.Cil.Code.Stind_I2:
            case Mono.Cecil.Cil.Code.Stind_I4:
            case Mono.Cecil.Cil.Code.Stind_I8:
            case Mono.Cecil.Cil.Code.Stind_R4:
            case Mono.Cecil.Cil.Code.Stind_R8:
            case Mono.Cecil.Cil.Code.Stind_Ref:
            case Mono.Cecil.Cil.Code.Stobj:
                instruction = ProcessStoreIndirect(operation);
                break;

            case Mono.Cecil.Cil.Code.Stloc:
            case Mono.Cecil.Cil.Code.Stloc_0:
            case Mono.Cecil.Cil.Code.Stloc_1:
            case Mono.Cecil.Cil.Code.Stloc_2:
            case Mono.Cecil.Cil.Code.Stloc_3:
            case Mono.Cecil.Cil.Code.Stloc_S:
                instruction = ProcessStoreLocal(operation);
                break;

            case Mono.Cecil.Cil.Code.Switch:
                instruction = ProcessSwitch(operation);
                break;

            //case Mono.Cecil.Cil.Code.Tail_:
            //    result = sawTailCall = true;
            //    break;

            case Mono.Cecil.Cil.Code.Throw:
            case Mono.Cecil.Cil.Code.Rethrow:
                instruction = ProcessBasic(operation);
                break;

            //case Mono.Cecil.Cil.Code.Unaligned_:
            //    Contract.Assume(currentOperation.Value is byte);
            //    var alignment = (byte)currentOperation.Value;
            //    Contract.Assume(alignment == 1 || alignment == 2 || alignment == 4);
            //    result = alignment = alignment;
            //    break;

            //case Mono.Cecil.Cil.Code.Volatile_:
            //    result = sawVolatile = true;
            //    break;

            default:
                //Console.WriteLine("Unknown bytecode: {0}", operation.OperationCode);
                //throw new UnknownBytecodeException(operation);
                //continue;

                // Quick fix to preserve the offset in case it is a target location of some jump
                // Otherwise it will break the control-flow analysis later.
                instruction = new AnalysisNetBytecode.BasicInstruction((uint)operation.Offset, AnalysisNetBytecode.BasicOperation.Nop);
                break;
            }

            return(instruction);
        }
Beispiel #10
0
        public static BasicOperation ToBasicOperation(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Neg: return(BasicOperation.Neg);

            case Mono.Cecil.Cil.Code.Not: return(BasicOperation.Not);

            case Mono.Cecil.Cil.Code.Add:
            case Mono.Cecil.Cil.Code.Add_Ovf:
            case Mono.Cecil.Cil.Code.Add_Ovf_Un: return(BasicOperation.Add);

            case Mono.Cecil.Cil.Code.And: return(BasicOperation.And);

            case Mono.Cecil.Cil.Code.Ceq: return(BasicOperation.Eq);

            case Mono.Cecil.Cil.Code.Cgt:
            case Mono.Cecil.Cil.Code.Cgt_Un: return(BasicOperation.Gt);

            case Mono.Cecil.Cil.Code.Clt:
            case Mono.Cecil.Cil.Code.Clt_Un: return(BasicOperation.Lt);

            case Mono.Cecil.Cil.Code.Div:
            case Mono.Cecil.Cil.Code.Div_Un: return(BasicOperation.Div);

            case Mono.Cecil.Cil.Code.Mul:
            case Mono.Cecil.Cil.Code.Mul_Ovf:
            case Mono.Cecil.Cil.Code.Mul_Ovf_Un: return(BasicOperation.Mul);

            case Mono.Cecil.Cil.Code.Or: return(BasicOperation.Or);

            case Mono.Cecil.Cil.Code.Rem:
            case Mono.Cecil.Cil.Code.Rem_Un: return(BasicOperation.Rem);

            case Mono.Cecil.Cil.Code.Shl: return(BasicOperation.Shl);

            case Mono.Cecil.Cil.Code.Shr:
            case Mono.Cecil.Cil.Code.Shr_Un: return(BasicOperation.Shr);

            case Mono.Cecil.Cil.Code.Sub:
            case Mono.Cecil.Cil.Code.Sub_Ovf:
            case Mono.Cecil.Cil.Code.Sub_Ovf_Un: return(BasicOperation.Sub);

            case Mono.Cecil.Cil.Code.Xor: return(BasicOperation.Xor);

            case Mono.Cecil.Cil.Code.Endfilter: return(BasicOperation.EndFilter);

            case Mono.Cecil.Cil.Code.Endfinally: return(BasicOperation.EndFinally);

            case Mono.Cecil.Cil.Code.Throw: return(BasicOperation.Throw);

            case Mono.Cecil.Cil.Code.Rethrow: return(BasicOperation.Rethrow);

            case Mono.Cecil.Cil.Code.Nop: return(BasicOperation.Nop);

            case Mono.Cecil.Cil.Code.Pop: return(BasicOperation.Pop);

            case Mono.Cecil.Cil.Code.Dup: return(BasicOperation.Dup);

            case Mono.Cecil.Cil.Code.Localloc: return(BasicOperation.LocalAllocation);

            case Mono.Cecil.Cil.Code.Initblk: return(BasicOperation.InitBlock);

            //case Mono.Cecil.Cil.Code.Initobj:        return BasicOperation.InitObject;
            case Mono.Cecil.Cil.Code.Cpblk: return(BasicOperation.CopyBlock);

            case Mono.Cecil.Cil.Code.Cpobj: return(BasicOperation.CopyObject);

            case Mono.Cecil.Cil.Code.Ret: return(BasicOperation.Return);

            case Mono.Cecil.Cil.Code.Ldlen: return(BasicOperation.LoadArrayLength);

            case Mono.Cecil.Cil.Code.Break: return(BasicOperation.Breakpoint);

            default: throw opcode.ToUnknownValueException();
            }
        }
Beispiel #11
0
 public static bool CreateArrayWithLowerBounds(Mono.Cecil.Cil.Code opcode)
 {
     throw new NotImplementedException();
     //var result = opcode == Mono.Cecil.Cil.Code.Array_Create_WithLowerBound;
     //return result;
 }
Beispiel #12
0
        public static IType GetOperationType(Mono.Cecil.Cil.Code opcode)
        {
            switch (opcode)
            {
            case Mono.Cecil.Cil.Code.Ldelem_I:
            case Mono.Cecil.Cil.Code.Ldind_I:
            case Mono.Cecil.Cil.Code.Stind_I:
            case Mono.Cecil.Cil.Code.Stelem_I:
            case Mono.Cecil.Cil.Code.Conv_I:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I_Un: return(PlatformType.IntPtr);

            case Mono.Cecil.Cil.Code.Ldelem_I1:
            case Mono.Cecil.Cil.Code.Ldind_I1:
            case Mono.Cecil.Cil.Code.Stind_I1:
            case Mono.Cecil.Cil.Code.Stelem_I1:
            case Mono.Cecil.Cil.Code.Conv_I1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I1_Un: return(PlatformType.Int8);

            case Mono.Cecil.Cil.Code.Ldelem_I2:
            case Mono.Cecil.Cil.Code.Ldind_I2:
            case Mono.Cecil.Cil.Code.Stind_I2:
            case Mono.Cecil.Cil.Code.Stelem_I2:
            case Mono.Cecil.Cil.Code.Conv_I2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I2_Un: return(PlatformType.Int16);

            case Mono.Cecil.Cil.Code.Ldelem_I4:
            case Mono.Cecil.Cil.Code.Ldc_I4:
            case Mono.Cecil.Cil.Code.Ldc_I4_0:
            case Mono.Cecil.Cil.Code.Ldc_I4_1:
            case Mono.Cecil.Cil.Code.Ldc_I4_2:
            case Mono.Cecil.Cil.Code.Ldc_I4_3:
            case Mono.Cecil.Cil.Code.Ldc_I4_4:
            case Mono.Cecil.Cil.Code.Ldc_I4_5:
            case Mono.Cecil.Cil.Code.Ldc_I4_6:
            case Mono.Cecil.Cil.Code.Ldc_I4_7:
            case Mono.Cecil.Cil.Code.Ldc_I4_8:
            case Mono.Cecil.Cil.Code.Ldc_I4_M1:
            case Mono.Cecil.Cil.Code.Ldc_I4_S:
            case Mono.Cecil.Cil.Code.Ldind_I4:
            case Mono.Cecil.Cil.Code.Stind_I4:
            case Mono.Cecil.Cil.Code.Stelem_I4:
            case Mono.Cecil.Cil.Code.Conv_I4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I4_Un: return(PlatformType.Int32);

            case Mono.Cecil.Cil.Code.Ldelem_I8:
            case Mono.Cecil.Cil.Code.Ldc_I8:
            case Mono.Cecil.Cil.Code.Ldind_I8:
            case Mono.Cecil.Cil.Code.Stind_I8:
            case Mono.Cecil.Cil.Code.Stelem_I8:
            case Mono.Cecil.Cil.Code.Conv_I8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_I8_Un: return(PlatformType.Int64);

            case Mono.Cecil.Cil.Code.Conv_U:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U_Un:
            case Mono.Cecil.Cil.Code.Ldlen: return(PlatformType.UIntPtr);

            case Mono.Cecil.Cil.Code.Ldelem_U1:
            case Mono.Cecil.Cil.Code.Ldind_U1:
            case Mono.Cecil.Cil.Code.Conv_U1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U1:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U1_Un: return(PlatformType.UInt8);

            case Mono.Cecil.Cil.Code.Ldelem_U2:
            case Mono.Cecil.Cil.Code.Ldind_U2:
            case Mono.Cecil.Cil.Code.Conv_U2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U2:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U2_Un: return(PlatformType.UInt16);

            case Mono.Cecil.Cil.Code.Ldelem_U4:
            case Mono.Cecil.Cil.Code.Ldind_U4:
            case Mono.Cecil.Cil.Code.Conv_U4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U4:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U4_Un:
            case Mono.Cecil.Cil.Code.Sizeof: return(PlatformType.UInt32);

            case Mono.Cecil.Cil.Code.Conv_U8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U8:
            case Mono.Cecil.Cil.Code.Conv_Ovf_U8_Un: return(PlatformType.UInt64);

            case Mono.Cecil.Cil.Code.Ldelem_R4:
            case Mono.Cecil.Cil.Code.Ldc_R4:
            case Mono.Cecil.Cil.Code.Ldind_R4:
            case Mono.Cecil.Cil.Code.Stind_R4:
            case Mono.Cecil.Cil.Code.Stelem_R4:
            case Mono.Cecil.Cil.Code.Conv_R4: return(PlatformType.Float32);

            case Mono.Cecil.Cil.Code.Ldelem_R8:
            case Mono.Cecil.Cil.Code.Ldc_R8:
            case Mono.Cecil.Cil.Code.Ldind_R8:
            case Mono.Cecil.Cil.Code.Stind_R8:
            case Mono.Cecil.Cil.Code.Stelem_R8:
            case Mono.Cecil.Cil.Code.Conv_R8:
            case Mono.Cecil.Cil.Code.Conv_R_Un: return(PlatformType.Float64);

            case Mono.Cecil.Cil.Code.Ldelem_Ref:
            case Mono.Cecil.Cil.Code.Stelem_Ref:
            case Mono.Cecil.Cil.Code.Stind_Ref:
            case Mono.Cecil.Cil.Code.Ldind_Ref:
            case Mono.Cecil.Cil.Code.Ldnull: return(PlatformType.Object);

            case Mono.Cecil.Cil.Code.Ldstr: return(PlatformType.String);

            default: return(null);
            }
        }