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); }
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); }