public SlicerResult VisitSideEffect(RtlSideEffect side) { return(new SlicerResult { Stop = true }); }
public bool VisitSideEffect(RtlSideEffect side) { var svc = MatchSyscallToService(side); if (svc != null) { return(!EmitSystemServiceCall(svc)); } else { Emit(new SideEffect(side.Expression)); var appl = side.Expression as Application; if (appl != null) { var fn = appl.Procedure as ProcedureConstant; if (fn != null) { if (fn.Procedure.Characteristics.Terminates) { scanner.TerminateBlock(blockCur, ric.Address + ric.Length); return(false); } } } } return(true); }
private SystemService MatchSyscallToService(RtlSideEffect side) { var fn = side.Expression as Application; if (fn == null) { return(null); } var pc = fn.Procedure as ProcedureConstant; if (pc == null) { return(null); } var ppp = pc.Procedure as PseudoProcedure; if (ppp == null) { return(null); } if (ppp.Name != PseudoProcedure.Syscall || fn.Arguments.Length == 0) { return(null); } var vector = fn.Arguments[0] as Constant; if (vector == null) { return(null); } var svc = program.Platform.FindService(vector.ToInt32(), state); if (svc != null && svc.Signature == null) { scanner.Error(ric.Address, string.Format("System service '{0}' didn't specify a signature.", svc.Name)); } return(svc); }
public RtlInstruction SideEffect(Expression exp) { var side = new RtlSideEffect(exp); return(Emit(side)); }
public RtlEmitter SideEffect(Expression sideEffect) { var se = new RtlSideEffect(sideEffect); se.Class = RtlClass.Linear; instrs.Add(se); return this; }
public RtlInstruction SideEffect(Expression exp, InstrClass iclass = InstrClass.Linear) { var side = new RtlSideEffect(exp, iclass); return(Emit(side)); }
public RtlInstruction SideEffect(Expression exp) { var side = new RtlSideEffect(exp); return Emit(side); }
public SlicerResult VisitSideEffect(RtlSideEffect side) { return(null); }