Esempio n. 1
0
        public void Build(Program program)
        {
            // Special case for the global variables. In essence,
            // a memory map of all the globals.
            var tvGlobals = store.EnsureExpressionTypeVariable(factory, program.Globals, "globals_t");

            tvGlobals.OriginalDataType = program.Globals.DataType;

            EnsureSegmentTypeVariables(program.SegmentMap.Segments.Values);
            int cProc = program.Procedures.Count;
            int i     = 0;

            foreach (Procedure proc in program.Procedures.Values)
            {
                if (listener.IsCanceled())
                {
                    return;
                }
                listener.ShowProgress("Gathering primitive datatypes from instructions.", i++, cProc);
                this.signature = proc.Signature;
                EnsureSignatureTypeVariables(this.signature);

                foreach (Statement stm in proc.Statements)
                {
                    stmCur = stm;
                    stm.Instruction.Accept(this);
                }
            }
        }
        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;
        }
Esempio n. 3
0
 private Expression CreateTv(Expression e)
 {
     store.EnsureExpressionTypeVariable(factory, e);
     e.TypeVariable.DataType         = e.DataType;
     e.TypeVariable.OriginalDataType = e.DataType;
     return(e);
 }
Esempio n. 4
0
        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);
        }
Esempio n. 5
0
        public void Tcr_RewriteWord32()
        {
            Constant c = Constant.Word32(0x0131230);

            store.EnsureExpressionTypeVariable(factory, c);
            c.TypeVariable.DataType         = PrimitiveType.Word32;
            c.TypeVariable.OriginalDataType = PrimitiveType.Word32;
            Expression e = tcr.Rewrite(c, false);

            Assert.AreEqual("0x00131230", e.ToString());
        }
        private TypeVariable CreateTv(Expression e, DataType dt, DataType dtOrig)
        {
            TypeVariable tv = store.EnsureExpressionTypeVariable(factory, e);

            tv.DataType         = dt;
            tv.OriginalDataType = dtOrig;
            e.TypeVariable      = tv;
            if (dt.IsComplex)
            {
                tv.Class          = new EquivalenceClass(tv);
                tv.Class.DataType = dt;
            }
            return(tv);
        }
Esempio n. 7
0
        private Expression EnsureTypeVariable(Expression e, DataType dt)
        {
            var tv = store.EnsureExpressionTypeVariable(factory, 0, e);

            tv.DataType = dt;
            return(e);
        }
Esempio n. 8
0
        public void ExdIndirectCall()
        {
            var p   = Id("p", PrimitiveType.Word32);
            var sig = FunctionType.Action(new[] { Id("r", PrimitiveType.Real32) });

            store.EnsureExpressionTypeVariable(factory, p);
            p.TypeVariable.OriginalDataType = PointerTo(sig);
            p.TypeVariable.DataType         = PointerTo(sig);
            RunTest(
                Test(
                    m.Fn(
                        p,
                        VoidType.Instance,
                        m.Mem(PrimitiveType.Word32, m.Word32(0x0300400))),
                    VoidType.Instance));
        }
        private void Given_Segment(ushort selector, string name)
        {
            var seg = new ImageSegment(name, new MemoryArea(Address.SegPtr(selector, 0), new byte[100]), AccessMode.ReadWriteExecute);

            seg.Identifier = new Identifier(name, PrimitiveType.SegmentSelector, RegisterStorage.None);
            program.SegmentMap.AddSegment(seg);

            var tv = store.EnsureExpressionTypeVariable(factory, seg.Identifier);
            var dt = new StructureType
            {
                IsSegment = true,
            };

            tv.Class.DataType   = dt;
            tv.DataType         = new Pointer(tv.Class, 2);
            tv.OriginalDataType = PrimitiveType.SegmentSelector;
        }
		public void Build(Program program)
        {
            // Special case for the global variables. In essence,
            // a memory map of all the globals.
			var tvGlobals = store.EnsureExpressionTypeVariable(factory, program.Globals, "globals_t");
            tvGlobals.OriginalDataType = program.Globals.DataType;

            EnsureSegmentTypeVariables(program.SegmentMap.Segments.Values);
            foreach (Procedure proc in program.Procedures.Values)
            {
                this.signature = proc.Signature;
                EnsureSignatureTypeVariables(this.signature);
                
                foreach (Statement stm in proc.Statements)
                {
                    stm.Instruction.Accept(this);
                }
            }
		}
Esempio n. 11
0
        public void Build(Program prog)
        {
            // Special case for the global variables. In essence,
            // a memory map of all the globals.
            store.EnsureExpressionTypeVariable(factory, prog.Globals, "globals_t");

            foreach (Procedure proc in prog.Procedures.Values)
            {
                ProcedureSignature signature = proc.Signature;
                if (signature != null && signature.ReturnValue != null)
                {
                    signature.ReturnValue.Accept(this);
                }

                foreach (Statement stm in proc.Statements)
                {
                    stm.Instruction.Accept(this);
                }
            }
        }
Esempio n. 12
0
        private void RunTest(Expression e, string outputFileName)
        {
            var globals = new Identifier("globals", PrimitiveType.Ptr32, RegisterStorage.None);

            store.EnsureExpressionTypeVariable(factory, globals, "globals_t");
            var eq = new EquivalenceClassBuilder(factory, store, new FakeDecompilerEventListener());

            e.Accept(eq);

            e.Accept(exa);

            Verify(outputFileName);
        }
Esempio n. 13
0
 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");
 }
Esempio n. 14
0
        public void Setup()
        {
            program = new Program();
            program.Architecture = new FakeArchitecture();
            program.Platform     = new DefaultPlatform(null, program.Architecture);
            factory = program.TypeFactory;
            store   = program.TypeStore;
            handler = new TestTraitHandler(store);
            eqb     = new EquivalenceClassBuilder(factory, store);
            store.EnsureExpressionTypeVariable(factory, program.Globals);

            atrco = new AddressTraitCollector(factory, store, handler, program);
            m     = new ProcedureBuilder();
        }
Esempio n. 15
0
        private void RunTest(Expression e)
        {
            var globals = new Identifier("globals", PrimitiveType.Pointer32, RegisterStorage.None);

            store.EnsureExpressionTypeVariable(factory, globals, "globals_t");
            var eq = new EquivalenceClassBuilder(factory, store);

            e.Accept(eq);

            e.Accept(exa);

            var outputFileName = string.Format("Typing/{0}.txt", new StackTrace().GetFrame(1).GetMethod().Name);

            Verify(outputFileName);
        }
        public void ExdReferenceToUnknown()
        {
            var p = Id("p", PrimitiveType.Word32);

            store.EnsureExpressionTypeVariable(factory, p);
            p.TypeVariable.OriginalDataType = PointerTo(
                new TypeReference("UNKNOWN_TYPE", new UnknownType()));
            p.TypeVariable.DataType = PointerTo(
                new TypeReference("UNKNOWN_TYPE", new UnknownType()));
            RunTest(
                m.Load(
                    PrimitiveType.Word32,
                    m.IAdd(p, m.Word32(4))),
                PrimitiveType.Word32);
            var ptr = p.TypeVariable.OriginalDataType as Pointer;

            Assert.IsNotNull(ptr, "Should be pointer");
            var tRef = ptr.Pointee as TypeReference;

            Assert.IsNotNull(tRef, "Should be type reference");
            Assert.AreEqual("(struct (4 T_5 t0004))", tRef.Referent.ToString());
        }
Esempio n. 17
0
        public void DtbSegmentedDirectAddress()
        {
            ProcedureBuilder m = new ProcedureBuilder();
            var arch           = new Reko.Arch.X86.X86ArchitectureReal();
            var prog           = new Program
            {
                Architecture = arch,
                Platform     = new DefaultPlatform(null, arch)
            };

            store.EnsureExpressionTypeVariable(factory, prog.Globals);

            Identifier ds = m.Local16("ds");
            Expression e  = m.SegMem(PrimitiveType.Byte, ds, m.Int16(0x0200));

            TraitCollector coll = new TraitCollector(factory, store, dtb, prog);

            e = e.Accept(aen);
            e.Accept(eqb);
            e.Accept(coll);
            dtb.BuildEquivalenceClassDataTypes();
            Verify("Typing/DtbSegmentedDirectAddress.txt");
        }
Esempio n. 18
0
        public void DtbSegmentedDirectAddress()
        {
            ProcedureBuilder m = new ProcedureBuilder();
            var sc             = new ServiceContainer();
            var arch           = new Reko.Arch.X86.X86ArchitectureReal(sc, "x86-real-16", new Dictionary <string, object>());
            var program        = new Program
            {
                Architecture = arch,
                Platform     = new DefaultPlatform(sc, arch)
            };

            store.EnsureExpressionTypeVariable(factory, 0, program.Globals);

            Identifier ds = m.Local16("ds");
            Expression e  = m.SegMem(PrimitiveType.Byte, ds, m.Word16(0x0200));

            TraitCollector coll = new TraitCollector(factory, store, dtb, program);

            e = e.Accept(aen);
            e.Accept(eqb);
            e.Accept(coll);
            dtb.BuildEquivalenceClassDataTypes();
            Verify("Typing/DtbSegmentedDirectAddress.txt");
        }