Data type alignment#
GNU Modula-2 allows you to specify alignment for types and variables.
The syntax for alignment is to use the ISO pragma directives <*
bytealignment (
expression )
and *>
. These directives
can be used after type and variable declarations.
The ebnf of the alignment production is:
Alignment := [ ByteAlignment ] =:
ByteAlignment := '<*' AttributeExpression '*>' =:
AlignmentExpression := "(" ConstExpression ")" =:
The Alignment
ebnf statement may be used during contruction of
types, records, record fields, arrays, pointers and variables. Below
is an example of aligning a type so that the variable bar
is
aligned on a 1024 address.
MODULE align ;
TYPE
foo = INTEGER <* bytealignment(1024) *> ;
VAR
z : INTEGER ;
bar: foo ;
BEGIN
END align.
The next example aligns a variable on a 1024 byte boundary.
MODULE align2 ;
VAR
x : CHAR ;
z : ARRAY [0..255] OF INTEGER <* bytealignment(1024) *> ;
BEGIN
END align2.
Here the example aligns a pointer on a 1024 byte boundary.
MODULE align4 ;
FROM SYSTEM IMPORT ADR ;
FROM libc IMPORT exit ;
VAR
x : CHAR ;
z : POINTER TO INTEGER <* bytealignment(1024) *> ;
BEGIN
IF ADR(z) MOD 1024=0
THEN
exit(0)
ELSE
exit(1)
END
END align4.
In example align5
record field y
is aligned on a 1024
byte boundary.
MODULE align5 ;
FROM SYSTEM IMPORT ADR ;
FROM libc IMPORT exit ;
TYPE
rec = RECORD
x: CHAR ;
y: CHAR <* bytealignment(1024) *> ;
END ;
VAR
r: rec ;
BEGIN
IF ADR(r.y) MOD 1024=0
THEN
exit(0)
ELSE
exit(1)
END
END align5.
In the example below module align6
declares foo
as an
array of 256 INTEGER
s. The array foo
is aligned on a
1024 byte boundary.
MODULE align6 ;
FROM SYSTEM IMPORT ADR ;
FROM libc IMPORT exit ;
TYPE
foo = ARRAY [0..255] OF INTEGER <* bytealignment(1024) *> ;
VAR
x : CHAR ;
z : foo ;
BEGIN
IF ADR(z) MOD 1024=0
THEN
exit(0)
ELSE
exit(1)
END
END align6.