コード例 #1
0
ファイル: IAddOperator.cs プロジェクト: fengjixuchui/reko
 public override Constant ApplyConstants(Constant c1, Constant c2)
 {
     if (!ValidArgs(c1, c2))
     {
         return(InvalidConstant.Create(c1.DataType));
     }
     if (c1.DataType.IsPointer && c2.DataType.IsIntegral)
     {
         var dt = PrimitiveType.Create(Domain.Pointer, c1.DataType.BitSize);
         return(Constant.Create(dt, c1.ToUInt64() + c2.ToUInt64()));
     }
     else if (c2.DataType.IsPointer && c1.DataType.IsIntegral)
     {
         var dt = PrimitiveType.Create(Domain.Pointer, c2.DataType.BitSize);
         return(Constant.Create(dt, c1.ToUInt64() + c2.ToUInt64()));
     }
     else
     {
         var p1 = (PrimitiveType)c1.DataType;
         var p2 = (PrimitiveType)c1.DataType;
         if ((p1.Domain & p2.Domain) == 0 &&
             (p1.Domain | p2.Domain) != Domain.Integer)
         {
             throw new ArgumentException(string.Format("Can't add types of disjoint domains {0} and {1}", c1.DataType, c2.DataType));
         }
     }
     if (c2.DataType.BitSize <= 64 && c2.DataType.BitSize <= 64)
     {
         return(BuildConstant(c1.DataType, c2.DataType, c1.ToInt64() + c2.ToInt64()));
     }
     else
     {
         return(BuildConstant(c1.DataType, c2.DataType, c1.ToBigInteger() + c2.ToBigInteger()));
     }
 }
コード例 #2
0
 /// <summary>
 /// Get the PIC register value. If the register is composed of subregisters, then calculate the value based on individual subregisters.
 /// </summary>
 /// <param name="reg">The PIC register.</param>
 /// <returns>
 /// The register value as a constant or invalid..
 /// </returns>
 public override Constant GetRegister(RegisterStorage reg)
 {
     if ((reg is PICRegisterStorage preg) && IsValid(preg))
     {
         uint ival;
         if (preg.HasAttachedRegs)
         {
             ival = 0;
             foreach (var sreg in preg.AttachedRegs !)
             {
                 if (!IsValid(sreg))
                 {
                     return(InvalidConstant.Create(reg.DataType));
                 }
                 ival |= ValidRegsValues[sreg].ActualValue << (int)sreg.BitAddress;
             }
         }
         else
         {
             ival = ValidRegsValues[preg].ActualValue;
         }
         return(Constant.Create(reg.DataType, ival));
     }
     return(InvalidConstant.Create(reg.DataType));
 }
コード例 #3
0
        private void OkButton_Click(object sender, EventArgs e)
        {
            var items = new Dictionary <Storage, Constant>();

            foreach (DataGridViewRow row in dlg.Grid.Rows)
            {
                Storage stg = null;
                if (row.Cells[0].Value is string sRegister)
                {
                    if (dlg.Architecture.TryGetRegister(sRegister, out var reg))
                    {
                        stg = reg;
                    }
                    else
                    {
                        stg = dlg.Architecture.GetFlagGroup(sRegister);
                    }
                }
                if (stg != null && row.Cells[1].Value is string sValue)
                {
                    var value = sValue != "*"
                        ? Constant.Create(stg.DataType, Convert.ToUInt64(sValue, 16))
                        : InvalidConstant.Create(stg.DataType);
                    items[stg] = value;
                }
            }
            var list = items.Select(de => new UserRegisterValue(de.Key, de.Value)).ToList();

            dlg.RegisterValues = list;
        }
コード例 #4
0
        public void M68ks_SetIllegalValue()
        {
            var invalid = InvalidConstant.Create(Registers.a7.DataType);

            state.SetValue(Registers.a7, invalid);
            Assert.AreSame(invalid, state.GetValue(Registers.a7));
        }
コード例 #5
0
ファイル: ISubOperator.cs プロジェクト: fengjixuchui/reko
 public override Constant ApplyConstants(Constant c1, Constant c2)
 {
     if (!ValidArgs(c1, c2))
     {
         return(InvalidConstant.Create(c1.DataType));
     }
     if (c1.DataType.IsPointer && c2.DataType.IsIntegral)
     {
         var dt = PrimitiveType.Create(Domain.Pointer, c1.DataType.BitSize);
         return(Constant.Create(dt, c1.ToUInt64() - c2.ToUInt64()));
     }
     else if (c2.DataType.IsPointer && c1.DataType.IsIntegral)
     {
         var dt = PrimitiveType.Create(Domain.Pointer, c2.DataType.BitSize);
         return(Constant.Create(dt, c1.ToUInt64() - c2.ToUInt64()));
     }
     else if (c1.DataType.BitSize <= 64 && c2.DataType.BitSize <= 64)
     {
         return(BuildConstant(c1.DataType, c2.DataType, c1.ToInt64() - c2.ToInt64()));
     }
     else
     {
         return(BuildConstant(c1.DataType, c2.DataType, c1.ToBigInteger() - c2.ToBigInteger()));
     }
 }
