Beispiel #1
0
        public override Dictionary <string, IDictionary <Address, IAddressable> > GetObjectPlacements(string fileExtension, DecompilerEventListener listener)
        {
            this.defaultFile     = Path.ChangeExtension(program.Name, fileExtension);
            this.defaultDataFile = Path.ChangeExtension(program.Name, "globals" + fileExtension);

            // Find the segment for each procedure
            var result = new Dictionary <string, IDictionary <Address, IAddressable> >();

            foreach (var proc in program.Procedures.Values)
            {
                PlaceObject(proc, defaultFile, result);
            }

            // Place all global objects.
            var wl = WorkList.Create(
                MakeGlobalWorkItems()
                .Concat(MakeSegmentWorkitems()));
            var objectTracer = new GlobalObjectTracer(program, wl, listener);

            while (wl.TryGetWorkItem(out var item))
            {
                var(field, addr) = item;
                var globalVar = new GlobalVariable(addr, field.DataType, program.NamingPolicy.GlobalName(field));
                PlaceObject(globalVar, defaultDataFile, result);
                objectTracer.TraceObject(field.DataType, addr);
            }
            return(result);
        }
Beispiel #2
0
        public override Dictionary <string, IDictionary <Address, IAddressable> > GetObjectPlacements(
            string fileExtension,
            DecompilerEventListener listener)
        {
            Debug.Assert(fileExtension.Length > 0 && fileExtension[0] == '.');

            // Default file if we cannot find segment.
            this.defaultFile     = Path.ChangeExtension(program.Name, fileExtension);
            this.defaultDataFile = Path.ChangeExtension(program.Name, "globals" + fileExtension);

            // Find the segment for each procedure
            var result = new Dictionary <string, IDictionary <Address, IAddressable> >();

            foreach (var proc in program.Procedures.Values)
            {
                var filename = DetermineFilename(proc, fileExtension);
                PlaceObject(proc, filename, result);
            }

            // Place all global objects.
            var wl = new WorkList <(StructureField, Address)>(
                MakeGlobalWorkItems()
                .Concat(MakeSegmentWorkitems()));
            var objectTracer = new GlobalObjectTracer(program, wl, listener);

            while (wl.GetWorkItem(out var item))
            {
                var(field, addr) = item;
                var filename  = DetermineFilename(addr, fileExtension);
                var globalVar = new GlobalVariable(addr, field.DataType, program.NamingPolicy.GlobalName(field));
                PlaceObject(globalVar, filename, result);
                objectTracer.TraceObject(field.DataType, addr);
            }
            return(result);
        }