From b6de7df726fc96b09766b615846fce86cb11c695 Mon Sep 17 00:00:00 2001 From: dev747368 <48332326+dev747368@users.noreply.github.com> Date: Wed, 23 Jul 2025 22:03:41 +0000 Subject: [PATCH] GP-5867 dwarf: only iterate struct's defined fields Iterating all fields (defined and undefined) could cause large memory allocation for the result of Structure.getComponents(), plus iterating undefined fields was unnecessary. --- .../bin/format/dwarf/DWARFDataTypeConflictHandler.java | 4 ++-- .../util/bin/format/dwarf/DataTypeGraphComparator.java | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DWARFDataTypeConflictHandler.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DWARFDataTypeConflictHandler.java index 5d2caa5cf4..8df1d9dcc9 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DWARFDataTypeConflictHandler.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DWARFDataTypeConflictHandler.java @@ -115,14 +115,14 @@ public class DWARFDataTypeConflictHandler extends DataTypeConflictHandler { } Map fullComponentsByName = new HashMap<>(); - for (DataTypeComponent dtc : full.getComponents()) { + for (DataTypeComponent dtc : full.getDefinedComponents()) { String name = dtc.getFieldName(); if (name == null) { name = dtc.getDefaultFieldName(); } fullComponentsByName.put(name, dtc); } - for (DataTypeComponent dtc : part.getComponents()) { + for (DataTypeComponent dtc : part.getDefinedComponents()) { String name = dtc.getFieldName(); if (name == null) { name = dtc.getDefaultFieldName(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DataTypeGraphComparator.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DataTypeGraphComparator.java index b060431346..8535a6001f 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DataTypeGraphComparator.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf/DataTypeGraphComparator.java @@ -50,7 +50,7 @@ public class DataTypeGraphComparator { * @param dt2 matching element from the second/right/dest DataType graph * @return false if abort this subtree, true if continue */ - public boolean observe(DataType dt1, DataType dt2); + boolean observe(DataType dt1, DataType dt2); } /** @@ -156,7 +156,7 @@ public class DataTypeGraphComparator { } private void compare(Structure pre, Structure post) { - for (DataTypeComponent dtc : pre.getComponents()) { + for (DataTypeComponent dtc : pre.getDefinedComponents()) { DataType preDTCType = dtc.getDataType(); DataTypeComponent postDTC = post.getComponentAt(dtc.getOffset()); if (postDTC == null) { @@ -173,12 +173,12 @@ public class DataTypeGraphComparator { private void compare(Union pre, Union post) { Map postCompsByName = new HashMap<>(); - for (DataTypeComponent dtc : post.getComponents()) { + for (DataTypeComponent dtc : post.getDefinedComponents()) { if (dtc.getFieldName() != null) { postCompsByName.put(dtc.getFieldName(), dtc); } } - for (DataTypeComponent preDTC : pre.getComponents()) { + for (DataTypeComponent preDTC : pre.getDefinedComponents()) { DataTypeComponent postDTC = postCompsByName.get(preDTC.getFieldName()); if (postDTC != null) { compare(preDTC.getDataType(), postDTC.getDataType());