コード例 #6
0
        public CallInstruction Call(string procedureName, int retSizeOnStack)
        {
            var ci = new CallInstruction(InvalidConstant.Create(Architecture.WordWidth), new CallSite(retSizeOnStack, 0));

            unresolvedProcedures.Add(new ProcedureConstantUpdater(procedureName, ci));
            Emit(ci);
            return(ci);
        }
コード例 #7
0
 public override Expression BindReturnValue(Identifier id)
 {
     if (returnValues.ContainsKey(id))
     {
         return(returnValues[id]);
     }
     return(InvalidConstant.Create(id.DataType));
 }
コード例 #8
0
 public override Constant ApplyConstants(Constant c1, Constant c2)
 {
     if (!ValidArgs(c1, c2))
     {
         return(InvalidConstant.Create(PrimitiveType.Bool));
     }
     return(Constant.Bool(c1.ToReal64() <= c2.ToReal64()));
 }
コード例 #9
0
 public override Constant ApplyConstants(Constant c1, Constant c2)
 {
     if (!ValidArgs(c1, c2))
     {
         return(InvalidConstant.Create(c1.DataType));
     }
     return(c1.ToInt32() == c2.ToInt32() ? Constant.True() : Constant.False());
 }
コード例 #10
0
ファイル: SuperHState.cs プロジェクト: fengjixuchui/reko
 public override Constant GetRegister(RegisterStorage r)
 {
     if (regValues.TryGetValue(r.Domain, out var constant))
     {
         return(constant);
     }
     return(InvalidConstant.Create(r.DataType));
 }
コード例 #11
0
 public override Constant ApplyConstants(Constant c1, Constant c2)
 {
     if (!ValidArgs(c1, c2))
     {
         return(InvalidConstant.Create(c1.DataType));
     }
     return(Constant.Bool(c1.ToReal64() < c2.ToReal64()));
 }
コード例 #12
0
 public override Constant ApplyConstants(Constant c1, Constant c2)
 {
     if (!ValidArgs(c1, c2))
     {
         return(InvalidConstant.Create(c1.DataType));
     }
     return(BuildConstant(c1.DataType, c2.DataType, c1.ToInt64() | c2.ToInt64()));
 }
コード例 #13
0
 public override Constant GetRegister(RegisterStorage r)
 {
     if (!regs.TryGetValue(r, out Constant c))
     {
         c = InvalidConstant.Create(r.DataType);
     }
     return(c);
 }
コード例 #14
0
ファイル: PowerPcState.cs プロジェクト: fengjixuchui/reko
 public override Constant GetRegister(RegisterStorage reg)
 {
     if (regs.TryGetValue(reg, out Constant value))
     {
         return value;
     }
     else
         return InvalidConstant.Create(reg.DataType);
 }
コード例 #15
0
ファイル: ProcedureBuilder.cs プロジェクト: fengjixuchui/reko
        public CallInstruction Call(string procedureName, int retSizeOnStack)
        {
            var tmp = InvalidConstant.Create(PrimitiveType.Word32);
            var ci  = new CallInstruction(tmp, new CallSite(retSizeOnStack, 0));

            unresolvedProcedures.Add(new ProcedureConstantUpdater(procedureName, ci));
            Emit(ci);
            return(ci);
        }
コード例 #16
0
ファイル: SarOperator.cs プロジェクト: nemerle/reko
 public override Constant ApplyConstants(Constant c1, Constant c2)
 {
     if (!ValidArgs(c1, c2))
     {
         return(InvalidConstant.Create(c1.DataType));
     }
     return(Constant.Create(
                PrimitiveType.Create(Domain.SignedInt, c1.DataType.BitSize),
                c1.ToInt64() >> c2.ToInt32()));
 }
コード例 #17
0
ファイル: Substitutor.cs プロジェクト: fengjixuchui/reko
        public Expression VisitMemoryAccess(MemoryAccess access)
        {
            var ea = access.EffectiveAddress.Accept(this);

            if (ea is InvalidConstant)
            {
                return(InvalidConstant.Create(access.DataType));
            }
            return(new MemoryAccess(access.MemoryId, ea, access.DataType));
        }
コード例 #18
0
ファイル: SsaMutator.cs プロジェクト: nemerle/reko
        private void DefineUninitializedIdentifier(
            Statement stm,
            SsaIdentifier sid)
        {
            var value  = InvalidConstant.Create(sid.Identifier.DataType);
            var ass    = new Assignment(sid.Identifier, value);
            var newStm = InsertStatementAfter(ass, stm);

            sid.DefExpression = value;
            sid.DefStatement  = newStm;
        }
