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
コード例 #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
ファイル: WineSpecFileLoader.cs プロジェクト: nemerle/reko
        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);
 }
コード例 #7
0
 private void Given_ProcedureSerializer(string cConvention)
 {
     this.deserializer = mockFactory.CreateDeserializer();
     this.ser = new X86ProcedureSerializer(arch, deserializer, cConvention);
 }
コード例 #8
0
ファイル: WineSpecFileLoader.cs プロジェクト: uxmal/reko
        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
ファイル: WineSpecFileLoader.cs プロジェクト: relaxar/reko
        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;
            }
        }