Reko.Arch.Arm.Arm32ProcessorArchitecture.CreatePointerScanner C# (CSharp) Method

CreatePointerScanner() public method

public CreatePointerScanner ( Reko.Core.SegmentMap map, Reko.Core.ImageReader rdr, IEnumerable
knownAddresses, PointerScannerFlags flags ) : IEnumerable
map Reko.Core.SegmentMap
rdr Reko.Core.ImageReader
knownAddresses IEnumerable
flags PointerScannerFlags
return IEnumerable
        public override IEnumerable<Address> CreatePointerScanner(SegmentMap map, ImageReader rdr, IEnumerable<Address> knownAddresses, PointerScannerFlags flags)
        {
            var knownLinAddresses = knownAddresses.Select(a => a.ToUInt32()).ToHashSet();
            if (flags != PointerScannerFlags.Calls)
                throw new NotImplementedException(string.Format("Haven't implemented support for scanning for {0} yet.", flags));
            while (rdr.IsValid)
            {
                uint linAddrCall =  rdr.Address.ToUInt32();
                var opcode = rdr.ReadLeUInt32();
                if ((opcode & 0x0F000000) == 0x0B000000)         // BL
                {
                    int offset = ((int)opcode << 8) >> 6;
                    uint target = (uint)(linAddrCall + 8 + offset);
                    if (knownLinAddresses.Contains(target))
                        yield return Address.Ptr32(linAddrCall);
                }
            }
        }