public Avr8CallingConvention(IProcessorArchitecture arch) { this.arch = arch; this.argRegs = (from reg in arch.GetRegisters() where 8 <= reg.Number && reg.Number <= 26 orderby reg.Number select reg).ToArray(); }
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); } } }