diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/NoisyStructureBuilder.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/NoisyStructureBuilder.java index 56b207963c..e88712769e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/NoisyStructureBuilder.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/NoisyStructureBuilder.java @@ -19,6 +19,8 @@ import java.util.Iterator; import java.util.Map.Entry; import java.util.TreeMap; +import ghidra.program.model.pcode.PartialUnion; + /** * Build a structure from a "noisy" source of field information. * Feed it field records, either via addDataType(), when we @@ -92,6 +94,11 @@ public class NoisyStructureBuilder { dt = manager.getPointer(DataType.DEFAULT, dt.getLength()); } } + else if (dt instanceof PartialUnion) { + // The decompiler can produce the internal data-type PartialUnion, which must + // be replaced with a suitable formal data-type within the structure being built + dt = ((PartialUnion) dt).getStrippedDataType(); + } computeMax(offset, dt.getLength()); Entry firstEntry = checkForOverlap(offset, dt.getLength()); if (firstEntry != null) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PartialUnion.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PartialUnion.java index 4c8cd70dd3..b552f487ef 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PartialUnion.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/PartialUnion.java @@ -119,4 +119,11 @@ public class PartialUnion extends AbstractDataType { return 0; } + /** + * Get a data-type that can be used as a formal replacement for this (internal) data-type + * @return a replacement data-type + */ + public DataType getStrippedDataType() { + return Undefined.getUndefinedDataType(size); + } }