From b5160b253c131dccd31ffa0581c6eadb9d637f9b Mon Sep 17 00:00:00 2001 From: ghidra1 Date: Mon, 10 May 2021 18:48:32 -0400 Subject: [PATCH] GP-932 renamed and corrected improper implementation and use of the Datatype.isDynamicallySized method --- .../merge/datatypes/DataTypeMergeManager.java | 2 +- .../core/datamgr/util/DataTypeUtils.java | 2 +- .../core/stackeditor/StackPieceDataType.java | 5 -- .../gcc/datatype/AbstractLeb128DataType.java | 5 -- .../datatype/DwarfEncodingModeDataType.java | 5 -- .../datatype/PcRelative31AddressDataType.java | 5 -- .../gcc/structures/ehFrame/FdeTable.java | 13 +++- .../dwarf4/next/DWARFDataTypeImporter.java | 2 +- .../MSRichProductBuildNumberDataType.java | 5 -- .../pe/rich/MSRichProductIDDataType.java | 5 -- .../pe/rich/MSRichProductInfoDataType.java | 2 +- .../format/pe/rich/PERichTableDataType.java | 6 +- .../pe/rich/RichObjectCountDataType.java | 5 -- .../pe/rich/RichTableRecordDataType.java | 2 +- .../util/datatype/microsoft/GuidDataType.java | 13 ++-- .../microsoft/HTMLResourceDataType.java | 5 -- .../ghidra/app/util/opinion/ElfDataType.java | 8 +-- .../ghidra/app/util/opinion/PeDataType.java | 9 --- .../ghidra/program/database/data/ArrayDB.java | 4 +- .../program/database/data/CompositeDB.java | 32 +++++---- .../database/data/DataTypeManagerDB.java | 2 +- .../ghidra/program/database/data/EnumDB.java | 2 +- .../database/data/FunctionDefinitionDB.java | 2 +- .../program/database/data/PointerDB.java | 14 ++-- .../program/database/data/StructureDB.java | 21 ++++-- .../program/database/data/TypedefDB.java | 4 +- .../ghidra/program/database/data/UnionDB.java | 10 ++- .../program/model/data/AIFFDataType.java | 8 --- .../ghidra/program/model/data/AUDataType.java | 8 --- .../model/data/AbstractComplexDataType.java | 5 -- .../program/model/data/AbstractDataType.java | 2 +- .../model/data/AbstractFloatDataType.java | 10 +-- .../data/AbstractImageBaseOffsetDataType.java | 5 -- .../model/data/AbstractIntegerDataType.java | 8 --- .../model/data/AbstractStringDataType.java | 5 -- .../program/model/data/AlignmentDataType.java | 8 --- .../program/model/data/ArrayDataType.java | 4 +- .../program/model/data/BadDataType.java | 16 +++-- .../program/model/data/BooleanDataType.java | 10 +-- .../program/model/data/CharDataType.java | 2 +- .../model/data/CompositeDataTypeImpl.java | 26 ++++--- .../ghidra/program/model/data/DataType.java | 7 +- .../program/model/data/DefaultDataType.java | 8 --- .../program/model/data/DoubleDataType.java | 3 +- .../program/model/data/DynamicDataType.java | 8 --- .../program/model/data/EnumDataType.java | 5 -- .../program/model/data/FactoryDataType.java | 11 ++- .../model/data/FactoryStructureDataType.java | 3 +- .../program/model/data/FileTimeDataType.java | 8 --- .../program/model/data/FloatDataType.java | 3 +- .../data/FunctionDefinitionDataType.java | 20 ++---- .../program/model/data/GifDataType.java | 8 --- .../program/model/data/IntegerDataType.java | 4 +- .../program/model/data/JPEGDataType.java | 8 --- .../program/model/data/LongDataType.java | 4 +- .../model/data/LongDoubleDataType.java | 3 +- .../program/model/data/LongLongDataType.java | 4 +- .../data/MacintoshTimeStampDataType.java | 23 +++---- .../model/data/MissingBuiltInDataType.java | 8 --- .../model/data/ParameterDefinitionImpl.java | 4 +- .../program/model/data/PngDataType.java | 8 --- .../program/model/data/PointerDataType.java | 8 +-- .../data/SegmentedCodePointerDataType.java | 11 +-- .../model/data/ShiftedAddressDataType.java | 3 +- .../program/model/data/ShortDataType.java | 4 +- .../program/model/data/StructureDataType.java | 31 ++++----- .../program/model/data/TypedefDataType.java | 4 +- .../ghidra/program/model/data/Undefined.java | 14 ++-- .../program/model/data/UnionDataType.java | 10 ++- .../model/data/UnsignedIntegerDataType.java | 4 +- .../model/data/UnsignedLongDataType.java | 4 +- .../model/data/UnsignedLongLongDataType.java | 4 +- .../model/data/UnsignedShortDataType.java | 4 +- .../program/model/data/VoidDataType.java | 14 ++-- .../program/model/data/WAVEDataType.java | 5 -- .../model/data/WideChar16DataType.java | 7 -- .../model/data/WideChar32DataType.java | 7 -- .../program/model/data/WideCharDataType.java | 4 +- .../model/listing/VariableUtilities.java | 4 +- .../model/data/TestDoubleDataType.java | 2 +- .../model/listing/VariableUtilitiesTest.java | 67 +++++++++++++++++++ .../Processors/Toy/data/languages/toy.cspec | 21 ++++++ .../Processors/Toy/data/languages/toy64.cspec | 21 ++++++ 83 files changed, 320 insertions(+), 390 deletions(-) create mode 100644 Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/model/listing/VariableUtilitiesTest.java diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/DataTypeMergeManager.java b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/DataTypeMergeManager.java index 8eedd74e53..f392cdbfdf 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/DataTypeMergeManager.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/merge/datatypes/DataTypeMergeManager.java @@ -947,7 +947,7 @@ public class DataTypeMergeManager implements MergeResolver { } if (resolvedDt != null) { return PointerDataType.getPointer(resolvedDt, - pointerDt.isDynamicallySized() ? -1 : pointerDt.getLength()); + pointerDt.hasLanguageDependantLength() ? -1 : pointerDt.getLength()); } } return null; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java index 373e556d95..a611966ae3 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/datamgr/util/DataTypeUtils.java @@ -456,7 +456,7 @@ public class DataTypeUtils { if (dataType instanceof Pointer) { Pointer pdt = (Pointer) dataType; return new PointerDataType(copyToNamedBaseDataType(pdt.getDataType(), dtm), - pdt.isDynamicallySized() ? -1 : pdt.getLength(), dtm); + pdt.hasLanguageDependantLength() ? -1 : pdt.getLength(), dtm); } else if (dataType instanceof Array) { Array adt = (Array) dataType; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/stackeditor/StackPieceDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/stackeditor/StackPieceDataType.java index 7a9475fffc..0580f540a1 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/stackeditor/StackPieceDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/stackeditor/StackPieceDataType.java @@ -40,11 +40,6 @@ public class StackPieceDataType extends DataTypeImpl { return var.getDataType().getName() + ":" + pieceLen + " (piece)"; } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/AbstractLeb128DataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/AbstractLeb128DataType.java index 374ecc5c7e..4b698602bf 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/AbstractLeb128DataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/AbstractLeb128DataType.java @@ -165,9 +165,4 @@ public abstract class AbstractLeb128DataType extends BuiltIn implements Dynamic return false; } - @Override - public boolean isDynamicallySized() { - return true; - } - } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/DwarfEncodingModeDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/DwarfEncodingModeDataType.java index 68703e15b3..cf376b40a3 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/DwarfEncodingModeDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/DwarfEncodingModeDataType.java @@ -44,11 +44,6 @@ public class DwarfEncodingModeDataType extends BuiltIn { super(CategoryPath.ROOT, "dwfenc", dtm); } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/PcRelative31AddressDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/PcRelative31AddressDataType.java index f0e4dc17d5..81045a5b77 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/PcRelative31AddressDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/datatype/PcRelative31AddressDataType.java @@ -67,11 +67,6 @@ public class PcRelative31AddressDataType extends BuiltIn { return name; } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public int getLength() { return 4; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/structures/ehFrame/FdeTable.java b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/structures/ehFrame/FdeTable.java index 38e41dc5c0..f0a63bfbdc 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/structures/ehFrame/FdeTable.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/plugin/exceptionhandlers/gcc/structures/ehFrame/FdeTable.java @@ -84,8 +84,17 @@ public class FdeTable { DataType encodedDt = decoder.getDataType(prog); - if (encodedDt.isDynamicallySized()) { - throw new ExceptionHandlerFrameException("Cannot build FDE structure with dynamically-encoded values"); + if (encodedDt.getLength() <= 0) { + throw new ExceptionHandlerFrameException( + "Cannot build FDE structure with Dynamic or Void value type: " + + encodedDt.getClass().getName()); + } + + if (encodedDt.hasLanguageDependantLength()) { + // Should avoid using value types whose size fluctuates with Data Organization + throw new ExceptionHandlerFrameException( + "Cannot build FDE structure with dynamically-sized value type: " + + encodedDt.getClass().getName()); } fdeTableEntry.deleteAll(); diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/next/DWARFDataTypeImporter.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/next/DWARFDataTypeImporter.java index a35d1a9f7f..baf91e7d90 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/next/DWARFDataTypeImporter.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/dwarf4/next/DWARFDataTypeImporter.java @@ -1418,7 +1418,7 @@ public class DWARFDataTypeImporter { for (int i = ptrChainTypes.size() - 1; i >= 0; i--) { Pointer origPtr = ptrChainTypes.get(i); result = new PointerDataType(result, - origPtr.isDynamicallySized() ? -1 : origPtr.getLength(), dataTypeManager); + origPtr.hasLanguageDependantLength() ? -1 : origPtr.getLength(), dataTypeManager); } return result; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductBuildNumberDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductBuildNumberDataType.java index 93440803bd..1cdcc940b2 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductBuildNumberDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductBuildNumberDataType.java @@ -34,11 +34,6 @@ class MSRichProductBuildNumberDataType extends DataTypeImpl { this.compid = compid; } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductIDDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductIDDataType.java index e6b9f14c50..fd0e981df0 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductIDDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductIDDataType.java @@ -34,11 +34,6 @@ class MSRichProductIDDataType extends DataTypeImpl { this.compid = compid; } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductInfoDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductInfoDataType.java index ee1873f1af..62dcbfe82e 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductInfoDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/MSRichProductInfoDataType.java @@ -34,7 +34,7 @@ class MSRichProductInfoDataType extends StructureDataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return false; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/PERichTableDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/PERichTableDataType.java index dfd550bc76..b62d9590cf 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/PERichTableDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/PERichTableDataType.java @@ -128,7 +128,7 @@ public class PERichTableDataType extends DynamicDataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return false; } @@ -193,7 +193,7 @@ public class PERichTableDataType extends DynamicDataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return false; } @@ -259,7 +259,7 @@ public class PERichTableDataType extends DynamicDataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return false; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/RichObjectCountDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/RichObjectCountDataType.java index 65b4719ecf..47b28996ea 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/RichObjectCountDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/RichObjectCountDataType.java @@ -34,11 +34,6 @@ class RichObjectCountDataType extends DataTypeImpl { this.count = count; } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/RichTableRecordDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/RichTableRecordDataType.java index 7fb55316a1..c5457f5efa 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/RichTableRecordDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/bin/format/pe/rich/RichTableRecordDataType.java @@ -35,7 +35,7 @@ class RichTableRecordDataType extends StructureDataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return false; } diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/GuidDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/GuidDataType.java index 45dc99d0dd..4d42d00c39 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/GuidDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/GuidDataType.java @@ -21,9 +21,9 @@ package ghidra.app.util.datatype.microsoft; import ghidra.docking.settings.Settings; import ghidra.docking.settings.SettingsDefinition; import ghidra.program.model.data.*; -import ghidra.program.model.lang.ProcessorContext; import ghidra.program.model.mem.MemBuffer; -import ghidra.util.*; +import ghidra.util.Conv; +import ghidra.util.DataConverter; import ghidra.util.classfinder.ClassTranslator; /** @@ -76,11 +76,6 @@ public class GuidDataType extends BuiltIn { return SIZE; } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public String getDescription() { return NAME; @@ -130,8 +125,9 @@ public class GuidDataType extends BuiltIn { retVal += Conv.toHexString((short) (data[1] >> 16)) + delim; for (int i = 0; i < 4; i++) { retVal += Conv.toHexString((byte) (data[2] >> i * 8)); - if (i == 1) + if (i == 1) { retVal += delim; + } } for (int i = 0; i < 4; i++) { retVal += Conv.toHexString((byte) (data[3] >> i * 8)); @@ -166,6 +162,7 @@ public class GuidDataType extends BuiltIn { return NAME; } + @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { return this; diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/HTMLResourceDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/HTMLResourceDataType.java index 19d17f472d..af7e113fe9 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/HTMLResourceDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/datatype/microsoft/HTMLResourceDataType.java @@ -31,11 +31,6 @@ public class HTMLResourceDataType extends BuiltIn implements Dynamic { super(null, "HTML-Resource", dtm); } - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfDataType.java index 0f52a3ee00..3e741ad02b 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/ElfDataType.java @@ -36,6 +36,7 @@ public class ElfDataType extends FactoryStructureDataType { super("ELF", dtm); } + @Override public String getMnemonic(Settings settings) { return "ELF"; } @@ -44,13 +45,6 @@ public class ElfDataType extends FactoryStructureDataType { public String getDescription() { return "ELF Data Type"; } - - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - public boolean isDynamicallySized() { - return true; - } @Override protected void populateDynamicStructure(MemBuffer buf, Structure struct) { diff --git a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/PeDataType.java b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/PeDataType.java index 9f98e9f229..bf0c68ca8a 100644 --- a/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/PeDataType.java +++ b/Ghidra/Features/Base/src/main/java/ghidra/app/util/opinion/PeDataType.java @@ -31,7 +31,6 @@ import ghidra.util.exception.DuplicateNameException; * A datatype for creating portable executable data structures. */ public class PeDataType extends FactoryStructureDataType { - private final static long serialVersionUID = 1; /** * Constructs a new PE datatype. @@ -53,14 +52,6 @@ public class PeDataType extends FactoryStructureDataType { public String getDescription() { return "Windows Portable Executable Data Type"; } - - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return true; - } @Override protected void populateDynamicStructure(MemBuffer buf, Structure struct) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ArrayDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ArrayDB.java index 214ed21de9..9795c5189e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ArrayDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/ArrayDB.java @@ -111,8 +111,8 @@ class ArrayDB extends DataTypeDB implements Array { } @Override - public boolean isDynamicallySized() { - return getDataType().isDynamicallySized(); + public boolean hasLanguageDependantLength() { + return getDataType().hasLanguageDependantLength(); } @Override diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/CompositeDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/CompositeDB.java index 1c66f7ded6..0a437d1dc5 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/CompositeDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/CompositeDB.java @@ -189,10 +189,8 @@ abstract class CompositeDB extends DataTypeDB implements CompositeInternal { } @Override - public boolean isDynamicallySized() { - return isPackingEnabled(); - } - + public abstract boolean hasLanguageDependantLength(); + @Override public Object getValue(MemBuffer buf, Settings settings, int length) { return null; @@ -285,27 +283,33 @@ abstract class CompositeDB extends DataTypeDB implements CompositeInternal { /** * This method throws an exception if the indicated data type is not a valid - * data type for a component of this composite data type. + * data type for a component of this composite data type. If the DEFAULT + * datatype is specified when unsupported an Undefined1 will be returned + * in its place (e.g., packing enabled, Union). * * @param dataType the data type to be checked. + * @return datatype to be used for insert/add * @throws IllegalArgumentException if the data type is invalid. */ - protected void validateDataType(DataType dataType) { - if (isPackingEnabled() && dataType == DataType.DEFAULT) { - throw new IllegalArgumentException( - "The DEFAULT data type is not allowed in an aligned composite data type."); + protected DataType validateDataType(DataType dataType) { + if (dataType == DataType.DEFAULT) { + if (isPackingEnabled() || (this instanceof Union)) { + return Undefined1DataType.dataType; + } + return dataType; } - if (dataType instanceof FactoryDataType) { - throw new IllegalArgumentException("The \"" + dataType.getName() + - "\" data type is not allowed in a composite data type."); - } - else if (dataType instanceof Dynamic) { + if (dataType instanceof Dynamic) { Dynamic dynamicDataType = (Dynamic) dataType; if (!dynamicDataType.canSpecifyLength()) { throw new IllegalArgumentException("The \"" + dataType.getName() + "\" data type is not allowed in a composite data type."); } } + else if (dataType instanceof FactoryDataType || dataType.getLength() <= 0) { + throw new IllegalArgumentException("The \"" + dataType.getName() + + "\" data type is not allowed in a composite data type."); + } + return dataType; } @Override diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java index 4c16940a5a..655cb99327 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/DataTypeManagerDB.java @@ -2314,7 +2314,7 @@ abstract public class DataTypeManagerDB implements DataTypeManager { } else if (dt instanceof Pointer) { Pointer ptr = (Pointer) dt; - int len = ptr.isDynamicallySized() ? -1 : ptr.getLength(); + int len = ptr.hasLanguageDependantLength() ? -1 : ptr.getLength(); newDataType = createPointer(ptr.getDataType(), cat, (byte) len, handler); } else if (dt instanceof StructureInternal) { 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 25fae1ab2b..8ea854b2fd 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 @@ -155,7 +155,7 @@ class EnumDB extends DataTypeDB implements Enum { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return false; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/FunctionDefinitionDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/FunctionDefinitionDB.java index a69b9e5c17..3db09c4e2b 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/FunctionDefinitionDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/FunctionDefinitionDB.java @@ -87,7 +87,7 @@ class FunctionDefinitionDB extends DataTypeDB implements FunctionDefinition { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return false; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/PointerDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/PointerDB.java index d4c9726ccc..23d5fe9314 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/PointerDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/PointerDB.java @@ -126,7 +126,7 @@ class PointerDB extends DataTypeDB implements Pointer { return this; } // don't clone referenced data-type to avoid potential circular reference - return new PointerDataType(getDataType(), isDynamicallySized() ? -1 : getLength(), dtm); + return new PointerDataType(getDataType(), hasLanguageDependantLength() ? -1 : getLength(), dtm); } @Override @@ -148,7 +148,7 @@ class PointerDB extends DataTypeDB implements Pointer { DataType dt = getDataType(); if (dt == null) { displayName = PointerDataType.POINTER_NAME; - if (!isDynamicallySized()) { + if (!hasLanguageDependantLength()) { displayName += Integer.toString(getLength() * 8); } } @@ -180,7 +180,7 @@ class PointerDB extends DataTypeDB implements Pointer { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { lock.acquire(); try { checkIsValid(); @@ -213,7 +213,7 @@ class PointerDB extends DataTypeDB implements Pointer { try { checkIsValid(); StringBuffer sbuf = new StringBuffer(); - if (!isDynamicallySized()) { + if (!hasLanguageDependantLength()) { sbuf.append(Integer.toString(getLength() * 8)); sbuf.append("-bit "); } @@ -291,10 +291,10 @@ class PointerDB extends DataTypeDB implements Pointer { Pointer p = (Pointer) dt; DataType otherDataType = p.getDataType(); - if (isDynamicallySized() != p.isDynamicallySized()) { + if (hasLanguageDependantLength() != p.hasLanguageDependantLength()) { return false; } - if (!isDynamicallySized() && (getLength() != p.getLength())) { + if (!hasLanguageDependantLength() && (getLength() != p.getLength())) { return false; } @@ -447,7 +447,7 @@ class PointerDB extends DataTypeDB implements Pointer { @Override public Pointer newPointer(DataType dataType) { - if (isDynamicallySized()) { + if (hasLanguageDependantLength()) { return new PointerDataType(dataType, dataMgr); } return new PointerDataType(dataType, getLength(), dataMgr); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/StructureDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/StructureDB.java index e9007008df..0fd9664240 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/StructureDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/StructureDB.java @@ -119,7 +119,7 @@ class StructureDB extends CompositeDB implements StructureInternal { checkDeleted(); if (validatePackAndNotify) { - validateDataType(dataType); + dataType = validateDataType(dataType); dataType = resolve(dataType); checkAncestry(dataType); } @@ -178,12 +178,14 @@ class StructureDB extends CompositeDB implements StructureInternal { checkDeleted(); if (validatePackAndNotify) { - validateDataType(dataType); - dataType = resolve(dataType); + if (isInvalidFlexArrayDataType(dataType)) { throw new IllegalArgumentException( "Unsupported flexType: " + dataType.getDisplayName()); } + + validateDataType(dataType); + dataType = resolve(dataType); checkAncestry(dataType); } @@ -262,7 +264,7 @@ class StructureDB extends CompositeDB implements StructureInternal { if (ordinal == numComponents) { return add(dataType, length, name, comment); } - validateDataType(dataType); + dataType = validateDataType(dataType); dataType = resolve(dataType); checkAncestry(dataType); @@ -819,6 +821,11 @@ class StructureDB extends CompositeDB implements StructureInternal { } } + @Override + public boolean hasLanguageDependantLength() { + return isPackingEnabled(); + } + @Override public void clearComponent(int ordinal) { lock.acquire(); @@ -1047,7 +1054,7 @@ class StructureDB extends CompositeDB implements StructureInternal { lock.acquire(); try { checkDeleted(); - validateDataType(dataType); + dataType = validateDataType(dataType); dataType = resolve(dataType); checkAncestry(dataType); @@ -1121,7 +1128,7 @@ class StructureDB extends CompositeDB implements StructureInternal { throw new IndexOutOfBoundsException(ordinal); } - validateDataType(dataType); + dataType = validateDataType(dataType); DataTypeComponent origDtc = getComponent(ordinal); if (origDtc.isBitFieldComponent()) { @@ -1182,7 +1189,7 @@ class StructureDB extends CompositeDB implements StructureInternal { try { checkDeleted(); - validateDataType(dataType); + dataType = validateDataType(dataType); DataTypeComponent origDtc = getComponentAt(offset); if (origDtc.isBitFieldComponent()) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/TypedefDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/TypedefDB.java index 44088e7654..40d0513726 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/TypedefDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/TypedefDB.java @@ -61,8 +61,8 @@ class TypedefDB extends DataTypeDB implements TypeDef { } @Override - public boolean isDynamicallySized() { - return getDataType().isDynamicallySized(); + public boolean hasLanguageDependantLength() { + return getDataType().hasLanguageDependantLength(); } @Override diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/UnionDB.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/UnionDB.java index be09f16686..1d151df09f 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/UnionDB.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/database/data/UnionDB.java @@ -130,7 +130,7 @@ class UnionDB extends CompositeDB implements UnionInternal { private DataTypeComponent doAdd(DataType dataType, int length, String name, String comment, boolean validateAlignAndNotify) throws DataTypeDependencyException { - validateDataType(dataType); + dataType = validateDataType(dataType); dataType = adjustBitField(dataType); @@ -178,7 +178,7 @@ class UnionDB extends CompositeDB implements UnionInternal { lock.acquire(); try { checkDeleted(); - validateDataType(dataType); + dataType = validateDataType(dataType); dataType = adjustBitField(dataType); @@ -471,6 +471,12 @@ class UnionDB extends CompositeDB implements UnionInternal { } } + @Override + public boolean hasLanguageDependantLength() { + // Assume any component may have a language-dependent length + return true; + } + @Override protected void fixupComponents() { boolean changed = false; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AIFFDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AIFFDataType.java index 9ce46ac44d..7e80ac5180 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AIFFDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AIFFDataType.java @@ -81,14 +81,6 @@ public class AIFFDataType extends BuiltIn implements Dynamic { return false; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AUDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AUDataType.java index 42c85cdb33..666af6b26c 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AUDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AUDataType.java @@ -85,14 +85,6 @@ public class AUDataType extends BuiltIn implements Dynamic { return false; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractComplexDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractComplexDataType.java index 811531e67e..bbb7088c82 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractComplexDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractComplexDataType.java @@ -91,11 +91,6 @@ public abstract class AbstractComplexDataType extends BuiltIn { return "The data type for a complex number: a + bi"; } - @Override - public boolean isDynamicallySized() { - return false; - } - private static double toDouble(Object obj) { if (obj instanceof Double) { return (Double) obj; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractDataType.java index dd767e8b15..b914ec98f0 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractDataType.java @@ -232,7 +232,7 @@ public abstract class AbstractDataType implements DataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return false; // not applicable } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractFloatDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractFloatDataType.java index c32d402abb..b4197a8fe5 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractFloatDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractFloatDataType.java @@ -47,14 +47,6 @@ public abstract class AbstractFloatDataType extends BuiltIn { return name; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return false; - } - /** * * @see ghidra.program.model.data.DataType#getDescription() @@ -125,7 +117,7 @@ public abstract class AbstractFloatDataType extends BuiltIn { @Override public String getCTypeDeclaration(DataOrganization dataOrganization) { - return isDynamicallySized() ? null : name; + return hasLanguageDependantLength() ? null : name; } private static TreeMap floatTypes; // fixed-size float types diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractImageBaseOffsetDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractImageBaseOffsetDataType.java index 3cdbc50f11..ad5994dd34 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractImageBaseOffsetDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractImageBaseOffsetDataType.java @@ -58,11 +58,6 @@ abstract class AbstractImageBaseOffsetDataType extends BuiltIn { return getScalarDataType().getLength(); } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public String getRepresentation(MemBuffer buf, Settings settings, int length) { Address addr = (Address) getValue(buf, settings, length); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java index f2b22e519c..26b514dc40 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractIntegerDataType.java @@ -65,14 +65,6 @@ public abstract class AbstractIntegerDataType extends BuiltIn implements ArraySt this.signed = signed; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return false; - } - /** * Return the Format settings definition included in the settings * definition array diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractStringDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractStringDataType.java index dcba1504ae..b18ea48e80 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractStringDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AbstractStringDataType.java @@ -195,11 +195,6 @@ abstract public class AbstractStringDataType extends BuiltIn StringDataInstance.DEFAULT_CHARSET_NAME); } - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public int getLength() { return -1; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AlignmentDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AlignmentDataType.java index 53142f268d..78fb90b4f1 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AlignmentDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/AlignmentDataType.java @@ -78,14 +78,6 @@ public class AlignmentDataType extends BuiltIn implements Dynamic { return new AlignmentDataType(dtm); } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public String getDescription() { return "Consumes alignment/repeating bytes."; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ArrayDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ArrayDataType.java index 60913b8964..89713c07dd 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ArrayDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ArrayDataType.java @@ -88,8 +88,8 @@ public class ArrayDataType extends DataTypeImpl implements Array { } @Override - public boolean isDynamicallySized() { - return dataType.isDynamicallySized(); + public boolean hasLanguageDependantLength() { + return dataType.hasLanguageDependantLength(); } @Override diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BadDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BadDataType.java index cf6e722a64..fa59a9d581 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BadDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BadDataType.java @@ -43,6 +43,7 @@ public class BadDataType extends BuiltIn implements Dynamic { * * @see ghidra.program.model.data.DataType#getMnemonic(Settings) */ + @Override public String getMnemonic(Settings settings) { return getName(); } @@ -51,21 +52,16 @@ public class BadDataType extends BuiltIn implements Dynamic { * * @see ghidra.program.model.data.DataType#getLength() */ + @Override public int getLength() { return -1; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - public boolean isDynamicallySized() { - return false; - } - /** * * @see ghidra.program.model.data.DataType#getDescription() */ + @Override public String getDescription() { return "** Bad Data Type **"; } @@ -74,6 +70,7 @@ public class BadDataType extends BuiltIn implements Dynamic { * * @see ghidra.program.model.data.DataType#getValue(ghidra.program.model.mem.MemBuffer, ghidra.docking.settings.Settings, int) */ + @Override public Object getValue(MemBuffer buf, Settings settings, int length) { return getDescription(); } @@ -87,10 +84,12 @@ public class BadDataType extends BuiltIn implements Dynamic { * * @see ghidra.program.model.data.DataType#getRepresentation(MemBuffer, Settings, int) */ + @Override public String getRepresentation(MemBuffer buf, Settings settings, int length) { return getDescription(); } + @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { return this; @@ -98,14 +97,17 @@ public class BadDataType extends BuiltIn implements Dynamic { return new BadDataType(dtm); } + @Override public boolean canSpecifyLength() { return true; } + @Override public int getLength(MemBuffer buf, int maxLength) { return -1; } + @Override public DataType getReplacementBaseType() { return null; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BooleanDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BooleanDataType.java index 76e9466fa6..ca300be5ef 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BooleanDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/BooleanDataType.java @@ -28,8 +28,6 @@ import ghidra.program.model.mem.MemoryAccessException; */ public class BooleanDataType extends AbstractIntegerDataType { - private final static long serialVersionUID = 1; - private static SettingsDefinition[] SETTINGS_DEFS = {}; public static final BooleanDataType dataType = new BooleanDataType(); @@ -52,8 +50,9 @@ public class BooleanDataType extends AbstractIntegerDataType { @Override public String getDecompilerDisplayName(DecompilerLanguage language) { - if (language == DecompilerLanguage.JAVA_LANGUAGE) + if (language == DecompilerLanguage.JAVA_LANGUAGE) { return "boolean"; + } return name; } @@ -67,11 +66,6 @@ public class BooleanDataType extends AbstractIntegerDataType { return 1; // TODO: Size should probably be based upon data organization } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public String getDescription() { return "Boolean"; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/CharDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/CharDataType.java index 5d63a7a8e9..721ba03f75 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/CharDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/CharDataType.java @@ -99,7 +99,7 @@ public class CharDataType extends AbstractIntegerDataType implements DataTypeWit } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/CompositeDataTypeImpl.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/CompositeDataTypeImpl.java index 0e7295c295..38f69201d6 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/CompositeDataTypeImpl.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/CompositeDataTypeImpl.java @@ -111,9 +111,7 @@ public abstract class CompositeDataTypeImpl extends GenericDataType implements C } @Override - public boolean isDynamicallySized() { - return true; // assume dynamically sized component datatype may be present - } + public abstract boolean hasLanguageDependantLength(); @Override public boolean isPartOf(DataType dataTypeOfInterest) { @@ -142,23 +140,33 @@ public abstract class CompositeDataTypeImpl extends GenericDataType implements C /** * This method throws an exception if the indicated data type is not a valid - * data type for a component of this composite data type. + * data type for a component of this composite data type. If the DEFAULT + * datatype is specified when unsupported an Undefined1 will be returned + * in its place (e.g., packing enabled, Union). * * @param dataType the data type to be checked. + * @return datatype to be used for insert/add * @throws IllegalArgumentException if the data type is invalid. */ - protected void validateDataType(DataType dataType) { - if (dataType instanceof FactoryDataType) { - throw new IllegalArgumentException("The \"" + dataType.getName() + - "\" data type is not allowed in a composite data type."); + protected DataType validateDataType(DataType dataType) { + if (dataType == DataType.DEFAULT) { + if (isPackingEnabled() || (this instanceof Union)) { + return Undefined1DataType.dataType; + } + return dataType; } - else if (dataType instanceof Dynamic) { + if (dataType instanceof Dynamic) { Dynamic dynamicDataType = (Dynamic) dataType; if (!dynamicDataType.canSpecifyLength()) { throw new IllegalArgumentException("The \"" + dataType.getName() + "\" data type is not allowed in a composite data type."); } } + else if (dataType instanceof FactoryDataType || dataType.getLength() <= 0) { + throw new IllegalArgumentException("The \"" + dataType.getName() + + "\" data type is not allowed in a composite data type."); + } + return dataType; } /** diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataType.java index 285a4004f5..995c8d6b75 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataType.java @@ -38,10 +38,11 @@ public interface DataType { static final long NO_LAST_CHANGE_TIME = 0L; /** - * Indicates if this data-type is dynamically sized based upon DataOrganization. - * @return true if dynamically sized + * Indicates if the length of this data-type is determined based + * upon the {@link DataOrganization} obtained from the associated {@link DataTypeManager}. + * @return true length is language/compiler-specification dependent, else false */ - public boolean isDynamicallySized(); + public boolean hasLanguageDependantLength(); /** * Indicates if type has not yet been defined. diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DefaultDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DefaultDataType.java index 7750b12c56..e7bf8bb3f3 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DefaultDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DefaultDataType.java @@ -54,14 +54,6 @@ public class DefaultDataType extends DataTypeImpl { return 1; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return false; - } - /** * * @see ghidra.program.model.data.DataType#getDescription() diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DoubleDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DoubleDataType.java index 08546b2d28..c9d79568d5 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DoubleDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DoubleDataType.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +42,7 @@ public class DoubleDataType extends AbstractFloatDataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DynamicDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DynamicDataType.java index 5066daf366..5ebd62c191 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DynamicDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DynamicDataType.java @@ -50,14 +50,6 @@ public abstract class DynamicDataType extends BuiltIn implements Dynamic { return false; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return true; - } - /** * Gets the number of component data types in this data type. * @param buf a membuffer to be used by dataTypes that change depending on 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 4bcbe8e474..6a41b813b2 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 @@ -73,11 +73,6 @@ public class EnumDataType extends GenericDataType implements Enum { return ENUM_SETTINGS_DEFINITIONS; } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public long getValue(String valueName) throws NoSuchElementException { Long value = nameMap.get(valueName); diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FactoryDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FactoryDataType.java index 31cd018d79..5906b798a4 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FactoryDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FactoryDataType.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -30,7 +29,17 @@ public interface FactoryDataType extends BuiltInDataType { * Returns the appropriate DataType which corresponds to the specified * memory location. * @param buf memory location + * @return fabricated datatype based upon memory data */ DataType getDataType(MemBuffer buf); + /** + * All implementations must return a length of -1. + * @return length of -1 + */ + @Override + default int getLength() { + return -1; + } + } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FactoryStructureDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FactoryStructureDataType.java index 96675b512e..3c2ac11b3f 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FactoryStructureDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FactoryStructureDataType.java @@ -24,7 +24,6 @@ import ghidra.util.exception.DuplicateNameException; * a Structure and create a new Dynamic structure each time they are used. */ public abstract class FactoryStructureDataType extends BuiltIn implements FactoryDataType { - private final static long serialVersionUID = 1; /** * Constructs a new DynamicStructureDataType with the given name @@ -41,7 +40,7 @@ public abstract class FactoryStructureDataType extends BuiltIn implements Factor * @see ghidra.program.model.data.DataType#getLength() */ @Override - public int getLength() { + public final int getLength() { return -1; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FileTimeDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FileTimeDataType.java index 1310747cdb..4c1d95047c 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FileTimeDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FileTimeDataType.java @@ -67,14 +67,6 @@ public class FileTimeDataType extends BuiltIn { return 8; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public String getMnemonic(Settings settings) { return "FileTime"; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FloatDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FloatDataType.java index 297ea0ece4..1067c281c2 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FloatDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FloatDataType.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -43,7 +42,7 @@ public class FloatDataType extends AbstractFloatDataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FunctionDefinitionDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FunctionDefinitionDataType.java index 7763690261..6106c52170 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FunctionDefinitionDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/FunctionDefinitionDataType.java @@ -97,11 +97,11 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct Parameter[] parameters = function.getParameters(); ArrayList paramList = new ArrayList(); - for (int i = 0; i < parameters.length; i++) { - if (formalSignature && parameters[i].isAutoParameter()) { + for (Parameter parameter : parameters) { + if (formalSignature && parameter.isAutoParameter()) { continue; } - paramList.add(getParameterDefinition(parameters[i], formalSignature)); + paramList.add(getParameterDefinition(parameter, formalSignature)); } params = paramList.toArray(new ParameterDefinition[paramList.size()]); @@ -150,11 +150,6 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct } } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public void setReturnType(DataType type) { returnType = ParameterDefinitionImpl.validateDataType(type, dataMgr, true); @@ -350,8 +345,7 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct return; } } - for (int i = 0; i < params.length; i++) { - ParameterDefinition param = params[i]; + for (ParameterDefinition param : params) { if (param.getDataType() == oldDt) { try { param.setDataType(newDt); @@ -391,9 +385,9 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct if (returnType == dt) { returnType = DataType.DEFAULT; } - for (int i = 0; i < params.length; i++) { - if (params[i].getDataType() == dt) { - params[i].setDataType(DataType.DEFAULT); + for (ParameterDefinition param : params) { + if (param.getDataType() == dt) { + param.setDataType(DataType.DEFAULT); } } } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/GifDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/GifDataType.java index 50a7089954..9a8bccbca6 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/GifDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/GifDataType.java @@ -66,14 +66,6 @@ public class GifDataType extends BuiltIn implements Dynamic, Resource { return false; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/IntegerDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/IntegerDataType.java index 1e5afa62a6..61f713916c 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/IntegerDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/IntegerDataType.java @@ -34,10 +34,10 @@ public class IntegerDataType extends AbstractIntegerDataType { } /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() + * @see ghidra.program.model.data.DataType#hasLanguageDependantLength() */ @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/JPEGDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/JPEGDataType.java index 0d83d12c56..e1c1fa1c2a 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/JPEGDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/JPEGDataType.java @@ -80,14 +80,6 @@ public class JPEGDataType extends BuiltIn implements Dynamic, Resource { return false; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongDataType.java index 3dfc62419b..5c310a809e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongDataType.java @@ -42,10 +42,10 @@ public class LongDataType extends AbstractIntegerDataType { } /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() + * @see ghidra.program.model.data.DataType#hasLanguageDependantLength() */ @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongDoubleDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongDoubleDataType.java index b3ee4a7904..0af76c9f4e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongDoubleDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongDoubleDataType.java @@ -1,6 +1,5 @@ /* ### * IP: GHIDRA - * REVIEWED: YES * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,7 +47,7 @@ public class LongDoubleDataType extends AbstractFloatDataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongLongDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongLongDataType.java index d62997b162..0c8b95dce4 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongLongDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/LongLongDataType.java @@ -42,10 +42,10 @@ public class LongLongDataType extends AbstractIntegerDataType { } /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() + * @see ghidra.program.model.data.DataType#hasLanguageDependantLength() */ @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MacintoshTimeStampDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MacintoshTimeStampDataType.java index febafcfe1f..3b217c4af0 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MacintoshTimeStampDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MacintoshTimeStampDataType.java @@ -15,15 +15,15 @@ */ package ghidra.program.model.data; -import ghidra.docking.settings.Settings; -import ghidra.program.model.mem.MemBuffer; -import ghidra.util.Msg; -import ghidra.util.classfinder.*; - import java.text.SimpleDateFormat; import java.util.Date; import java.util.TimeZone; +import ghidra.docking.settings.Settings; +import ghidra.program.model.mem.MemBuffer; +import ghidra.util.Msg; +import ghidra.util.classfinder.ClassTranslator; + /** * A datatype to interpret the Mac OS timestamp * convention, which is based on the number of @@ -57,26 +57,23 @@ public class MacintoshTimeStampDataType extends BuiltIn { super(null, "MacTime", dtm); } + @Override public String getDescription() { return "The stamp follows the Macintosh time-measurement scheme " + "(that is, the number of seconds measured from January 1, 1904)."; } + @Override public int getLength() { return 4; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - public boolean isDynamicallySized() { - return false; - } - + @Override public String getMnemonic(Settings settings) { return "MacTime"; } + @Override public String getRepresentation(MemBuffer buf, Settings settings, int length) { if (macStartDate == null) { return "unparsed date"; @@ -93,10 +90,12 @@ public class MacintoshTimeStampDataType extends BuiltIn { return ""; } + @Override public Object getValue(MemBuffer buf, Settings settings, int length) { return getRepresentation(buf, settings, length); } + @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { return this; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MissingBuiltInDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MissingBuiltInDataType.java index b695ab69a9..946ca9e224 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MissingBuiltInDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/MissingBuiltInDataType.java @@ -85,14 +85,6 @@ public class MissingBuiltInDataType extends DataTypeImpl implements Dynamic { return -1; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public boolean canSpecifyLength() { return true; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ParameterDefinitionImpl.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ParameterDefinitionImpl.java index 6440216795..647130b0f5 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ParameterDefinitionImpl.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ParameterDefinitionImpl.java @@ -79,7 +79,7 @@ public class ParameterDefinitionImpl implements ParameterDefinition { dataType.getName()); } dataType = dataType.clone(dtMgr != null ? dtMgr : dataType.getDataTypeManager()); - if (!dataType.isDynamicallySized() && dataType.getLength() < 0) { + if (dataType.getLength() < 0) { throw new IllegalArgumentException(kind + " type must be specified with fixed-length data type: " + dataType.getName()); } @@ -94,7 +94,7 @@ public class ParameterDefinitionImpl implements ParameterDefinition { "Parameter type may not specify the void datatype - empty parameter list should be used"); } } - else if (!(dataType instanceof Composite) && dataType.getLength() == 0) { + else if (dataType.getLength() == 0) { throw new IllegalArgumentException(kind + " type must be specified with fixed-length data type: " + dataType.getName()); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/PngDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/PngDataType.java index 102d48f244..f51f2840e0 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/PngDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/PngDataType.java @@ -57,14 +57,6 @@ public class PngDataType extends BuiltIn implements Dynamic, Resource { return -1; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public boolean canSpecifyLength() { return false; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/PointerDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/PointerDataType.java index 835bf39230..84e8c7512d 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/PointerDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/PointerDataType.java @@ -31,8 +31,6 @@ import ghidra.util.DataConverter; */ public class PointerDataType extends BuiltIn implements Pointer { - private final static long serialVersionUID = 1; - public final static PointerDataType dataType = new PointerDataType(); public final static int MAX_POINTER_SIZE_BYTES = 8; @@ -156,7 +154,7 @@ public class PointerDataType extends BuiltIn implements Pointer { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return length <= 0; } @@ -460,10 +458,10 @@ public class PointerDataType extends BuiltIn implements Pointer { Pointer p = (Pointer) dt; DataType otherDataType = p.getDataType(); - if (isDynamicallySized() != p.isDynamicallySized()) { + if (hasLanguageDependantLength() != p.hasLanguageDependantLength()) { return false; } - if (!isDynamicallySized() && (getLength() != p.getLength())) { + if (!hasLanguageDependantLength() && (getLength() != p.getLength())) { return false; } if (referencedDataType == null) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/SegmentedCodePointerDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/SegmentedCodePointerDataType.java index 9fab7f3eb7..525fed01db 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/SegmentedCodePointerDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/SegmentedCodePointerDataType.java @@ -54,14 +54,6 @@ public class SegmentedCodePointerDataType extends BuiltIn { return 4; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public String getDescription() { return "Code address from 16 bit segment and 16 bit offset"; @@ -98,8 +90,9 @@ public class SegmentedCodePointerDataType extends BuiltIn { public String getRepresentation(MemBuffer buf, Settings settings, int length) { Object obj = getValue(buf, settings, length); - if (obj == null) + if (obj == null) { return "??"; + } return obj.toString(); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ShiftedAddressDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ShiftedAddressDataType.java index 3bdecbf70c..e6993833e4 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ShiftedAddressDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ShiftedAddressDataType.java @@ -18,7 +18,6 @@ package ghidra.program.model.data; import ghidra.docking.settings.Settings; import ghidra.docking.settings.SettingsDefinition; import ghidra.program.model.address.*; -import ghidra.program.model.lang.ProcessorContext; import ghidra.program.model.mem.MemBuffer; import ghidra.util.DataConverter; import ghidra.util.classfinder.ClassTranslator; @@ -60,7 +59,7 @@ public class ShiftedAddressDataType extends BuiltIn { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ShortDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ShortDataType.java index e17d62ee18..dd1ac9e3e4 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ShortDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/ShortDataType.java @@ -42,10 +42,10 @@ public class ShortDataType extends AbstractIntegerDataType { } /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() + * @see ghidra.program.model.data.DataType#hasLanguageDependantLength() */ @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StructureDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StructureDataType.java index 4433e44031..2b711f5499 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StructureDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/StructureDataType.java @@ -203,6 +203,11 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur return structLength; } + @Override + public boolean hasLanguageDependantLength() { + return isPackingEnabled(); + } + @Override public void delete(int ordinal) { if (ordinal < 0 || ordinal >= numComponents) { @@ -373,16 +378,6 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur return super.getPreferredComponentLength(dataType, length); } - @Override - protected void validateDataType(DataType dataType) { -// TODO: need tests - questionable if transitioning to/from no-packing works properly - if (isPackingEnabled() && dataType == DataType.DEFAULT) { - throw new IllegalArgumentException( - "The DEFAULT data type is not allowed in an aligned composite data type."); - } - super.validateDataType(dataType); - } - @Override public final DataTypeComponentImpl insertAtOffset(int offset, DataType dataType, int length) { return insertAtOffset(offset, dataType, length, null, null); @@ -410,7 +405,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur } } - validateDataType(dataType); + dataType = validateDataType(dataType); dataType = dataType.clone(dataMgr); checkAncestry(dataType); @@ -487,13 +482,15 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur String componentName, String comment, boolean packAndNotify) throws IllegalArgumentException { - validateDataType(dataType); - - dataType = dataType.clone(dataMgr); if (isFlexibleArray && isInvalidFlexArrayDataType(dataType)) { throw new IllegalArgumentException( "Unsupported flexType: " + dataType.getDisplayName()); } + + dataType = validateDataType(dataType); + + dataType = dataType.clone(dataMgr); + checkAncestry(dataType); DataTypeComponentImpl dtc; @@ -566,7 +563,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur if (index == numComponents) { return add(dataType, length, componentName, comment); } - validateDataType(dataType); + dataType = validateDataType(dataType); dataType = dataType.clone(dataMgr); checkAncestry(dataType); @@ -1311,7 +1308,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur throw new IndexOutOfBoundsException(index); } - validateDataType(dataType); + dataType = validateDataType(dataType); DataTypeComponentImpl origDtc = (DataTypeComponentImpl) getComponent(index); if (origDtc.isBitFieldComponent()) { @@ -1354,7 +1351,7 @@ public class StructureDataType extends CompositeDataTypeImpl implements Structur "Offset " + offset + " is beyond end of structure (" + getLength() + ")."); } - validateDataType(dataType); + dataType = validateDataType(dataType); DataTypeComponentImpl origDtc = (DataTypeComponentImpl) getComponentAt(offset); if (origDtc.isBitFieldComponent()) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/TypedefDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/TypedefDataType.java index 1f94fa83c5..7c35d0b96e 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/TypedefDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/TypedefDataType.java @@ -104,8 +104,8 @@ public class TypedefDataType extends GenericDataType implements TypeDef { } @Override - public boolean isDynamicallySized() { - return dataType.isDynamicallySized(); + public boolean hasLanguageDependantLength() { + return dataType.hasLanguageDependantLength(); } @Override diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/Undefined.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/Undefined.java index b6fcc15a1a..877c4e33ec 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/Undefined.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/Undefined.java @@ -39,14 +39,6 @@ public abstract class Undefined extends BuiltIn { return undefinedTypes; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - @Override - public boolean isDynamicallySized() { - return false; - } - /** * Get an Undefined data-type instance of the requested size * @param size data type size, sizes greater than 8 will cause an Undefined1[size] (i.e., Array) to be returned. @@ -74,10 +66,12 @@ public abstract class Undefined extends BuiltIn { * its various forms, else false. */ public static boolean isUndefined(DataType dataType) { - if (dataType instanceof DefaultDataType) + if (dataType instanceof DefaultDataType) { return true; - if (dataType instanceof Undefined) + } + if (dataType instanceof Undefined) { return true; + } return isUndefinedArray(dataType); } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnionDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnionDataType.java index be7e7c4ff8..9f1df95ab7 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnionDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnionDataType.java @@ -170,7 +170,7 @@ public class UnionDataType extends CompositeDataTypeImpl implements UnionInterna DataTypeComponent doAdd(DataType dataType, int length, String componentName, String comment) throws IllegalArgumentException { - validateDataType(dataType); + dataType = validateDataType(dataType); dataType = adjustBitField(dataType); @@ -190,7 +190,7 @@ public class UnionDataType extends CompositeDataTypeImpl implements UnionInterna @Override public DataTypeComponent insert(int ordinal, DataType dataType, int length, String componentName, String comment) throws IllegalArgumentException { - validateDataType(dataType); + dataType = validateDataType(dataType); int oldAlignment = getAlignment(); @@ -248,6 +248,12 @@ public class UnionDataType extends CompositeDataTypeImpl implements UnionInterna return unionLength; } + @Override + public boolean hasLanguageDependantLength() { + // Assume any component may have a language-dependent length + return true; + } + @Override public Union clone(DataTypeManager dtm) { if (dataMgr == dtm) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedIntegerDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedIntegerDataType.java index c5b4985426..76ca393b36 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedIntegerDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedIntegerDataType.java @@ -43,10 +43,10 @@ public class UnsignedIntegerDataType extends AbstractIntegerDataType { } /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() + * @see ghidra.program.model.data.DataType#hasLanguageDependantLength() */ @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedLongDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedLongDataType.java index e76d444814..4fb6e2aa87 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedLongDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedLongDataType.java @@ -43,10 +43,10 @@ public class UnsignedLongDataType extends AbstractIntegerDataType { } /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() + * @see ghidra.program.model.data.DataType#hasLanguageDependantLength() */ @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedLongLongDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedLongLongDataType.java index df313ce3ea..c46bb4a33c 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedLongLongDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedLongLongDataType.java @@ -43,10 +43,10 @@ public class UnsignedLongLongDataType extends AbstractIntegerDataType { } /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() + * @see ghidra.program.model.data.DataType#hasLanguageDependantLength() */ @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedShortDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedShortDataType.java index dd7f743345..57d40651f0 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedShortDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/UnsignedShortDataType.java @@ -43,10 +43,10 @@ public class UnsignedShortDataType extends AbstractIntegerDataType { } /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() + * @see ghidra.program.model.data.DataType#hasLanguageDependantLength() */ @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/VoidDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/VoidDataType.java index a7a26b7269..afae87be50 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/VoidDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/VoidDataType.java @@ -23,7 +23,6 @@ import ghidra.program.model.mem.MemBuffer; * a function has no return value. */ public class VoidDataType extends BuiltIn { - private final static long serialVersionUID = 1; /** A statically defined DefaultDataType used when an Undefined byte is needed.*/ public static VoidDataType dataType = new VoidDataType(); @@ -40,6 +39,7 @@ public class VoidDataType extends BuiltIn { * * @see ghidra.program.model.data.DataType#getMnemonic(Settings) */ + @Override public String getMnemonic(Settings settings) { return "void"; } @@ -48,21 +48,16 @@ public class VoidDataType extends BuiltIn { * * @see ghidra.program.model.data.DataType#getLength() */ + @Override public int getLength() { return 0; } - /** - * @see ghidra.program.model.data.DataType#isDynamicallySized() - */ - public boolean isDynamicallySized() { - return false; - } - /** * * @see ghidra.program.model.data.DataType#getDescription() */ + @Override public String getDescription() { return "void datatype"; } @@ -71,6 +66,7 @@ public class VoidDataType extends BuiltIn { * * @see ghidra.program.model.data.DataType#getRepresentation(MemBuffer, Settings, int) */ + @Override public String getRepresentation(MemBuffer buf, Settings settings, int length) { return ""; } @@ -79,10 +75,12 @@ public class VoidDataType extends BuiltIn { * * @see ghidra.program.model.data.DataType#getValue(ghidra.program.model.mem.MemBuffer, ghidra.docking.settings.Settings, int) */ + @Override public Object getValue(MemBuffer buf, Settings settings, int length) { return null; } + @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { return this; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WAVEDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WAVEDataType.java index 009593e957..c18a89a856 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WAVEDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WAVEDataType.java @@ -78,11 +78,6 @@ public class WAVEDataType extends BuiltIn implements Dynamic { return false; } - @Override - public boolean isDynamicallySized() { - return true; - } - @Override public DataType clone(DataTypeManager dtm) { if (dtm == getDataTypeManager()) { diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideChar16DataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideChar16DataType.java index 48a9c62b9f..07b62ea1dc 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideChar16DataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideChar16DataType.java @@ -23,8 +23,6 @@ import ghidra.util.StringUtilities; public class WideChar16DataType extends BuiltIn implements ArrayStringable, DataTypeWithCharset { - private final static long serialVersionUID = 1; - /** A statically defined WideCharDataType instance.*/ public final static WideChar16DataType dataType = new WideChar16DataType(); @@ -41,11 +39,6 @@ public class WideChar16DataType extends BuiltIn implements ArrayStringable, Data return 2; } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public String getDescription() { return "Wide-Character (16-bit/UTF16)"; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideChar32DataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideChar32DataType.java index a361615b03..3a7cd1127a 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideChar32DataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideChar32DataType.java @@ -24,8 +24,6 @@ import ghidra.util.StringUtilities; public class WideChar32DataType extends BuiltIn implements ArrayStringable, DataTypeWithCharset { - private final static long serialVersionUID = 1; - /** A statically defined WideCharDataType instance.*/ public final static WideChar32DataType dataType = new WideChar32DataType(); @@ -42,11 +40,6 @@ public class WideChar32DataType extends BuiltIn implements ArrayStringable, Data return 4; } - @Override - public boolean isDynamicallySized() { - return false; - } - @Override public String getDescription() { return "Wide-Character (32-bit/UTF32)"; diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideCharDataType.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideCharDataType.java index 58df19c350..15cccb7c77 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideCharDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/WideCharDataType.java @@ -26,8 +26,6 @@ public class WideCharDataType extends BuiltIn implements ArrayStringable, DataTy final static SettingsDefinition[] DEFAULT_WIDE_CHAR_SETTINGS = new SettingsDefinition[] { EndianSettingsDefinition.DEF, RenderUnicodeSettingsDefinition.RENDER }; - private final static long serialVersionUID = 1; - /** A statically defined WideCharDataType instance.*/ public final static WideCharDataType dataType = new WideCharDataType(); @@ -45,7 +43,7 @@ public class WideCharDataType extends BuiltIn implements ArrayStringable, DataTy } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { return true; } diff --git a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/VariableUtilities.java b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/VariableUtilities.java index 93afde2fc4..1e2b77b8a3 100644 --- a/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/VariableUtilities.java +++ b/Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/listing/VariableUtilities.java @@ -272,7 +272,9 @@ public class VariableUtilities { } dataType = Undefined.getUndefinedDataType(defaultSize); } - else if (dataType.isDynamicallySized()) { + else if (dataType.hasLanguageDependantLength()) { + // A clone is done to ensure that any affects of the data organization + // are properly reflected in the sizing of the datatype dataType = dataType.clone(program.getDataTypeManager()); } else if (dataType instanceof FunctionDefinition || (dataType instanceof TypeDef && diff --git a/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/model/data/TestDoubleDataType.java b/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/model/data/TestDoubleDataType.java index adb30d2312..c16c1765a3 100644 --- a/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/model/data/TestDoubleDataType.java +++ b/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/model/data/TestDoubleDataType.java @@ -43,7 +43,7 @@ public class TestDoubleDataType implements DataType { } @Override - public boolean isDynamicallySized() { + public boolean hasLanguageDependantLength() { throw new UnsupportedOperationException(); } diff --git a/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/model/listing/VariableUtilitiesTest.java b/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/model/listing/VariableUtilitiesTest.java new file mode 100644 index 0000000000..0914f706bb --- /dev/null +++ b/Ghidra/Framework/SoftwareModeling/src/test/java/ghidra/program/model/listing/VariableUtilitiesTest.java @@ -0,0 +1,67 @@ +/* ### + * IP: GHIDRA + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package ghidra.program.model.listing; + +import static org.junit.Assert.*; + +import org.junit.Before; +import org.junit.Test; + +import generic.jar.ResourceFile; +import generic.test.AbstractGenericTest; +import ghidra.framework.Application; +import ghidra.program.database.ProgramDB; +import ghidra.program.model.data.*; +import ghidra.program.model.lang.*; +import ghidra.program.util.DefaultLanguageService; + +public class VariableUtilitiesTest extends AbstractGenericTest { + + private ProgramDB program; + + @Before + public void setUp() throws Exception { + Language language = getLanguage("Toy:BE:64:default"); + CompilerSpec compilerSpec = language.getDefaultCompilerSpec(); + program = new ProgramDB("Test", language, compilerSpec, this); + } + + private Language getLanguage(String languageName) throws Exception { + ResourceFile ldefFile = Application.getModuleDataFile("Toy", "languages/toy.ldefs"); + if (ldefFile != null) { + LanguageService languageService = DefaultLanguageService.getLanguageService(ldefFile); + Language language = languageService.getLanguage(new LanguageID(languageName)); + return language; + } + throw new LanguageNotFoundException("Unsupported test language: " + languageName); + } + + @Test + public void testCheckDataType() throws Exception { + + DataType dt = new TypedefDataType("Foo", new PointerDataType()); // point size will be 8 in program + assertEquals(4, dt.getLength()); + + dt = VariableUtilities.checkDataType(dt, false, -1, program); + assertEquals(8, dt.getLength()); + + dt = new ArrayDataType(new PointerDataType(), 5, -1); // point size will be 8 in program + assertEquals(20, dt.getLength()); + + dt = VariableUtilities.checkDataType(dt, false, -1, program); + assertEquals(40, dt.getLength()); + } +} diff --git a/Ghidra/Processors/Toy/data/languages/toy.cspec b/Ghidra/Processors/Toy/data/languages/toy.cspec index 8285702892..ecf3a22e1f 100644 --- a/Ghidra/Processors/Toy/data/languages/toy.cspec +++ b/Ghidra/Processors/Toy/data/languages/toy.cspec @@ -1,6 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/Ghidra/Processors/Toy/data/languages/toy64.cspec b/Ghidra/Processors/Toy/data/languages/toy64.cspec index a6707ab46f..029b4ce6a9 100644 --- a/Ghidra/Processors/Toy/data/languages/toy64.cspec +++ b/Ghidra/Processors/Toy/data/languages/toy64.cspec @@ -1,6 +1,27 @@ + + + + + + + + + + + + + + + + + + + + +