Merge remote-tracking branch

'origin/GP-3675_ghidra1_CreateDatabackgroundCmd' into patch
(Closes #5602)
This commit is contained in:
Ryan Kurtz 2023-08-04 06:31:45 -04:00
commit 5fe28ee208
3 changed files with 32 additions and 38 deletions

View file

@ -126,38 +126,15 @@ public class CreateDataBackgroundCmd extends BackgroundCommand {
return true; return true;
} }
private static Address alignAddress(Address addr, int alignment) {
if (addr == null) {
return null;
}
long mod = addr.getOffset() % alignment;
if (mod == 0) {
return addr;
}
try {
return addr.addNoWrap(alignment - mod);
}
catch (AddressOverflowException e) {
// ignore
}
return null;
}
private void createData(Address start, Address end, DataType dataType, Program p, private void createData(Address start, Address end, DataType dataType, Program p,
TaskMonitor monitor) throws CodeUnitInsertionException { TaskMonitor monitor) throws CodeUnitInsertionException {
int alignment = 1; Address nextAddr = start;
if (newDataType.getLength() != newDataType.getAlignedLength()) { Listing listing = p.getListing();
// datatypes whose length does not match their aligned-length must listing.clearCodeUnits(start, end, false);
// be properly aligned to account for padding (e.g., x86-32 80-bit floats)
alignment = newDataType.getAlignment();
}
int initialProgress = bytesApplied; int initialProgress = bytesApplied;
Listing listing = p.getListing();
listing.clearCodeUnits(start, end, false);
Address nextAddr = alignAddress(start, alignment);
int length = (int) end.subtract(nextAddr) + 1; int length = (int) end.subtract(nextAddr) + 1;
while (nextAddr != null && nextAddr.compareTo(end) <= 0) { while (nextAddr != null && nextAddr.compareTo(end) <= 0) {
if (monitor.isCancelled()) { if (monitor.isCancelled()) {
@ -165,19 +142,22 @@ public class CreateDataBackgroundCmd extends BackgroundCommand {
} }
Data d = listing.createData(nextAddr, dataType, length); Data d = listing.createData(nextAddr, dataType, length);
Address maxDataAddr = d.getMaxAddress(); int dataLength = d.getLength();
bytesApplied = initialProgress + (int) maxDataAddr.subtract(start) + 1; bytesApplied = initialProgress + dataLength;
nextAddr = alignAddress(maxDataAddr.next(), alignment);
if (nextAddr != null) { try {
length = (int) end.subtract(nextAddr) + 1; nextAddr = nextAddr.addNoWrap(dataLength);
length -= dataLength;
}
catch (AddressOverflowException e) {
return;
} }
monitor.setProgress(bytesApplied); monitor.setProgress(bytesApplied);
if (++numDataCreated % 10000 == 0) { if (++numDataCreated % 10000 == 0) {
monitor.setMessage("Created " + numDataCreated); monitor.setMessage("Created " + numDataCreated);
// Allow the Swing thread a chance to paint components that may require // Allow the Swing thread a chance to paint components that may require lock
// a DB lock.
Swing.allowSwingToProcessEvents(); Swing.allowSwingToProcessEvents();
} }
} }

View file

@ -212,7 +212,7 @@ public abstract class CompositeEditorModel extends CompositeViewerModel implemen
} }
DataType resultDt = DataUtilities.reconcileAppliedDataType(currentDt, dt, true); DataType resultDt = DataUtilities.reconcileAppliedDataType(currentDt, dt, true);
int resultLen = resultDt.getAlignedLength(); int resultLen = resultDt.getLength();
if (resultDt instanceof Dynamic) { if (resultDt instanceof Dynamic) {
resultLen = DataTypeHelper.requestDtSize(getProvider(), resultDt.getDisplayName(), resultLen = DataTypeHelper.requestDtSize(getProvider(), resultDt.getDisplayName(),
@ -222,7 +222,9 @@ public abstract class CompositeEditorModel extends CompositeViewerModel implemen
throw new InvalidDataTypeException("Data types of size 0 are not allowed."); throw new InvalidDataTypeException("Data types of size 0 are not allowed.");
} }
return DataTypeInstance.getDataTypeInstance(resultDt, resultLen, true); // TODO: Need to handle proper placement for big-endian within a larger component (i.e., right-justified)
return DataTypeInstance.getDataTypeInstance(resultDt, resultLen,
viewComposite.isPackingEnabled());
} }
/** /**

View file

@ -77,6 +77,11 @@ public class DataTypeInstance {
/** /**
* Generate a data-type instance * Generate a data-type instance
* Factory and Dynamic data-types are NOT handled. * Factory and Dynamic data-types are NOT handled.
* <br>
* This container does not dictate the placement of a fixed-length type within this
* container. It is suggested that big-endian use should evaulate the datatype
* at the far end of the container.
*
* @param dataType data type * @param dataType data type
* @param buf memory buffer * @param buf memory buffer
* @param useAlignedLength if true a fixed-length primitive data type will use its * @param useAlignedLength if true a fixed-length primitive data type will use its
@ -95,6 +100,11 @@ public class DataTypeInstance {
/** /**
* Attempt to create a fixed-length data-type instance. * Attempt to create a fixed-length data-type instance.
* Factory and non-sizable Dynamic data-types are NOT handled. * Factory and non-sizable Dynamic data-types are NOT handled.
* <br>
* This container does not dictate the placement of a fixed-length type within this
* container. It is suggested that big-endian use should evaulate the datatype
* at the far end of the container.
*
* @param dataType data type * @param dataType data type
* @param length length for sizable Dynamic data-types, otherwise ignored * @param length length for sizable Dynamic data-types, otherwise ignored
* @param useAlignedLength if true a fixed-length primitive data type will use its * @param useAlignedLength if true a fixed-length primitive data type will use its
@ -128,6 +138,7 @@ public class DataTypeInstance {
} }
} }
else if (useAlignedLength) { else if (useAlignedLength) {
// TODO: big-endian should place type at end of this container
length = dataType.getAlignedLength(); length = dataType.getAlignedLength();
} }
else { else {
@ -145,10 +156,11 @@ public class DataTypeInstance {
* Attempt to create a data-type instance associated with a specific memory location. * Attempt to create a data-type instance associated with a specific memory location.
* Factory and Dynamic data-types are handled. * Factory and Dynamic data-types are handled.
* <br> * <br>
* NOTE: fixed-length primitive datatypes assume {@link DataType#getLength() raw datatype length} * This container does not dictate the placement of a fixed-length type within this
* intended for {@link Data} use. * container. It is suggested that big-endian use should evaulate the datatype
* at the far end of the container.
* *
* @param dataType * @param dataType the data type
* @param buf memory location * @param buf memory location
* @param length length for sizable Dynamic data-types, otherwise ignored * @param length length for sizable Dynamic data-types, otherwise ignored
* @param useAlignedLength if true a fixed-length primitive data type will use its * @param useAlignedLength if true a fixed-length primitive data type will use its