Пример #1
0
 public void Setup()
 {
     this.sc = new ServiceContainer();
     this.x86 = new X86ArchitectureFlat32();
     this.ppc = new PowerPcArchitecture32();
     this.m = new ProcedureBuilder();
     this.printfChr = new ProcedureCharacteristics()
     {
         VarargsParserClass =
             "Reko.Libraries.Libc.PrintfFormatParser,Reko.Libraries.Libc"
     };
     this.x86PrintfSig = new FunctionType(
         null,
         StackId(null,   4, CStringType()),
         StackId("...",  8, new UnknownType()));
     this.x86SprintfSig = new FunctionType(
         null,
         StackId(null,   4, CStringType()),
         StackId(null,   8, CStringType()),
         StackId("...", 12, new UnknownType()));
     this.ppcPrintfSig = new FunctionType(
         null,
         RegId(null,  ppc, "r3", CStringType()),
         RegId("...", ppc, "r4", new UnknownType()));
     this.addrInstr = Address.Ptr32(0x123400);
 }
Пример #2
0
 public ProcedureCharacteristics(ProcedureCharacteristics old)
 {
     IsAlloca           = old.IsAlloca;
     Terminates         = old.Terminates;
     Allocator          = old.Allocator;
     ArraySize          = old.ArraySize;
     VarargsParserClass = old.VarargsParserClass;
 }
Пример #3
0
 public ProcedureCharacteristics(ProcedureCharacteristics old)
 {
     IsAlloca = old.IsAlloca;
     Terminates = old.Terminates;
     Allocator = old.Allocator;
     ArraySize = old.ArraySize;
     VarargsParserClass = old.VarargsParserClass;
 }
Пример #4
0
 private void RewriteHalt()
 {
     var c = new ProcedureCharacteristics
     {
         Terminates = true,
     };
     m.SideEffect(host.PseudoProcedure("__halt", c, VoidType.Instance));
 }
Пример #5
0
 private void RewriteIll()
 {
     var c = new ProcedureCharacteristics
     {
         Terminates = true,
     };
     emitter.SideEffect(host.PseudoProcedure("__ill", c, VoidType.Instance));
 }
Пример #6
0
 public ProcedureCharacteristics(ProcedureCharacteristics old)
 {
     IsAlloca                = old.IsAlloca;
     Terminates              = old.Terminates;
     Allocator               = old.Allocator;
     ArraySize               = old.ArraySize;
     VarargsParserClass      = old.VarargsParserClass;
     ReturnAddressAdjustment = old.ReturnAddressAdjustment;
 }
Пример #7
0
 public bool TryScan(Address addrInstr, FunctionType sig, ProcedureCharacteristics chr)
 {
     if (
         sig == null || !sig.IsVarargs() ||
         chr == null || !VarargsParserSet(chr)
     )
     {
         this.sig = null;    //$out parameter
         return false;
     }
     var format = ReadVarargsFormat(sig);
     var argTypes = ParseVarargsFormat(addrInstr, chr, format);
     this.sig = ReplaceVarargs(sig, argTypes);
     return true;
 }
Пример #8
0
 public SimulatedProc EnsureProc(
     Module module, 
     string procName,
     Action<IProcessorEmulator> emulator,
     ProcedureCharacteristics chars = null)
 {
     SimulatedProc proc;
     if (!module.Procedures.TryGetValue(procName, out proc))
     {
         var extProc = platform.LookupProcedureByName(module.Name, procName);
         proc = new SimulatedProc(procName, emulator);
         proc.Signature = extProc.Signature;
         if (chars != null)
             proc.Characteristics = chars;
         proc.uFakedAddress = ++this.uPseudoFn;
         InterceptedCalls[proc.uFakedAddress] = proc;
         module.Procedures.Add(procName, proc);
     }
     return proc;
 }
Пример #9
0
 private IEnumerable<DataType> ParseVarargsFormat(
     Address addrInstr,
     ProcedureCharacteristics chr,
     string format)
 {
     var type = Type.GetType(chr.VarargsParserClass);
     if (type == null)
         throw new TypeLoadException(
             string.Format(
                 "Unable to load {0} varargs parser.",
                 chr.VarargsParserClass));
     var varargsParser = (IVarargsFormatParser)Activator.CreateInstance(
         type,
         program,
         addrInstr,
         format,
         services);
     varargsParser.Parse();
     return varargsParser.ArgumentTypes;
 }
Пример #10
0
 private bool VarargsParserSet(ProcedureCharacteristics chr)
 {
     return !string.IsNullOrEmpty(chr.VarargsParserClass);
 }
Пример #11
0
 public ExternalProcedure(string name, ProcedureSignature signature, ProcedureCharacteristics chars)
     : base(name)
 {
     this.Signature = signature;
     this.Characteristics = chars;
 }
Пример #12
0
 public Expression PseudoProcedure(string name, ProcedureCharacteristics c, DataType returnType, params Expression[] args)
 {
     var ppp = program.EnsurePseudoProcedure(name, returnType, args.Length);
     ppp.Characteristics = c;
     return new Application(
         new ProcedureConstant(PrimitiveType.Pointer32, ppp),
         returnType,
         args);
 }
Пример #13
0
            public Expression PseudoProcedure(string name, ProcedureCharacteristics c, DataType returnType, params Expression[] args)
            {
                var ppp = EnsurePseudoProcedure(name, returnType, args.Length);
                ppp.Characteristics = c;
                if (args.Length != ppp.Arity)
                    throw new ArgumentOutOfRangeException(
                        string.Format("Pseudoprocedure {0} expected {1} arguments, but was passed {2}.",
                        ppp.Name,
                        ppp.Arity,
                        args.Length));

                return new Application(
                    new ProcedureConstant(arch.PointerType, ppp),
                    returnType,
                    args);
            }
Пример #14
0
 public Expression PseudoProcedure(string name, ProcedureCharacteristics c, DataType returnType, params Expression[] args)
 {
     throw new NotImplementedException();
 }
Пример #15
0
 public void Vafs_NoVarargs()
 {
     Given_VaScanner(x86);
     var emptyChr = new ProcedureCharacteristics();
     var emptySig = new FunctionType();
     Assert.IsFalse(vafs.TryScan(addrInstr, null, null));
     Assert.IsFalse(vafs.TryScan(addrInstr, emptySig, null));
     Assert.IsFalse(vafs.TryScan(addrInstr, null, emptyChr));
     Assert.IsFalse(vafs.TryScan(addrInstr, emptySig, emptyChr));
     Assert.IsFalse(vafs.TryScan(addrInstr, x86PrintfSig, null));
     Assert.IsFalse(vafs.TryScan(addrInstr, x86PrintfSig, emptyChr));
     Assert.IsFalse(vafs.TryScan(addrInstr, null, printfChr));
     Assert.IsFalse(vafs.TryScan(addrInstr, emptySig, printfChr));
 }