Class DataOrganizationImpl

  • All Implemented Interfaces:
    DataOrganization

    public class DataOrganizationImpl
    extends java.lang.Object
    implements DataOrganization
    DataOrganization provides a single place for determining size and alignment information for data types within an archive or a program.
    • Method Summary

      All Methods Static Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      void clearSizeAlignmentMap()
      Remove all entries from the size alignment map
      int getAbsoluteMaxAlignment()
      Gets the maximum alignment value that is allowed by this data organization.
      int getAlignment​(DataType dataType, int dtSize)
      Determines the alignment value for the indicated data type.
      int getAlignmentOffset​(int minimumOffset, DataType dataType, int dtSize)
      Determines the offset where the specified data type should be placed to be properly aligned.
      BitFieldPacking getBitFieldPacking()
      Get the composite bitfield packing information associated with this data organization.
      int getCharSize()  
      int getDefaultAlignment()
      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.
      static DataOrganization getDefaultOrganization()
      Creates a new default DataOrganization.
      static DataOrganizationImpl getDefaultOrganization​(Language language)
      Creates a new default DataOrganization.
      int getDefaultPointerAlignment()
      Gets the default alignment to be used for a pointer that doesn't have size.
      int getDoubleSize()  
      int getFloatSize()  
      int getForcedAlignment​(DataType dataType)  
      static int getGreatestCommonDenominator​(int value1, int value2)
      Determines the greatest common denominator of two numbers.
      java.lang.String getIntegerCTypeApproximation​(int size, boolean signed)
      Returns the best fitting integer C-type whose size is less-than-or-equal to the specified size.
      int getIntegerSize()  
      static int getLeastCommonMultiple​(int value1, int value2)
      Determines the least (lowest) common multiple of two numbers.
      int getLongDoubleSize()  
      int getLongLongSize()  
      int getLongSize()  
      int getMachineAlignment()
      Gets the maximum useful alignment for the target machine
      static int getOffset​(int alignment, int minimumOffset)
      Determines the first offset that is equal to or greater than the minimum offset which has the specified alignment.
      static int getPaddingSize​(int alignment, int offset)
      Determines the amount of padding that should be added to a structure at the indicated offset in order to get the next component (member) to be aligned with the specified alignment within the structure.
      int getPointerShift()
      Shift amount affects interpretation of in-memory pointer values only and will also be reflected within instruction pcode.
      int getPointerSize()  
      int getShortSize()  
      int getSizeAlignment​(int size)
      Gets the alignment that is defined for a data type of the indicated size if one is defined.
      int getSizeAlignmentCount()
      Gets the number of sizes that have an alignment specified.
      int[] getSizes()
      Gets the sizes that have an alignment specified.
      int getWideCharSize()  
      boolean isBigEndian()  
      boolean isForcingAlignment​(DataType dataType)  
      boolean isSignedChar()  
      void setAbsoluteMaxAlignment​(int absoluteMaxAlignment)
      Sets the maximum alignment value that is allowed by this data organization.
      void setBigEndian​(boolean bigEndian)
      Set data endianess
      void setBitFieldPacking​(BitFieldPacking bitFieldPacking)
      Set the bitfield packing information associated with this data organization.
      void setCharIsSigned​(boolean signed)
      Defines the signed-ness of the "char" data type
      void setCharSize​(int charSize)
      Defines the size of a char (char) data type.
      void setDefaultAlignment​(int defaultAlignment)
      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.
      void setDefaultPointerAlignment​(int defaultPointerAlignment)
      Sets the default alignment to be used for a pointer that doesn't have size.
      void setDoubleSize​(int doubleSize)
      Defines the size of a double primitive data type.
      void setFloatSize​(int floatSize)
      Defines the size of a float primitive data type.
      void setIntegerSize​(int integerSize)
      Defines the size of an int primitive data type.
      void setLongDoubleSize​(int longDoubleSize)
      Defines the size of a long double primitive data type.
      void setLongLongSize​(int longLongSize)
      Defines the size of a long long primitive data type.
      void setLongSize​(int longSize)
      Defines the size of a long primitive data type.
      void setMachineAlignment​(int machineAlignment)
      Sets the maximum useful alignment for the target machine
      void setPointerShift​(int pointerShift)
      Defines the left shift amount for a shifted pointer data type.
      void setPointerSize​(int pointerSize)
      Defines the size of a pointer data type.
      void setShortSize​(int shortSize)
      Defines the size of a short primitive data type.
      void setSizeAlignment​(int size, int alignment)
      Sets the alignment that is defined for a data type of the indicated size if one is defined.
      void setWideCharSize​(int wideCharSize)
      Defines the size of a wide-char (wchar_t) data type.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Method Detail

      • getDefaultOrganization

        public static DataOrganization getDefaultOrganization()
        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.
        Returns:
        a new default DataOrganization.
      • getDefaultOrganization

        public static DataOrganizationImpl getDefaultOrganization​(Language language)
        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.
        Parameters:
        language - optional language used to initialize defaults (pointer size, endianess, etc.) (may be null)
        Returns:
        a new default DataOrganization.
      • isBigEndian

        public boolean isBigEndian()
        Specified by:
        isBigEndian in interface DataOrganization
        Returns:
        true if data stored big-endian byte order
      • getPointerSize

        public int getPointerSize()
        Specified by:
        getPointerSize in interface DataOrganization
        Returns:
        the size of a pointer data type in bytes.
      • getPointerShift

        public int getPointerShift()
        Description copied from interface: DataOrganization
        Shift amount affects interpretation of in-memory pointer values only and will also be reflected within instruction pcode. A value of zero indicates that shifted-pointers are not supported.
        Specified by:
        getPointerShift in interface DataOrganization
        Returns:
        the left shift amount for shifted-pointers.
      • isSignedChar

        public boolean isSignedChar()
        Specified by:
        isSignedChar in interface DataOrganization
        Returns:
        true if the "char" type is signed
      • getCharSize

        public int getCharSize()
        Specified by:
        getCharSize in interface DataOrganization
        Returns:
        the size of a char (char) primitive data type in bytes.
      • getWideCharSize

        public int getWideCharSize()
        Specified by:
        getWideCharSize in interface DataOrganization
        Returns:
        the size of a wide-char (wchar_t) primitive data type in bytes.
      • getShortSize

        public int getShortSize()
        Specified by:
        getShortSize in interface DataOrganization
        Returns:
        the size of a short primitive data type in bytes.
      • getIntegerSize

        public int getIntegerSize()
        Specified by:
        getIntegerSize in interface DataOrganization
        Returns:
        the size of a int primitive data type in bytes.
      • getLongSize

        public int getLongSize()
        Specified by:
        getLongSize in interface DataOrganization
        Returns:
        the size of a long primitive data type in bytes.
      • getLongLongSize

        public int getLongLongSize()
        Specified by:
        getLongLongSize in interface DataOrganization
        Returns:
        the size of a long long primitive data type in bytes.
      • getFloatSize

        public int getFloatSize()
        Specified by:
        getFloatSize in interface DataOrganization
        Returns:
        the size of a float primitive data type in bytes.
      • getDoubleSize

        public int getDoubleSize()
        Specified by:
        getDoubleSize in interface DataOrganization
        Returns:
        the size of a double primitive data type in bytes.
      • getLongDoubleSize

        public int getLongDoubleSize()
        Specified by:
        getLongDoubleSize in interface DataOrganization
        Returns:
        the size of a long double primitive data type in bytes.
      • setBigEndian

        public void setBigEndian​(boolean bigEndian)
        Set data endianess
        Parameters:
        bigEndian -
      • setPointerSize

        public void setPointerSize​(int pointerSize)
        Defines the size of a pointer data type.
        Parameters:
        shortSize - the size of a short.
      • setPointerShift

        public void setPointerShift​(int pointerShift)
        Defines the left shift amount for a shifted pointer data type. Shift amount affects interpretation of in-memory pointer values only and will also be reflected within instruction pcode.
        Parameters:
        pointerShift - left shift amount for in-memory pointer values
      • setCharIsSigned

        public void setCharIsSigned​(boolean signed)
        Defines the signed-ness of the "char" data type
        Parameters:
        signed - true if "char" type is signed
      • setCharSize

        public void setCharSize​(int charSize)
        Defines the size of a char (char) data type.
        Parameters:
        wideCharSize - the size of a char (char).
      • setWideCharSize

        public void setWideCharSize​(int wideCharSize)
        Defines the size of a wide-char (wchar_t) data type.
        Parameters:
        wideCharSize - the size of a wide-char (wchar_t).
      • setShortSize

        public void setShortSize​(int shortSize)
        Defines the size of a short primitive data type.
        Parameters:
        shortSize - the size of a short.
      • setIntegerSize

        public void setIntegerSize​(int integerSize)
        Defines the size of an int primitive data type.
        Parameters:
        integerSize - the size of an int.
      • setLongSize

        public void setLongSize​(int longSize)
        Defines the size of a long primitive data type.
        Parameters:
        longSize - the size of a long.
      • setLongLongSize

        public void setLongLongSize​(int longLongSize)
        Defines the size of a long long primitive data type.
        Parameters:
        longLongSize - the size of a long long.
      • setFloatSize

        public void setFloatSize​(int floatSize)
        Defines the size of a float primitive data type.
        Parameters:
        floatSize - the size of a float.
      • setDoubleSize

        public void setDoubleSize​(int doubleSize)
        Defines the size of a double primitive data type.
        Parameters:
        doubleSize - the size of a double.
      • setLongDoubleSize

        public void setLongDoubleSize​(int longDoubleSize)
        Defines the size of a long double primitive data type.
        Parameters:
        longDoubleSize - the size of a long double.
      • getAbsoluteMaxAlignment

        public int getAbsoluteMaxAlignment()
        Gets the maximum alignment value that is allowed by this data organization. When getting an alignment for any data type it will not exceed this value. If NO_MAXIMUM_ALIGNMENT is returned, the data organization isn't specifically limited.
        Specified by:
        getAbsoluteMaxAlignment in interface DataOrganization
        Returns:
        the absolute maximum alignment or NO_MAXIMUM_ALIGNMENT
      • getMachineAlignment

        public int getMachineAlignment()
        Gets the maximum useful alignment for the target machine
        Specified by:
        getMachineAlignment in interface DataOrganization
        Returns:
        the machine alignment
      • getDefaultAlignment

        public int getDefaultAlignment()
        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.
        Specified by:
        getDefaultAlignment in interface DataOrganization
        Returns:
        the default alignment to be used if no other alignment can be determined for a data type.
      • getDefaultPointerAlignment

        public int getDefaultPointerAlignment()
        Gets the default alignment to be used for a pointer that doesn't have size.
        Specified by:
        getDefaultPointerAlignment in interface DataOrganization
        Returns:
        the default alignment for a pointer
      • setAbsoluteMaxAlignment

        public void setAbsoluteMaxAlignment​(int absoluteMaxAlignment)
        Sets the maximum alignment value that is allowed by this data organization. When getting an alignment for any data type it will not exceed this value. If NO_MAXIMUM_ALIGNMENT is returned, the data organization isn't specifically limited.
        Parameters:
        absoluteMaxAlignment - the absolute maximum alignment or NO_MAXIMUM_ALIGNMENT
      • setMachineAlignment

        public void setMachineAlignment​(int machineAlignment)
        Sets the maximum useful alignment for the target machine
        Parameters:
        machineAlignment - the machine alignment
      • setDefaultAlignment

        public void setDefaultAlignment​(int defaultAlignment)
        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.
        Parameters:
        defaultAlignment - the default alignment to be used if no other alignment can be determined for a data type.
      • setDefaultPointerAlignment

        public void setDefaultPointerAlignment​(int defaultPointerAlignment)
        Sets the default alignment to be used for a pointer that doesn't have size.
        Parameters:
        defaultPointerAlignment - the default alignment for a pointer
      • getSizeAlignment

        public int getSizeAlignment​(int size)
                             throws NoValueException
        Gets the alignment that is defined for a data type of the indicated size if one is defined.
        Specified by:
        getSizeAlignment in interface DataOrganization
        Parameters:
        size - the size of the data type
        Returns:
        the alignment of the data type.
        Throws:
        NoValueException - if there isn't an alignment defined for the indicated size.
      • setSizeAlignment

        public void setSizeAlignment​(int size,
                                     int alignment)
        Sets the alignment that is defined for a data type of the indicated size if one is defined.
        Parameters:
        size - the size of the data type
        alignment - the alignment of the data type.
      • setBitFieldPacking

        public void setBitFieldPacking​(BitFieldPacking bitFieldPacking)
        Set the bitfield packing information associated with this data organization.
        Parameters:
        bitFieldPacking - bitfield packing information
      • getSizeAlignmentCount

        public int getSizeAlignmentCount()
        Gets the number of sizes that have an alignment specified.
        Specified by:
        getSizeAlignmentCount in interface DataOrganization
        Returns:
        the number of sizes with an alignment mapped to them.
      • getSizes

        public int[] getSizes()
        Gets the sizes that have an alignment specified.
        Specified by:
        getSizes in interface DataOrganization
        Returns:
        the sizes with alignments mapped to them.
      • getIntegerCTypeApproximation

        public java.lang.String getIntegerCTypeApproximation​(int size,
                                                             boolean signed)
        Returns the best fitting integer C-type whose size is less-than-or-equal to the specified size. "long long" will be returned for any size larger than "long long";
        Specified by:
        getIntegerCTypeApproximation in interface DataOrganization
        Parameters:
        size - integer size
        signed - if false the unsigned modifier will be prepended.
        Returns:
        the best fitting
      • getAlignment

        public int getAlignment​(DataType dataType,
                                int dtSize)
        Description copied from interface: DataOrganization
        Determines the alignment value for the indicated data type. (i.e. how the data type gets aligned within other data types.) NOTE: the alignment of bitfields is dependent upon packing rules which must be considered at the composite level.
        Specified by:
        getAlignment in interface DataOrganization
        Parameters:
        dataType - the data type
        dtSize - the data type's size or component size
        Returns:
        the alignment
      • getAlignmentOffset

        public int getAlignmentOffset​(int minimumOffset,
                                      DataType dataType,
                                      int dtSize)
        Determines the offset where the specified data type should be placed to be properly aligned.
        Specified by:
        getAlignmentOffset in interface DataOrganization
        Parameters:
        minimumOffset - the minimum allowable offset where the data type can be placed.
        dataType - the data type
        dtSize - the data type's size
        Returns:
        the aligned offset for the data type
      • getOffset

        public static int getOffset​(int alignment,
                                    int minimumOffset)
        Determines the first offset that is equal to or greater than the minimum offset which has the specified alignment.
        Parameters:
        alignment - the desired alignment
        minimumOffset - the minimum offset
        Returns:
        the aligned offset
      • getPaddingSize

        public static int getPaddingSize​(int alignment,
                                         int offset)
        Determines the amount of padding that should be added to a structure at the indicated offset in order to get the next component (member) to be aligned with the specified alignment within the structure.
        Parameters:
        alignment - the desired alignment
        offset - the offset that the padding would be placed at to achieve the desired alignment.
        Returns:
        the padding needed at the offset.
      • getLeastCommonMultiple

        public static int getLeastCommonMultiple​(int value1,
                                                 int value2)
        Determines the least (lowest) common multiple of two numbers.
        Parameters:
        value1 - the first number
        value2 - the second number
        Returns:
        the least common multiple
      • getGreatestCommonDenominator

        public static int getGreatestCommonDenominator​(int value1,
                                                       int value2)
        Determines the greatest common denominator of two numbers.
        Parameters:
        value1 - the first number
        value2 - the second number
        Returns:
        the greatest common denominator