public bool VisitRegisterStorage(RegisterStorage reg) { //$REFACTOR: make SetAliases be a bitset of Register. var aliases = arch.GetAliases(reg); return(liveState.Identifiers.Overlaps(aliases)); }
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); } } }
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)); }