mirror of
https://github.com/NationalSecurityAgency/ghidra.git
synced 2025-10-04 18:29:37 +02:00
Merge remote-tracking branch
'origin/GP-3449_ghizard_32-bit_Win_8-byte_type_alignment' Conflicts: Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataOrganizationImpl.java
This commit is contained in:
commit
da9a9ecb4e
4 changed files with 62 additions and 28 deletions
|
@ -30,7 +30,7 @@ import ghidra.xml.XmlElement;
|
|||
import ghidra.xml.XmlPullParser;
|
||||
|
||||
/**
|
||||
* DataOrganization provides a single place for determining size and alignment information
|
||||
* DataOrganization provides a single place for determining size and alignment information
|
||||
* for data types within an archive or a program.
|
||||
*/
|
||||
public class DataOrganizationImpl implements DataOrganization {
|
||||
|
@ -99,7 +99,8 @@ public class DataOrganizationImpl implements DataOrganization {
|
|||
* Creates a new default DataOrganization. This has a mapping which defines the alignment
|
||||
* of a data type based on its size. The map defines pairs for data types that are
|
||||
* 1, 2, 4, and 8 bytes in length.
|
||||
* @param language optional language used to initialize defaults (pointer size, endianess, etc.) (may be null)
|
||||
* @param language optional language used to initialize defaults (pointer size, endianess, etc.)
|
||||
* (may be null)
|
||||
* @return a new default DataOrganization.
|
||||
*/
|
||||
public static DataOrganizationImpl getDefaultOrganization(Language language) {
|
||||
|
@ -107,7 +108,7 @@ public class DataOrganizationImpl implements DataOrganization {
|
|||
dataOrganization.setSizeAlignment(1, 1);
|
||||
dataOrganization.setSizeAlignment(2, 2);
|
||||
dataOrganization.setSizeAlignment(4, 4);
|
||||
dataOrganization.setSizeAlignment(8, 4);
|
||||
dataOrganization.setSizeAlignment(8, 8);
|
||||
if (language != null) {
|
||||
// NOTE: Ensure that saveXml always saves pointer size
|
||||
dataOrganization.setPointerSize(language.getDefaultSpace().getPointerSize());
|
||||
|
@ -352,10 +353,10 @@ public class DataOrganizationImpl implements DataOrganization {
|
|||
}
|
||||
|
||||
/**
|
||||
* Gets the default alignment to be used for any data type that isn't a
|
||||
* structure, union, array, pointer, type definition, and whose size isn't in the
|
||||
* Gets the default alignment to be used for any data type that isn't a
|
||||
* structure, union, array, pointer, type definition, and whose size isn't in the
|
||||
* size/alignment map.
|
||||
* @return the default alignment to be used if no other alignment can be
|
||||
* @return the default alignment to be used if no other alignment can be
|
||||
* determined for a data type.
|
||||
*/
|
||||
@Override
|
||||
|
@ -391,10 +392,10 @@ public class DataOrganizationImpl implements DataOrganization {
|
|||
}
|
||||
|
||||
/**
|
||||
* Sets the default alignment to be used for any data type that isn't a
|
||||
* structure, union, array, pointer, type definition, and whose size isn't in the
|
||||
* Sets the default alignment to be used for any data type that isn't a
|
||||
* structure, union, array, pointer, type definition, and whose size isn't in the
|
||||
* size/alignment map.
|
||||
* @param defaultAlignment the default alignment to be used if no other alignment can be
|
||||
* @param defaultAlignment the default alignment to be used if no other alignment can be
|
||||
* determined for a data type.
|
||||
*/
|
||||
public void setDefaultAlignment(int defaultAlignment) {
|
||||
|
@ -536,7 +537,7 @@ public class DataOrganizationImpl implements DataOrganization {
|
|||
}
|
||||
|
||||
/**
|
||||
* Determines the first offset that is equal to or greater than the minimum offset which
|
||||
* Determines the first offset that is equal to or greater than the minimum offset which
|
||||
* has the specified alignment. If a non-positive alignment is specified the origina
|
||||
* minimumOffset will be return.
|
||||
* @param alignment the desired alignment (positive value)
|
||||
|
@ -598,7 +599,7 @@ public class DataOrganizationImpl implements DataOrganization {
|
|||
dataMap.delete(key);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (dataOrg.isBigEndian()) { // default is little-endian
|
||||
dataMap.put(keyPrefix + BIG_ENDIAN_NAME, Boolean.TRUE.toString());
|
||||
}
|
||||
|
@ -734,7 +735,7 @@ public class DataOrganizationImpl implements DataOrganization {
|
|||
|
||||
dataOrg.defaultPointerAlignment =
|
||||
dataMap.getInt(keyPrefix + ELEM_DEFAULT_POINTER_ALIGNMENT.name(),
|
||||
dataOrg.defaultPointerAlignment);
|
||||
dataOrg.defaultPointerAlignment);
|
||||
|
||||
dataOrg.pointerSize =
|
||||
dataMap.getInt(keyPrefix + ELEM_POINTER_SIZE.name(), dataOrg.pointerSize);
|
||||
|
@ -801,9 +802,9 @@ public class DataOrganizationImpl implements DataOrganization {
|
|||
*/
|
||||
public void encode(Encoder encoder) throws IOException {
|
||||
encoder.openElement(ELEM_DATA_ORGANIZATION);
|
||||
|
||||
// NOTE: endianess intentionally omitted from output
|
||||
|
||||
|
||||
// NOTE: endianess intentionally omitted from output
|
||||
|
||||
if (absoluteMaxAlignment != NO_MAXIMUM_ALIGNMENT) {
|
||||
encoder.openElement(ELEM_ABSOLUTE_MAX_ALIGNMENT);
|
||||
encoder.writeSignedInteger(ATTRIB_VALUE, absoluteMaxAlignment);
|
||||
|
@ -901,17 +902,17 @@ public class DataOrganizationImpl implements DataOrganization {
|
|||
}
|
||||
|
||||
/**
|
||||
* Restore settings from an XML stream. This expects to see parser positioned on the
|
||||
* <data_organization> start tag. The XML is designed to override existing language-specific
|
||||
* default settings which are pre-populated with {@link #getDefaultOrganization(Language)}. This
|
||||
* will will ensure that the endianess setting is properly established since it is not included
|
||||
* Restore settings from an XML stream. This expects to see parser positioned on the
|
||||
* <data_organization> start tag. The XML is designed to override existing language-specific
|
||||
* default settings which are pre-populated with {@link #getDefaultOrganization(Language)}. This
|
||||
* will will ensure that the endianess setting is properly established since it is not included
|
||||
* in the XML.
|
||||
* @param parser is the XML stream
|
||||
*/
|
||||
public void restoreXml(XmlPullParser parser) {
|
||||
|
||||
// NOTE: endianess intentionally omitted from XML.
|
||||
|
||||
|
||||
// NOTE: endianess intentionally omitted from XML.
|
||||
|
||||
parser.start();
|
||||
while (parser.peek().isStart()) {
|
||||
String name = parser.peek().getName();
|
||||
|
|
|
@ -17,7 +17,7 @@ package ghidra.program.model.data;
|
|||
|
||||
/**
|
||||
* <code>DataOrganizationTestUtils</code> provides various methods for modifying
|
||||
* a DataOrganization to reflect a specific processor/compiler spec. This can be used
|
||||
* a DataOrganization to reflect a specific processor/compiler spec. This can be used
|
||||
* when only the DataOrganization is needed and not the Language/CompilerSpec.
|
||||
*/
|
||||
public class DataOrganizationTestUtils {
|
||||
|
@ -57,6 +57,37 @@ public class DataOrganizationTestUtils {
|
|||
dataOrg.setBitFieldPacking(bitFieldPacking);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize data organization to reflect x86gcc.cspec specification
|
||||
* @param dataOrg data organization
|
||||
*/
|
||||
public static void initDataOrganizationGcc32BitX86(DataOrganizationImpl dataOrg) {
|
||||
|
||||
dataOrg.setBigEndian(false);
|
||||
|
||||
dataOrg.setAbsoluteMaxAlignment(0);
|
||||
dataOrg.setMachineAlignment(2);
|
||||
dataOrg.setDefaultAlignment(1);
|
||||
dataOrg.setDefaultPointerAlignment(4);
|
||||
dataOrg.setPointerSize(4);
|
||||
dataOrg.setWideCharSize(4);
|
||||
dataOrg.setShortSize(2);
|
||||
dataOrg.setIntegerSize(4);
|
||||
dataOrg.setLongSize(4);
|
||||
dataOrg.setLongLongSize(8);
|
||||
dataOrg.setFloatSize(4);
|
||||
dataOrg.setDoubleSize(8);
|
||||
dataOrg.setLongDoubleSize(16);
|
||||
dataOrg.setSizeAlignment(1, 1);
|
||||
dataOrg.setSizeAlignment(2, 2);
|
||||
dataOrg.setSizeAlignment(4, 4);
|
||||
dataOrg.setSizeAlignment(8, 4);
|
||||
dataOrg.setSizeAlignment(16, 16);
|
||||
|
||||
BitFieldPackingImpl bitFieldPacking = new BitFieldPackingImpl(); // use defaults
|
||||
dataOrg.setBitFieldPacking(bitFieldPacking);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize data organization to reflect x86-64-gcc.cspec specification
|
||||
* @param dataOrg data organization
|
||||
|
@ -82,6 +113,7 @@ public class DataOrganizationTestUtils {
|
|||
dataOrg.setSizeAlignment(2, 2);
|
||||
dataOrg.setSizeAlignment(4, 4);
|
||||
dataOrg.setSizeAlignment(8, 8);
|
||||
dataOrg.setSizeAlignment(16, 16);
|
||||
|
||||
BitFieldPackingImpl bitFieldPacking = new BitFieldPackingImpl(); // use defaults
|
||||
dataOrg.setBitFieldPacking(bitFieldPacking);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue