Serializes and deserializes procedure signatures.
This code is aware of the different calling convetions on x86 processors. Should your ABI be different, you need to make the Platform that loaded the binary return an object that derives from this class.
Inheritance: Reko.Core.Serialization.ProcedureSerializer
Example #1
0
 private void Given_X86ProcedureSerializer()
 {
     this.ser = new X86ProcedureSerializer(
         (IntelArchitecture) platform.Architecture,
         new TypeLibraryDeserializer(platform, true, new TypeLibrary()),
         "stdapi");
 }
Example #2
0
 private void Given_X86ProcedureSerializer()
 {
     sser = new X86ProcedureSerializer(
         arch, 
         new TypeLibraryDeserializer(platform, true, new TypeLibrary()),
         "stdapi");
 }
Example #3
0
        public void ParseLine()
        {
            var tok = Peek();
            if (tok.Type == TokenType.NUMBER)
            {
                tok = Get();
                int ordinal = Convert.ToInt32(tok.Value);

                Expect(TokenType.ID);

                if (PeekAndDiscard(TokenType.MINUS))
                {
                    Expect(TokenType.ID);
                }

                tok = Get();
                string fnName = tok.Value;
                var ssig = new SerializedSignature
                {
                    Convention = "pascal"
                };
                var args = new List<Argument_v1>();
                if (PeekAndDiscard(TokenType.LPAREN))
                {
                    while (LoadParameter(ssig, args))
                        ;
                    Expect(TokenType.RPAREN);
                }
                ssig.Arguments = args.ToArray();
                var deser = new X86ProcedureSerializer((IntelArchitecture) platform.Architecture, tlLoader, "pascal");
                var sig = deser.Deserialize(ssig, new Frame(PrimitiveType.Word16));
                var svc = new SystemService
                {
                    Name = fnName,
                    Signature = sig
                };
                tlLoader.LoadService(ordinal, svc);
            }
            for (;;)
            {
                // Discared entire line.
                var type = Get().Type;
                if (type == TokenType.EOF || type == TokenType.NL)
                    return;
            }
        }
 private void Given_ProcedureSerializer(string cConvention)
 {
     this.ser = new X86ProcedureSerializer(arch, new TypeLibraryLoader(arch, true), cConvention);
 }
 private void Given_X86ProcedureSerializer()
 {
     this.ser = new X86ProcedureSerializer(arch, new TypeLibraryLoader(arch, true), "stdapi");
 }
 private void Given_ProcedureSerializer(string cConvention)
 {
     this.deserializer = new FakeTypeDeserializer(4);
     this.ser = new X86ProcedureSerializer(arch, deserializer, cConvention);
 }
 private void Given_ProcedureSerializer(string cConvention)
 {
     this.deserializer = mockFactory.CreateDeserializer();
     this.ser = new X86ProcedureSerializer(arch, deserializer, cConvention);
 }
Example #8
0
        public Tuple<int?, SystemService> ParseLine()
        {
            try
            {
                int? ordinal = ParseOrdinal();

                string callconv = ParseCallingConvention();

                var options = ParseOptions();

                var tok = Get();
                string fnName = tok.Value;
                var ssig = new SerializedSignature
                {
                    Convention = callconv,
                };
                ssig.Arguments = ParseParameters(ssig);
                SkipToEndOfLine();

                var deser = new X86ProcedureSerializer((IntelArchitecture)platform.Architecture, tlLoader, callconv);
                var sig = deser.Deserialize(ssig, new Frame(platform.FramePointerType));
                var svc = new SystemService
                {
                    ModuleName = moduleName.ToUpper(),
                    Name = fnName,
                    Signature = sig
                };
                return Tuple.Create(ordinal, svc);
            }
            catch
            {
                Services.RequireService<DecompilerEventListener>().Warn(
                    new NullCodeLocation(moduleName),
                    "Line {0} in the Wine spec file could not be read; skipping.",
                    lexer.lineNumber);
                SkipToEndOfLine();
                return null;
            }
        }
Example #9
0
        public void ParseLine()
        {
            int? ordinal = ParseOrdinal();

            string callconv = ParseCallingConvention();

            var options = ParseOptions();

            var tok = Get();
            string fnName = tok.Value;
            var ssig = new SerializedSignature
            {
                Convention = callconv,
            };
            ssig.Arguments = ParseParameters(ssig);
            
            var deser = new X86ProcedureSerializer((IntelArchitecture)platform.Architecture, tlLoader, callconv);
            var sig = deser.Deserialize(ssig, new Frame(platform.FramePointerType));
            var svc = new SystemService
            {
                ModuleName = moduleName.ToUpper(),
                Name = fnName,
                Signature = sig
            };
            if (ordinal.HasValue)
            {
                tlLoader.LoadService(ordinal.Value, svc);
            }
            else
            {
                tlLoader.LoadService(fnName, svc);
            }

            for (;;)
            {
                // Discared entire line.
                var type = Get().Type;
                if (type == TokenType.EOF || type == TokenType.NL)
                    return;
            }
        }