示例#1
0
            public bool VisitRegisterStorage(RegisterStorage reg)
            {
                //$REFACTOR: make SetAliases be a bitset of Register.
                var aliases = arch.GetAliases(reg);

                return(liveState.Identifiers.Overlaps(aliases));
            }
示例#2
0
            public override void InitializeBlockFlow(Block block, ProgramDataFlow flow, bool isExitBlock)
            {
                BlockFlow bf = flow[block];

                if (isExitBlock && block.Procedure.Signature.ParametersValid)
                {
                    Identifier ret = block.Procedure.Signature.ReturnValue;
                    if (ret != null)
                    {
                        RegisterStorage rs = ret.Storage as RegisterStorage;
                        if (rs != null)
                        {
                            bf.DataOut.UnionWith(arch.GetAliases(rs));
                        }
                    }
                    foreach (Identifier id in block.Procedure.Signature.Parameters)
                    {
                        OutArgumentStorage os = id.Storage as OutArgumentStorage;
                        if (os == null)
                        {
                            continue;
                        }
                        RegisterStorage rs = os.OriginalIdentifier.Storage as RegisterStorage;
                        if (rs != null)
                        {
                            bf.DataOut.UnionWith(arch.GetAliases(rs));
                        }
                    }
                }
                else if (bf.TerminatesProcess)
                {
                    bf.DataOut.Clear();
                }
                else
                {
                    bf.DataOut.Clear();
                    if (isExitBlock)
                    {
                        //Add all registers except preserved registers
                        bf.DataOut.UnionWith(arch.GetRegisters());
                        bf.DataOut.ExceptWith(flow[block.Procedure].PreservedRegisters);
                    }
                }
            }
示例#3
0
        public virtual void DefinedRegister(RegisterStorage reg)
        {
            defOffset  = (int)reg.BitAddress;
            defBitSize = reg.DataType.BitSize;
            var widestSub = arch.GetWidestSubregister(reg, ids);

            if (widestSub != null)
            {
                defOffset  = Math.Max((int)widestSub.BitAddress, defOffset);
                defBitSize = Math.Min(widestSub.DataType.BitSize, defBitSize);
            }
            arch.RemoveAliases(ids, reg);
            ids.ExceptWith(arch.GetAliases(reg));
        }