private bool ProcessRtlCluster(RtlInstructionCluster ric) { state.SetInstructionPointer(ric.Address); foreach (var rtlInstr in ric.Instructions) { ri = rtlInstr; if (!ri.Accept(this)) { return(false); } } return(true); }
private bool ProcessRtlCluster(RtlInstructionCluster ric) { if (ric.Address.ToLinear() == 0x30C) //$DEBUG { ric.Address.ToString(); } state.SetInstructionPointer(ric.Address); SetAssumedRegisterValues(ric.Address); foreach (var rtlInstr in ric.Instructions) { ri = rtlInstr; if (!ri.Accept(this)) { return(false); } } return(true); }
public void ProcessInternal() { state.ErrorListener = (message) => { scanner.Warn(ric.Address, message); }; blockCur = scanner.FindContainingBlock(addrStart); if (BlockHasBeenScanned(blockCur)) { return; } Debug.Print("Scanning jump target {0}", addrStart); frame = blockCur.Procedure.Frame; this.stackReg = frame.EnsureRegister(arch.StackRegister); rtlStream = scanner.GetTrace(addrStart, state, frame) .GetEnumerator(); while (rtlStream.MoveNext()) { ric = rtlStream.Current; if (blockCur != scanner.FindContainingBlock(ric.Address)) { break; } state.SetInstructionPointer(ric.Address); foreach (var rtlInstr in ric.Instructions) { ri = rtlInstr; if (!ri.Accept(this)) { return; } } var blNext = FallenThroughNextBlock(ric.Address + ric.Length); if (blNext != null) { EnsureEdge(blockCur.Procedure, blockCur, blNext); return; } } }