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.
Наследование: Reko.Core.Serialization.ProcedureSerializer
Пример #1
0
 private void Given_X86ProcedureSerializer()
 {
     this.ser = new X86ProcedureSerializer(
         (IntelArchitecture) platform.Architecture,
         new TypeLibraryDeserializer(platform, true, new TypeLibrary()),
         "stdapi");
 }
Пример #2
0
 private void Given_X86ProcedureSerializer()
 {
     sser = new X86ProcedureSerializer(
         arch, 
         new TypeLibraryDeserializer(platform, true, new TypeLibrary()),
         "stdapi");
 }
Пример #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;
            }
        }
Пример #4
0
 private void Given_ProcedureSerializer(string cConvention)
 {
     this.ser = new X86ProcedureSerializer(arch, new TypeLibraryLoader(arch, true), cConvention);
 }
Пример #5
0
 private void Given_X86ProcedureSerializer()
 {
     this.ser = new X86ProcedureSerializer(arch, new TypeLibraryLoader(arch, true), "stdapi");
 }
Пример #6
0
 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);
 }
Пример #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;
            }
        }
Пример #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;
            }
        }