COHERENT manpages

This page displays the COHERENT manpage for #pragma [Perform implementation-specific preprocessing].

List of available manpages
Index


#pragma -- Preprocessing Directive

Perform implementation-specific preprocessing

#pragma  is the  C  preprocessing directive  that triggers  implementation-
specific  behavior.   The  ANSI  Standard  demands  that  every  conforming
implementation of C document what #pragma does.

COHERENT recognizes one use of #pragma:

    #pragma align [n]

This   directive  permits   COHERENT  to  conform   to  the   Intel  Binary
Compatability  Standard (BCS), which  specifies alignment  requirements for
structs.

The BCS  requires that a struct be aligned  consistently with the alignment
of its most strictly aligned member.  For example, the structure

    struct s {
        short   s_s1;
        int s_i;
        short   s_s2;
    };

must put member s_i at offset  4, not 2 (because int is dword-aligned).  If
you have an array of struct s objects, the second will be at offset 12, not
10 (or 8), because struct s itself must also be dword-aligned.

This, unfortunately, creates problems with existing compiled code, and with
some standards, e.g., COFF.  For  example, a struct filsys (a COHERENT file
system, e.g., on a floppy  or hard disk) is defined in <sys/filsys.h>
as starting out just like the above:

    struct filsys {
        unsigned short  s_isize;
        daddr_t     s_fsize;
        short       s_nfree;
        ...
    };

Because daddr_t  is long,  COHERENT would compile  this and expect  to find
s_fsize at  offset 4 (not 2)  and s_nfree at offset 8 (not  6); but this is
not  where the  bits  actually fall  on  an existing  file  system.  So  we
circumvent the BCS with #pragma  align. The directive #pragma align n means
``align objects  on n-byte boundaries,  at most,'' and  #pragma align means
``restore  default  alignment.'' Thus,  <sys/filsys.h>  is edited  to
read:

    struct filsys {
        unsigned short  s_isize;
    #pragma align 2
        daddr_t     s_fsize;
    #pragma align
        short       s_nfree;
        ...
    };

and the  compiler thinks  the struct  members fall at  offsets 0, 2  and 6,
which preserves compatibility with existing binary objects.

See Also

cpp,
C preprocessor
ANSI Standard, §6.8.6