mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-05 02:39:44 +02:00
Merge remote-tracking branch 'origin/GP-932_ghidra1_isDynamicallySized'
This commit is contained in:
commit
65e4c704ec
83 changed files with 320 additions and 390 deletions
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -165,9 +165,4 @@ public abstract class AbstractLeb128DataType extends BuiltIn implements Dynamic
|
|||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -67,11 +67,6 @@ public class PcRelative31AddressDataType extends BuiltIn {
|
|||
return name;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public int getLength() {
|
||||
return 4;
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -34,7 +34,7 @@ class MSRichProductInfoDataType extends StructureDataType {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
public boolean hasLanguageDependantLength() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -35,7 +35,7 @@ class RichTableRecordDataType extends StructureDataType {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
public boolean hasLanguageDependantLength() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -36,6 +36,7 @@ public class ElfDataType extends FactoryStructureDataType {
|
|||
super("ELF", dtm);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getMnemonic(Settings settings) {
|
||||
return "ELF";
|
||||
}
|
||||
|
@ -45,13 +46,6 @@ public class ElfDataType extends FactoryStructureDataType {
|
|||
return "ELF Data Type";
|
||||
}
|
||||
|
||||
/**
|
||||
* @see ghidra.program.model.data.DataType#isDynamicallySized()
|
||||
*/
|
||||
public boolean isDynamicallySized() {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void populateDynamicStructure(MemBuffer buf, Structure struct) {
|
||||
try {
|
||||
|
|
|
@ -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.
|
||||
|
@ -54,14 +53,6 @@ public class PeDataType extends FactoryStructureDataType {
|
|||
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) {
|
||||
try {
|
||||
|
|
|
@ -111,8 +111,8 @@ class ArrayDB extends DataTypeDB implements Array {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
return getDataType().isDynamicallySized();
|
||||
public boolean hasLanguageDependantLength() {
|
||||
return getDataType().hasLanguageDependantLength();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -189,9 +189,7 @@ 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) {
|
||||
|
@ -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
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -155,7 +155,7 @@ class EnumDB extends DataTypeDB implements Enum {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
public boolean hasLanguageDependantLength() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -87,7 +87,7 @@ class FunctionDefinitionDB extends DataTypeDB implements FunctionDefinition {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
public boolean hasLanguageDependantLength() {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -61,8 +61,8 @@ class TypedefDB extends DataTypeDB implements TypeDef {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
return getDataType().isDynamicallySized();
|
||||
public boolean hasLanguageDependantLength() {
|
||||
return getDataType().hasLanguageDependantLength();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -232,7 +232,7 @@ public abstract class AbstractDataType implements DataType {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
public boolean hasLanguageDependantLength() {
|
||||
return false; // not applicable
|
||||
}
|
||||
|
||||
|
|
|
@ -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<Integer, AbstractFloatDataType> floatTypes; // fixed-size float types
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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.";
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -99,7 +99,7 @@ public class CharDataType extends AbstractIntegerDataType implements DataTypeWit
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
public boolean hasLanguageDependantLength() {
|
||||
return true;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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()
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -97,11 +97,11 @@ public class FunctionDefinitionDataType extends GenericDataType implements Funct
|
|||
Parameter[] parameters = function.getParameters();
|
||||
|
||||
ArrayList<ParameterDefinition> paramList = new ArrayList<ParameterDefinition>();
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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()) {
|
||||
|
|
|
@ -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)";
|
||||
|
|
|
@ -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)";
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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 &&
|
||||
|
|
|
@ -43,7 +43,7 @@ public class TestDoubleDataType implements DataType {
|
|||
}
|
||||
|
||||
@Override
|
||||
public boolean isDynamicallySized() {
|
||||
public boolean hasLanguageDependantLength() {
|
||||
throw new UnsupportedOperationException();
|
||||
}
|
||||
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
|
@ -1,6 +1,27 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<compiler_spec>
|
||||
<data_organization>
|
||||
<absolute_max_alignment value="0" /> <!-- no maximum alignment -->
|
||||
<machine_alignment value="8" />
|
||||
<default_alignment value="1" />
|
||||
<default_pointer_alignment value="4" />
|
||||
<pointer_size value="4" />
|
||||
<wchar_size value="2" />
|
||||
<short_size value="2" />
|
||||
<integer_size value="4" />
|
||||
<long_size value="4" />
|
||||
<long_long_size value="8" />
|
||||
<float_size value="4" />
|
||||
<double_size value="8" />
|
||||
<long_double_size value="8" />
|
||||
<size_alignment_map>
|
||||
<entry size="1" alignment="1" />
|
||||
<entry size="2" alignment="2" />
|
||||
<entry size="4" alignment="4" />
|
||||
<entry size="8" alignment="4" />
|
||||
</size_alignment_map>
|
||||
</data_organization>
|
||||
<global>
|
||||
<range space="ram"/>
|
||||
</global>
|
||||
|
|
|
@ -1,6 +1,27 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
|
||||
<compiler_spec>
|
||||
<data_organization>
|
||||
<absolute_max_alignment value="0" />
|
||||
<machine_alignment value="2" />
|
||||
<default_alignment value="1" />
|
||||
<default_pointer_alignment value="8" />
|
||||
<pointer_size value="8" />
|
||||
<wchar_size value="2" />
|
||||
<short_size value="2" />
|
||||
<integer_size value="4" />
|
||||
<long_size value="4" />
|
||||
<long_long_size value="8" />
|
||||
<float_size value="4" />
|
||||
<double_size value="8" />
|
||||
<long_double_size value="8" />
|
||||
<size_alignment_map>
|
||||
<entry size="1" alignment="1" />
|
||||
<entry size="2" alignment="2" />
|
||||
<entry size="4" alignment="4" />
|
||||
<entry size="8" alignment="8" />
|
||||
</size_alignment_map>
|
||||
</data_organization>
|
||||
<global>
|
||||
<range space="ram"/>
|
||||
</global>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue