public void Setup() { store = new TypeStore(); factory = new TypeFactory(); nct = new NestedComplexTypeExtractor(factory, store); }
public void PprReplaceInts() { var arch = new FakeArchitecture(); var program = new Program { Architecture = arch, Platform = new DefaultPlatform(null, arch) }; TypeFactory factory = new TypeFactory(); store = new TypeStore(); TypeVariable tv1 = store.CreateTypeVariable(factory); TypeVariable tv2 = store.CreateTypeVariable(factory); Assert.IsNotNull(tv1.Class, "Expected store.EnsureTypeVariable to create equivalence class"); Assert.IsNotNull(tv2.Class, "Expected store.EnsureTypeVariable to create equivalence class"); tv1.Class.DataType = PrimitiveType.Word32; tv2.Class.DataType = PrimitiveType.Word16; program.Globals.TypeVariable = store.CreateTypeVariable(factory); program.Globals.DataType = factory.CreateStructureType(); TypeVariable tv3 = store.CreateTypeVariable(factory); Assert.IsNotNull(tv3.Class, "Expected store.EnsureTypeVariable to create equivalence class"); StructureType mem = factory.CreateStructureType(null, 0); mem.Fields.Add(0, tv1); mem.Fields.Add(4, tv2); tv3.Class.DataType = factory.CreatePointer(mem, 4); store.CopyClassDataTypesToTypeVariables(); TypeVariableReplacer tvr = new TypeVariableReplacer(store); tvr.ReplaceTypeVariables(); var ppr = new PtrPrimitiveReplacer(factory, store, program); ppr.ReplaceAll(); Verify(null, "Typing/PprReplaceInts.txt"); }
public PtrPrimitiveReplacer(TypeFactory factory, TypeStore store, Program program) { this.factory = factory; this.store = store; this.program = program; this.visitedTypes = new HashSet<DataType>(); }
public DataTypeBuilder(TypeFactory factory, ITypeStore store, IPlatform platform) { this.store = store; this.factory = factory; this.unifier = new DataTypeBuilderUnifier(factory, store); this.platform = platform; }
public EquivalenceClassBuilder(TypeFactory factory, TypeStore store) { this.factory = factory; this.store = store; this.signature = null; this.segTypevars = new Dictionary<ushort, TypeVariable>(); }
public void Setup() { mem = new MemoryArea(Address.Ptr32(0x00100000), new byte[1024]); var arch = new FakeArchitecture(); this.program = new Program { Architecture = arch, SegmentMap = new SegmentMap( mem.BaseAddress, new ImageSegment(".text", mem, AccessMode.ReadWriteExecute)), Platform = new DefaultPlatform(null, arch), }; store = program.TypeStore; factory = program.TypeFactory; globals = program.Globals; store.EnsureExpressionTypeVariable(factory, globals); StructureType s = new StructureType(null, 0); s.Fields.Add(0x00100000, PrimitiveType.Word32, null); TypeVariable tvGlobals = store.EnsureExpressionTypeVariable(factory, globals); EquivalenceClass eqGlobals = new EquivalenceClass(tvGlobals); eqGlobals.DataType = s; globals.TypeVariable.DataType = new Pointer(eqGlobals, 4); globals.DataType = globals.TypeVariable.DataType; }
public void Setup() { var image = new LoadedImage(Address.Ptr32(0x00100000), new byte[1024]); var arch = new FakeArchitecture(); var program = new Program { Image = image, Architecture = arch, ImageMap = image.CreateImageMap(), Platform = new DefaultPlatform(null, arch), }; store = program.TypeStore; factory = program.TypeFactory; globals = program.Globals; store.EnsureExpressionTypeVariable(factory, globals); StructureType s = new StructureType(null, 0); s.Fields.Add(0x00100000, PrimitiveType.Word32, null); TypeVariable tvGlobals = store.EnsureExpressionTypeVariable(factory, globals); EquivalenceClass eqGlobals = new EquivalenceClass(tvGlobals); eqGlobals.DataType = s; globals.TypeVariable.DataType = new Pointer(eqGlobals, 4); globals.DataType = globals.TypeVariable.DataType; tcr = new TypedConstantRewriter(program); }
public TypeVariable CreateTypeVariable(TypeFactory factory) { TypeVariable tv = factory.CreateTypeVariable(); tv.Class = new EquivalenceClass(tv); this.TypeVariables.Add(tv); this.usedClasses.Add(tv.Class.Number, tv.Class); return tv; }
public AddressTraitCollector(TypeFactory factory, ITypeStore store, ITraitHandler handler, Program program) { this.factory = factory; this.store = store; this.handler = handler; this.program = program; this.arrayContext = false; }
public ExpressionTypeAscender( Program program, TypeStore store, TypeFactory factory) : base(program, factory) { this.unifier = new DataTypeBuilderUnifier(factory, store); }
public void Setup() { factory = new TypeFactory(); store = new TypeStore(); eqb = new EquivalenceClassBuilder(factory, store); var platform = new DefaultPlatform(null, new FakeArchitecture()); dtb = new DataTypeBuilder(factory, store, platform); }
public void Setup() { this.m = new ExpressionEmitter(); this.store = new TypeStore(); this.factory = new TypeFactory(); var arch = new FakeArchitecture(); var platform = new DefaultPlatform(null, arch); this.exa = new ExpressionTypeAscender(platform, store, factory); }
public void TvrReplaceInStruct() { TypeFactory factory = new TypeFactory(); TypeStore store = new TypeStore(); EquivalenceClassBuilder eqb = new EquivalenceClassBuilder(factory, store); Identifier pptr = new Identifier("pptr", PrimitiveType.Word32, null); Identifier ptr = new Identifier("ptr", PrimitiveType.Word32, null); }
public void CastCreate() { TypeFactory typef = new TypeFactory(); var cast = new Cast(PrimitiveType.Word32, Constant.Real32(3.0F)); var p = (PrimitiveType) cast.DataType; Assert.AreEqual(PrimitiveType.Word32, p); Assert.AreEqual(PrimitiveType.Real32, cast.Expression.DataType); }
public override DataType BuildDataType(Reko.Core.Types.TypeFactory factory) { UnionType u = factory.CreateUnionType(Name, null); foreach (var alt in Alternatives) { u.Alternatives.Add(new UnionAlternative(alt.Name, alt.Type.BuildDataType(factory))); } return(u); }
public void Setup() { this.m = new ExpressionEmitter(); this.store = new TypeStore(); this.factory = new TypeFactory(); this.arch = new FakeArchitecture(); this.program = new Program { Architecture = arch, Platform = new DefaultPlatform(null, arch) }; this.exa = new ExpressionTypeAscender(program, store, factory); this.exd = new ExpressionTypeDescender(program, store, factory); store.EnsureExpressionTypeVariable(factory, program.Globals, "globals_t"); }
public void SetUp() { store = new TypeStore(); factory = new TypeFactory(); aen = new ExpressionNormalizer(PrimitiveType.Pointer32); eqb = new EquivalenceClassBuilder(factory, store); arch = new FakeArchitecture(); prog = new Program(); prog.Architecture = arch; prog.Platform = new DefaultPlatform(null, arch); dtb = new DataTypeBuilder(factory, store, prog.Platform); }
public void NameStructure() { var store = new TypeStore(); var factory = new TypeFactory(); var tv1 = store.CreateTypeVariable(factory); tv1.Class.DataType = new StructureType(null, 0); tv1.DataType = tv1.Class.DataType; var ctn = new ComplexTypeNamer(); ctn.RenameAllTypes(store); Assert.AreEqual("Eq_1", tv1.Class.DataType.Name); }
public TypeVariable EnsureExpressionTypeVariable(TypeFactory factory, Expression e, string name) { if (e != null && e.TypeVariable != null) return e.TypeVariable; TypeVariable tv = name != null ? factory.CreateTypeVariable(name) : factory.CreateTypeVariable(); AddDebugSource(tv, e); tv.Class = new EquivalenceClass(tv); if (e != null) e.TypeVariable = tv; this.TypeVariables.Add(tv); this.usedClasses.Add(tv.Class.Number, tv.Class); return tv; }
public TypeCollector( TypeFactory factory, TypeStore store, Program program, DecompilerEventListener eventListener) { this.factory = factory; this.store = store; this.program = program; if (eventListener == null) throw new ArgumentNullException("eventListener"); this.eventListener = eventListener; this.asc = new ExpressionTypeAscender(program, store, factory); this.desc = new ExpressionTypeDescender(program, store, factory); }
public void EqbSimpleEquivalence() { TypeFactory factory = new TypeFactory(); TypeStore store = new TypeStore(); EquivalenceClassBuilder eqb = new EquivalenceClassBuilder(factory, store); Identifier id1 = new Identifier("id2", PrimitiveType.Word32, null); Identifier id2 = new Identifier("id2", PrimitiveType.Word32, null); Assignment ass = new Assignment(id1, id2); ass.Accept(eqb); Assert.IsNotNull(id1); Assert.IsNotNull(id2); Assert.AreEqual(2, id1.TypeVariable.Number, "id1 type number"); Assert.AreEqual(2, id1.TypeVariable.Number, "id2 type number"); Assert.AreEqual(id1.TypeVariable.Class, id2.TypeVariable.Class); }
public static bool ReplaceAll(TypeFactory factory, TypeStore store) { EquivalenceClass [] eqs = new EquivalenceClass[store.UsedEquivalenceClasses.Count]; store.UsedEquivalenceClasses.CopyTo(eqs, 0); bool changed = false; for (int i = 0; i < eqs.Length; ++i) { if (eqs[i].DataType != null) { NestedComplexTypeExtractor nctr = new NestedComplexTypeExtractor(factory, store); eqs[i].DataType = eqs[i].DataType.Accept(nctr); changed |= nctr.Changed; } } return changed; }
/// <summary> /// Performs type analysis and rewrites program based on the inferred information. /// </summary> /// <remarks> /// For instance, all MemoryAccesses will be converted to structure field /// accesses or array accesses as appropriate. /// </remarks> /// <param name="program"></param> public void RewriteProgram(Program program) { factory = program.TypeFactory; store = program.TypeStore; aen = new ExpressionNormalizer(program.Platform.PointerType); eqb = new EquivalenceClassBuilder(factory, store); #if OLD dtb = new DataTypeBuilder(factory, store, program.Platform); trco = new TraitCollector(factory, store, dtb, program); #else tyco = new TypeCollector(program.TypeFactory, program.TypeStore, program); #endif //dpa = new DerivedPointerAnalysis(factory, store, program.Architecture); tvr = new TypeVariableReplacer(store); trans = new TypeTransformer(factory, store,program, eventListener); ctn = new ComplexTypeNamer(); ter = new TypedExpressionRewriter(program); // RestrictProcedures(program, 0, 1, true); // Re-enable this for debugging eventListener.ShowStatus("Gathering primitive datatypes from instructions."); aen.Transform(program); eqb.Build(program); #if OLD eventListener.ShowStatus("Collecting datatype usage traits."); trco.CollectProgramTraits(program); eventListener.ShowStatus("Building equivalence classes."); dtb.BuildEquivalenceClassDataTypes(); #else eventListener.ShowStatus("Collecting data types"); tyco.CollectTypes(); store.BuildEquivalenceClassDataTypes(factory); #endif //dpa.FollowConstantPointers(prog); tvr.ReplaceTypeVariables(); eventListener.ShowStatus("Transforming datatypes."); var ppr = new PtrPrimitiveReplacer(factory, store, program); ppr.ReplaceAll(); trans.Transform(); ctn.RenameAllTypes(store); store.Dump(); eventListener.ShowStatus("Rewriting expressions."); ter.RewriteProgram(program); }
public void Setup() { var image = new LoadedImage(Address.Ptr32(0x00400000), new byte[1024]); var arch = new FakeArchitecture(); program = new Program { Architecture = arch, Image = image, ImageMap = image.CreateImageMap(), Platform = new DefaultPlatform(null, arch) }; store = program.TypeStore; factory = program.TypeFactory; point = new StructureType(null, 0); point.Fields.Add(0, PrimitiveType.Word32, null); point.Fields.Add(4, PrimitiveType.Word32, null); }
public void TystCopyClassToTypes() { TypeStore store = new TypeStore(); TypeFactory factory = new TypeFactory(); TypeVariable tv1 = store.CreateTypeVariable(factory); TypeVariable tv2 = store.CreateTypeVariable(factory); Assert.IsNotNull(tv1.Class, "Expected store.EnsureTypeVariable to create an equivalence class"); Assert.IsNotNull(tv2.Class, "Expected store.EnsureTypeVariable to create an equivalence class"); EquivalenceClass e = store.MergeClasses(tv1, tv2); e.DataType = PrimitiveType.Word16; store.CopyClassDataTypesToTypeVariables(); foreach (TypeVariable tv in store.TypeVariables) { Assert.IsNotNull(tv.DataType); } }
public void Setup() { var mem = new MemoryArea(Address.Ptr32(0x00400000), new byte[1024]); var arch = new FakeArchitecture(); program = new Program { Architecture = arch, SegmentMap = new SegmentMap( mem.BaseAddress, new ImageSegment(".text", mem, AccessMode.ReadWriteExecute)), Platform = new DefaultPlatform(null, arch) }; store = program.TypeStore; factory = program.TypeFactory; point = new StructureType(null, 0); point.Fields.Add(0, PrimitiveType.Word32, null); point.Fields.Add(4, PrimitiveType.Word32, null); m = new ProcedureBuilder(); }
protected override void RunTest(Program prog, string outputFilename) { TypeFactory factory = new TypeFactory(); store = new TypeStore(); EquivalenceClassBuilder eqb = new EquivalenceClassBuilder(factory, store); eqb.Build(prog); DataTypeBuilder dtb = new DataTypeBuilder(factory, store, prog.Platform); TraitCollector trco = new TraitCollector(factory, store, dtb, prog); trco.CollectProgramTraits(prog); dtb.BuildEquivalenceClassDataTypes(); store.CopyClassDataTypesToTypeVariables(); TypeVariableReplacer tvr = new TypeVariableReplacer(store); tvr.ReplaceTypeVariables(); PtrPrimitiveReplacer ppr = new PtrPrimitiveReplacer(factory, store, prog); ppr.ReplaceAll(new FakeDecompilerEventListener()); Verify(prog, outputFilename); }
public void Setup() { store = new TypeStore(); factory = new TypeFactory(); globals = new Identifier("globals", PrimitiveType.Word32, null); StructureType point = new StructureType("Point", 0) { Fields = { { 0, PrimitiveType.Word32, null }, { 4, PrimitiveType.Word32, null } } }; TypeVariable tvPoint = store.CreateTypeVariable(factory); EquivalenceClass eq = new EquivalenceClass(tvPoint) { DataType = point }; tvPoint.DataType = eq; ptrPoint = new Pointer(eq, 4); UnionType u = new UnionType("RealInt", null) { Alternatives = { new UnionAlternative("w", PrimitiveType.Word32, 0), new UnionAlternative("r", PrimitiveType.Real32, 1), } }; TypeVariable tvUnion = store.CreateTypeVariable(factory); eq = new EquivalenceClass(tvUnion) { DataType = u }; tvUnion.DataType = eq; ptrUnion = new Pointer(eq, 4); ptrInt = new Pointer(PrimitiveType.Int32, 4); ptrWord = new Pointer(PrimitiveType.Word32, 4); m = new ExpressionEmitter(); }
public Unifier(TypeFactory factory, TraceSwitch trace) { this.factory = factory; this.trace = trace; }
public void Setup() { factory = new TypeFactory(); store = new TypeStore(); trans = new TypeTransformer(factory, store, null); }
public void Setup() { factory = new TypeFactory(); }
public TypeVariable EnsureExpressionTypeVariable(TypeFactory factory, Expression e) { return(EnsureExpressionTypeVariable(factory, e, null)); }
public void Setup() { store = new TypeStore(); factory = new TypeFactory(); }
public TypeVariable EnsureFieldTypeVariable(TypeFactory factory, StructureField field) { throw new NotImplementedException(); }