コード例 #19
0
ファイル: SparcProcessorState.cs プロジェクト: nemerle/reko
 public override Constant GetRegister(RegisterStorage reg)
 {
     if (arch.Registers.IsGpRegister(reg) && valid[reg.Number])
     {
         return(Constant.Create(reg.DataType, regs[reg.Number]));
     }
     else
     {
         return(InvalidConstant.Create(reg.DataType));
     }
 }
コード例 #20
0
 public void BwiX86_SubWithSelf()
 {
     BuildTest32(m =>
     {
         m.Sub(m.eax, m.eax);
         scanner.Setup(x => x.FindContainingBlock(It.Is <Address>(addr => addr.Offset == 0x00010000))).Returns(block);
     });
     state.SetRegister(Registers.eax, InvalidConstant.Create(PrimitiveType.Word32));
     wi.Process();
     Assert.AreEqual(0, state.GetRegister(Registers.eax).ToInt32());
 }
コード例 #21
0
        public override Constant ApplyConstants(Constant c1, Constant c2)
        {
            if (!ValidArgs(c1, c2))
            {
                return(InvalidConstant.Create(c1.DataType));
            }
            ulong v1 = c1.ToUInt64();
            ulong v2 = c2.ToUInt64();

            return(Constant.Bool(v1 <= v2));
        }
コード例 #22
0
 public override Constant GetRegister(RegisterStorage r)
 {
     if (valid[r.Number])
     {
         return(Constant.Byte(regs[r.Number]));
     }
     else
     {
         return(InvalidConstant.Create(r.DataType));
     }
 }
コード例 #23
0
ファイル: AArch32ProcessorState.cs プロジェクト: nemerle/reko
 public override Constant GetRegister(RegisterStorage r)
 {
     if (regData.TryGetValue(r.Number, out ulong uVal))
     {
         return(Constant.Create(r.DataType, uVal));
     }
     else
     {
         return(InvalidConstant.Create(r.DataType));
     }
 }
コード例 #24
0
 public override Constant GetRegister(RegisterStorage reg)
 {
     if (isValid[(int)reg.Domain])
     {
         return(Constant.Create(reg.DataType, registerFile[(int)reg.Domain]));
     }
     else
     {
         return(InvalidConstant.Create(reg.DataType));
     }
 }
コード例 #25
0
ファイル: ARCompactState.cs プロジェクト: nemerle/reko
 public override Constant GetRegister(RegisterStorage r)
 {
     if (!values.TryGetValue(r, out var value))
     {
         return(InvalidConstant.Create(r.DataType));
     }
     else
     {
         return(value);
     }
 }
コード例 #26
0
ファイル: Substitutor.cs プロジェクト: fengjixuchui/reko
        public Expression VisitArrayAccess(ArrayAccess acc)
        {
            var arr = acc.Array.Accept(this);
            var idx = acc.Index.Accept(this);

            if (arr is InvalidConstant || idx is InvalidConstant)
            {
                return(InvalidConstant.Create(acc.DataType));
            }
            return(new ArrayAccess(acc.DataType, arr, idx));
        }
コード例 #27
0
ファイル: X86State.cs プロジェクト: nemerle/reko
 public override Constant GetRegister(RegisterStorage reg)
 {
     if (IsValid(reg))
     {
         var val = (regs[reg.Number] & reg.BitMask) >> (int)reg.BitAddress;
         return(Constant.Create(reg.DataType, val));
     }
     else
     {
         return(InvalidConstant.Create(reg.DataType));
     }
 }
コード例 #28
0
 public override Constant ApplyConstants(Constant c1, Constant c2)
 {
     if (!ValidArgs(c1, c2))
     {
         return(InvalidConstant.Create(c2.DataType));
     }
     if (c2.IsIntegerZero)
     {
         return(InvalidConstant.Create(c1.DataType));
     }
     return(BuildConstant(c1.DataType, c2.DataType, c1.ToInt32() % c2.ToInt32()));
 }
コード例 #29
0
        public void Identifier_GetValue()
        {
            var id      = m.Register("r3");
            var invalid = InvalidConstant.Create(id.DataType);

            ctx.Setup(c => c.GetValue(id)).Returns(invalid);

            var subst    = new Substitutor(ctx.Object);
            var cInvalid = id.Accept(subst);

            Assert.AreSame(invalid, cInvalid);
        }
コード例 #30
0
        public void ConditionOf_Invalid()
        {
            var id = m.Register("r3");
            var e  = m.Cond(id);

            ctx.Setup(c => c.GetValue(id)).Returns(InvalidConstant.Create(id.DataType));

            var subst = new Substitutor(ctx.Object);
            var e2    = e.Accept(subst);

            Assert.IsTrue(e2 is InvalidConstant);
        }