protected override void RunTest(Program program, TextWriter writer) { var importResolver = MockRepository.GenerateStub<IImportResolver>(); importResolver.Replay(); var dfa = new DataFlowAnalysis(program, importResolver, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in program.Procedures.Values) { Aliases alias = new Aliases(proc, program.Architecture); alias.Transform(); SsaTransform sst = new SsaTransform( dfa.ProgramDataFlow, proc, importResolver, proc.CreateBlockDominatorGraph(), new HashSet<RegisterStorage>()); SsaState ssa = sst.SsaState; GrfDefinitionFinder grfd = new GrfDefinitionFinder(ssa.Identifiers); foreach (SsaIdentifier sid in ssa.Identifiers) { var id = sid.OriginalIdentifier as Identifier; if (id == null || !(id.Storage is FlagGroupStorage) || sid.Uses.Count == 0) continue; writer.Write("{0}: ", sid.DefStatement.Instruction); grfd.FindDefiningExpression(sid); string fmt = grfd.IsNegated ? "!{0};" : "{0}"; writer.WriteLine(fmt, grfd.DefiningExpression); } } }
public Expression UseGrfConditionally(SsaIdentifier sid, ConditionCode cc) { GrfDefinitionFinder gf = new GrfDefinitionFinder(ssaIds); gf.FindDefiningExpression(sid); Expression e = gf.DefiningExpression; if (e == null) { return(sid.Identifier); } BinaryExpression binDef = e as BinaryExpression; if (binDef != null) { if (gf.IsNegated) { e = e.Invert(); } return(e); } ConditionOf cof = e as ConditionOf; if (cof != null) { binDef = cof.Expression as BinaryExpression; if (binDef == null) { binDef = CmpExpressionToZero(cof.Expression); } return(ComparisonFromConditionCode(cc, binDef, gf.IsNegated)); } Application app = e as Application; if (app != null) { return(sid.Identifier); } PhiFunction phi = e as PhiFunction; if (phi != null) { return(sid.Identifier); } throw new NotImplementedException("NYI: e: " + e.ToString()); }
public Expression UseGrfConditionally(SsaIdentifier sid, ConditionCode cc) { var gf = new GrfDefinitionFinder(ssaIds); gf.FindDefiningExpression(sid); Expression e = gf.DefiningExpression; if (e == null) { return(sid.Identifier); } switch (e) { case BinaryExpression binDef: if (gf.IsNegated) { e = e.Invert(); } return(e); case ConditionOf cof: var condBinDef = cof.Expression as BinaryExpression; if (condBinDef == null) { condBinDef = CmpExpressionToZero(cof.Expression); } return(ComparisonFromConditionCode(cc, condBinDef, gf.IsNegated)); case Application app: return(sid.Identifier); case PhiFunction phi: return(sid.Identifier); default: throw new NotImplementedException("NYI: e: " + e.ToString()); } }
public Expression UseGrfConditionally(SsaIdentifier sid, ConditionCode cc) { GrfDefinitionFinder gf = new GrfDefinitionFinder(ssaIds); gf.FindDefiningExpression(sid); Expression e = gf.DefiningExpression; if (e == null) { return sid.Identifier; } BinaryExpression binDef = e as BinaryExpression; if (binDef != null) { if (gf.IsNegated) e = new UnaryExpression(Operator.Not, PrimitiveType.Bool, e); return e; } ConditionOf cof = e as ConditionOf; if (cof != null) { binDef = cof.Expression as BinaryExpression; if (binDef == null) binDef = CmpExpressionToZero(cof.Expression); return ComparisonFromConditionCode(cc, binDef, gf.IsNegated); } Application app = e as Application; if (app != null) { return sid.Identifier; } PhiFunction phi = e as PhiFunction; if (phi != null) { return sid.Identifier; } throw new NotImplementedException("NYI: e: " + e.ToString()); }