From 434ec00d170117a3c9f024a5f8c60836c24004f7 Mon Sep 17 00:00:00 2001 From: dragonmacher <48328597+dragonmacher@users.noreply.github.com> Date: Fri, 7 Jan 2022 12:57:52 -0500 Subject: [PATCH] GP-1657 - Fixed display of multiple Enum values Closes #3810 --- .../ghidra/program/database/data/EnumDB.java | 15 +-------------- .../program/model/data/EnumDataType.java | 15 +-------------- .../model/data/EnumValuePartitioner.java | 19 +++++++++++-------- 3 files changed, 13 insertions(+), 36 deletions(-) diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/EnumDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/EnumDB.java index e8913e6632..a4d73d564d 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/EnumDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/EnumDB.java @@ -528,7 +528,7 @@ class EnumDB extends DataTypeDB implements Enum { if (subValue != 0) { String part = getName(subValue); if (part == null) { - part = getStringForNoMatchingValue(subValue); + part = Long.toHexString(subValue).toUpperCase() + 'h'; } if (buf.length() != 0) { buf.append(" | "); @@ -546,19 +546,6 @@ class EnumDB extends DataTypeDB implements Enum { return bitGroups; } - private String getStringForNoMatchingValue(long value) { - String valueName; - String valueStr; - if (value < 0 || value >= 32) { - valueStr = "0x" + Long.toHexString(value); - } - else { - valueStr = Long.toString(value); - } - valueName = "" + valueStr; - return valueName; - } - @Override public boolean isEquivalent(DataType dt) { if (dt == this) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumDataType.java index c28ad61bcc..0b79105c8f 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumDataType.java @@ -333,7 +333,7 @@ public class EnumDataType extends GenericDataType implements Enum { if (subValue != 0) { String part = getName(subValue); if (part == null) { - part = getStringForNoMatchingValue(subValue); + part = Long.toHexString(subValue).toUpperCase() + 'h'; } if (buf.length() != 0) { buf.append(" | "); @@ -351,19 +351,6 @@ public class EnumDataType extends GenericDataType implements Enum { return bitGroups; } - private String getStringForNoMatchingValue(long value) { - String valueName; - String valueStr; - if (value < 0 || value >= 32) { - valueStr = "0x" + Long.toHexString(value); - } - else { - valueStr = Long.toString(value); - } - valueName = "" + valueStr; - return valueName; - } - @Override public boolean isEquivalent(DataType dt) { if (dt == this) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumValuePartitioner.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumValuePartitioner.java index afb9e831a9..d9158bb8ec 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumValuePartitioner.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/EnumValuePartitioner.java @@ -24,12 +24,12 @@ import java.util.*; public class EnumValuePartitioner { private static void merge(List list, BitGroup bitGroup) { - Iterator iterator = list.iterator(); - while (iterator.hasNext()) { - BitGroup next = iterator.next(); + Iterator it = list.iterator(); + while (it.hasNext()) { + BitGroup next = it.next(); if (bitGroup.intersects(next)) { bitGroup.merge(next); - iterator.remove(); + it.remove(); } } list.add(bitGroup); @@ -43,15 +43,18 @@ public class EnumValuePartitioner { */ public static List partition(long[] values, int size) { List list = new LinkedList<>(); - long totalMask = 0; + long usedBits = 0; for (long value : values) { - totalMask |= value; + usedBits |= value; BitGroup bitGroup = new BitGroup(value); merge(list, bitGroup); } + // now create a BitGroup for all bits not accounted for - long enumMask = ~(-1 << (size * 8)); - list.add(new BitGroup(~totalMask & enumMask)); + int bits = size * 8; + long allEnumBits = ~(-1L << bits); + long unusedBits = ~usedBits; + list.add(new BitGroup(unusedBits & allEnumBits)); return list; }