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 construction 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 INTEGERs. 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.