GP-6568 skip correlating data types that are already in the database

This commit is contained in:
dev747368
2026-04-20 19:49:41 +00:00
parent 36a5227126
commit f58e277f7b
@@ -24,6 +24,7 @@ import java.util.regex.Pattern;
import ghidra.app.util.bin.format.dwarf.DWARFDataTypeImporter.DWARFDataType; import ghidra.app.util.bin.format.dwarf.DWARFDataTypeImporter.DWARFDataType;
import ghidra.app.util.bin.format.dwarf.expression.DWARFExpressionException; import ghidra.app.util.bin.format.dwarf.expression.DWARFExpressionException;
import ghidra.program.database.DbObject;
import ghidra.program.model.data.*; import ghidra.program.model.data.*;
import ghidra.program.model.lang.CompilerSpec; import ghidra.program.model.lang.CompilerSpec;
import ghidra.program.model.listing.Program; import ghidra.program.model.listing.Program;
@@ -130,25 +131,28 @@ public class DWARFDataTypeManager {
DataType post = DataType post =
dataTypeManager.resolve(pre.dataType, DWARFDataTypeConflictHandler.INSTANCE); dataTypeManager.resolve(pre.dataType, DWARFDataTypeConflictHandler.INSTANCE);
// While walking the pre and post DataType graph in lockstep, use the mapping of // If the data type was already in the database, we don't need to correlate pre&post
// pre_impl->offset to cache offset->post_datatype for later re-use. if (!(pre.dataType instanceof DbObject)) {
DataTypeGraphComparator.compare(pre.dataType, post, (dt1, dt2) -> { // While walking the pre and post DataType graph in lockstep, use the mapping of
// pre_impl->offset to cache offset->post_datatype for later re-use.
DataTypeGraphComparator.compare(pre.dataType, post, (dt1, dt2) -> {
DWARFDataType currentDDT = ddtImporter.getDDTByInstance(dt1); DWARFDataType currentDDT = ddtImporter.getDDTByInstance(dt1);
// if we find the pre_datatype metadata, add permanent mapping // if we find the pre_datatype metadata, add permanent mapping
// of offset->db_datatype // of offset->db_datatype
if (currentDDT != null) { if (currentDDT != null) {
if (currentDDT.dataType == dt1) { if (currentDDT.dataType == dt1) {
for (Long offset : currentDDT.offsets) { for (Long offset : currentDDT.offsets) {
cacheOffsetToDataTypeMapping(offset, dt2); cacheOffsetToDataTypeMapping(offset, dt2);
}
} }
saveDWARFSourceInfo(dt2, currentDDT.dsi);
} }
saveDWARFSourceInfo(dt2, currentDDT.dsi);
}
return true; return true;
}); });
}
cacheOffsetToDataTypeMapping(diea.getOffset(), post); cacheOffsetToDataTypeMapping(diea.getOffset(), post);
saveDWARFSourceInfo(post, pre.dsi); saveDWARFSourceInfo(post, pre.dsi);