protected override void RunTest(Program prog, TextWriter writer) { DataFlowAnalysis dfa = new DataFlowAnalysis(prog, new FakeDecompilerEventListener()); dfa.UntangleProcedures(); foreach (Procedure proc in prog.Procedures.Values) { Aliases alias = new Aliases(proc, prog.Architecture); alias.Transform(); SsaTransform sst = new SsaTransform(dfa.ProgramDataFlow, proc, proc.CreateBlockDominatorGraph()); 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 = 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()); }