Esempio n. 1
0
        public override void Process()
        {
            var builder = new VectorBuilder(scanner, program, new DirectedGraphImpl <object>());
            var vector  = builder.Build(Table.TableAddress, AddrFrom, State);

            if (vector.Count == 0)
            {
                Address addrNext = Table.TableAddress + Stride.Size;
                if (program.Image.IsValidAddress(addrNext))
                {
                    // Can't determine the size of the table, but surely it has one entry?
                    program.ImageMap.AddItem(addrNext, new ImageMapItem());
                }
                return;
            }

            Table.Addresses.AddRange(vector);
            for (int i = 0; i < vector.Count; ++i)
            {
                var st = State.Clone();
                if (Table.IsCallTable)
                {
                    scanner.ScanProcedure(vector[i], null, st);
                }
                else
                {
                    //$TODO: BlockFromAddress.
                    scanner.EnqueueJumpTarget(AddrFrom, vector[i], proc, st);
                }
            }
            vectorUses[AddrFrom] = new VectorUse(Table.TableAddress, builder.IndexRegister);
            program.ImageMap.AddItem(Table.TableAddress + builder.TableByteSize, new ImageMapItem());
        }
Esempio n. 2
0
 private Block BlockFromAddress(Address addrSrc, Address addrDst, Procedure proc, ProcessorState state)
 {
     return(scanner.EnqueueJumpTarget(addrSrc, addrDst, proc, state));
 }