コード例 #1
0
ファイル: BackwardSlicer.cs プロジェクト: chostelet/reko
 public SlicerResult VisitSideEffect(RtlSideEffect side)
 {
     return(new SlicerResult
     {
         Stop = true
     });
 }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }
コード例 #4
0
        public RtlInstruction SideEffect(Expression exp)
        {
            var side = new RtlSideEffect(exp);

            return(Emit(side));
        }
コード例 #5
0
ファイル: RtlEmitter.cs プロジェクト: relaxar/reko
 public RtlEmitter SideEffect(Expression sideEffect)
 {
     var se = new RtlSideEffect(sideEffect);
     se.Class = RtlClass.Linear;
     instrs.Add(se);
     return this;
 }
コード例 #6
0
ファイル: RtlStatementStream.cs プロジェクト: erenes/reko
        public RtlInstruction SideEffect(Expression exp, InstrClass iclass = InstrClass.Linear)
        {
            var side = new RtlSideEffect(exp, iclass);

            return(Emit(side));
        }
コード例 #7
0
ファイル: RtlStatementStream.cs プロジェクト: nemerle/reko
 public RtlInstruction SideEffect(Expression exp)
 {
     var side = new RtlSideEffect(exp);
     return Emit(side);
 }
コード例 #8
0
 public SlicerResult VisitSideEffect(RtlSideEffect side)
 {
     return(null);
 }