From 0086c4c77a628b74ebc1e501c28cbfe8fdb3684d Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Wed, 21 Oct 2020 14:44:58 -0400 Subject: [PATCH] GP-296 avoid separately resolving nested composite definitions to avoid duplicates. Allow them to be resolved as needed (e.g., function definitions). --- .../pdb/pdbapplicator/AbstractComplexTypeApplier.java | 4 ++++ .../util/pdb/pdbapplicator/CompositeTypeApplier.java | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/AbstractComplexTypeApplier.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/AbstractComplexTypeApplier.java index 5273bc3643..82660bf418 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/AbstractComplexTypeApplier.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/AbstractComplexTypeApplier.java @@ -59,6 +59,10 @@ public abstract class AbstractComplexTypeApplier extends MsTypeApplier { return ((AbstractComplexMsType) msType).getMsProperty().isForwardReference(); } + boolean isNested() { + return ((AbstractComplexMsType) msType).getMsProperty().isNestedClass(); + } + boolean isFinal() { return ((AbstractComplexMsType) msType).getMsProperty().isSealed(); } diff --git a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CompositeTypeApplier.java b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CompositeTypeApplier.java index fa25c1540a..d6ce649244 100644 --- a/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CompositeTypeApplier.java +++ b/Ghidra/Features/PDB/src/main/java/ghidra/app/util/pdb/pdbapplicator/CompositeTypeApplier.java @@ -135,7 +135,15 @@ public class CompositeTypeApplier extends AbstractComplexTypeApplier { @Override void resolve() { - if (!isForwardReference()) { + + // NOTE: Until we know better we do not want to explicitly + // apply nested composite datatypes and allow them to be + // created as-needed (e.g., function definition). This is + // done to minimize duplication of anonymous/unnamed nested + // composites since the parent composite reconsruction performed + // by DefaultCompisiteMember will generate such nested composites. + + if (!isForwardReference() && !isNested()) { super.resolve(); } }