GNU Modula-2 allows you to specify alignment for types and variables. The syntax is similar to GCC and uses the __ATTRIBUTE__ mechanism. The ebnf of the alignment production is:
Alignment := [ "__ATTRIBUTE__" "(" "(" ALIGNED "(" 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 __ATTRIBUTE__ ((ALIGNED(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 __ATTRIBUTE__ ((ALIGNED(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 __ATTRIBUTE__ ((ALIGNED(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 __ATTRIBUTE__ ((ALIGNED(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 __ATTRIBUTE__ ((ALIGNED(1024))) ;
VAR
x : CHAR ;
z : foo ;
BEGIN
IF ADR(z) MOD 1024=0
THEN
exit(0)
ELSE
exit(1)
END
END align6.