319 lines
8.5 KiB
Plaintext
319 lines
8.5 KiB
Plaintext
.\" $Header$
|
|
.ll 72
|
|
.nr ID 4
|
|
.de hd
|
|
'sp 2
|
|
'tl ''-%-''
|
|
'sp 3
|
|
..
|
|
.de fo
|
|
'bp
|
|
..
|
|
.tr ~
|
|
. TITLE
|
|
.de TL
|
|
.sp 15
|
|
.ce
|
|
\\fB\\$1\\fR
|
|
..
|
|
. AUTHOR
|
|
.de AU
|
|
.sp 15
|
|
.ce
|
|
by
|
|
.sp 2
|
|
.ce
|
|
\\$1
|
|
..
|
|
. DATE
|
|
.de DA
|
|
.sp 3
|
|
.ce
|
|
( Dated \\$1 )
|
|
..
|
|
. INSTITUTE
|
|
.de VU
|
|
.sp 3
|
|
.ce 4
|
|
Wiskundig Seminarium
|
|
Vrije Universteit
|
|
De Boelelaan 1081
|
|
Amsterdam
|
|
..
|
|
. PARAGRAPH
|
|
.de PP
|
|
.sp
|
|
.ti +\n(ID
|
|
..
|
|
.nr CH 0 1
|
|
. CHAPTER
|
|
.de CH
|
|
.nr SH 0 1
|
|
.bp
|
|
.in 0
|
|
\\fB\\n+(CH.~\\$1\\fR
|
|
.PP
|
|
..
|
|
. SUBCHAPTER
|
|
.de SH
|
|
.sp 3
|
|
.in 0
|
|
\\fB\\n(CH.\\n+(SH.~\\$1\\fR
|
|
.PP
|
|
..
|
|
. INDENT START
|
|
.de IS
|
|
.sp
|
|
.in +\n(ID
|
|
..
|
|
. INDENT END
|
|
.de IE
|
|
.in -\n(ID
|
|
.sp
|
|
..
|
|
.de PT
|
|
.ti -\n(ID
|
|
.ta \n(ID
|
|
.fc " @
|
|
"\\$1@"\c
|
|
.fc
|
|
..
|
|
. DOUBLE INDENT START
|
|
.de DS
|
|
.sp
|
|
.in +\n(ID
|
|
.ll -\n(ID
|
|
..
|
|
. DOUBLE INDENT END
|
|
.de DE
|
|
.ll +\n(ID
|
|
.in -\n(ID
|
|
.sp
|
|
..
|
|
. EQUATION START
|
|
.de EQ
|
|
.sp
|
|
.nf
|
|
..
|
|
. EQUATION END
|
|
.de EN
|
|
.fi
|
|
.sp
|
|
..
|
|
. ITEM
|
|
.de IT
|
|
.sp
|
|
.in 0
|
|
\\fB~\\$1\\fR
|
|
.ti +5
|
|
..
|
|
.de CS
|
|
.br
|
|
~-~\\
|
|
..
|
|
.br
|
|
.fi
|
|
.TL "Ack-C reference manual"
|
|
.AU "Ed Keizer"
|
|
.DA "September 12, 1983"
|
|
.VU
|
|
.wh 0 hd
|
|
.wh 60 fo
|
|
.CH "Introduction"
|
|
The C frontend included in the Amsterdam Compiler Kit
|
|
translates UNIX-V7 C into compact EM code [1].
|
|
The language accepted is described in [2] and [3].
|
|
This document describes which implementation dependent choices were
|
|
made in the Ack-C frontend and
|
|
some restrictions and additions.
|
|
.CH "The language"
|
|
.PP
|
|
Under the same heading as used in [2] we describe the
|
|
properties of the Ack-C frontend.
|
|
.IT "2.2 Identifiers"
|
|
External identifiers are unique up to 7 characters and allow
|
|
both upper and lower case.
|
|
.IT "2.4.3 Character constants"
|
|
The ASCII-mapping is used when a character is converted to an
|
|
integer.
|
|
.IT "2.4.4 Floating constants"
|
|
To prevent loss of precision the compiler does not perform
|
|
floating point constant folding.
|
|
.IT "2.6 Hardware characteristics"
|
|
The size of objects of the several arithmetic types and the two
|
|
pointer types depend on the EM-implementation used.
|
|
The ranges of the arithmetic types depend on the size used,
|
|
the C-frontend assumes two's complement representation for the
|
|
integral types. All sizes are multiples of bytes.
|
|
The calling program \fIack\fP[4] passes information about the
|
|
size of the types to the compiler proper.
|
|
.br
|
|
However, a few general remarks must be made:
|
|
.sp 1
|
|
.IS
|
|
.PT (a)
|
|
Two different pointer types exist: pointers to data and
|
|
pointers to functions.
|
|
The latter type is twice as large as the former.
|
|
Pointers to functions use the same format as Pascal procedure
|
|
parameters, thereby allowing C to use Pascal procedure
|
|
parameters and vice-versa.
|
|
The extra information passed indicates the scope level of the
|
|
procedure.
|
|
.PT (b)
|
|
The size of pointers to data is a multiple of
|
|
(or equal to) the size of an \fIint\fP.
|
|
.PT (c)
|
|
The following relations exist for the sizes of the types
|
|
mentioned:
|
|
.br
|
|
.ti +5
|
|
\fIchar<=short<=int<=long\fP
|
|
.PT (d)
|
|
Objects of type \fIchar\fP use one 8-bit byte of storage,
|
|
although several bytes are allocated sometimes.
|
|
.PT (e)
|
|
All sizes are in multiples of bytes.
|
|
.PT (f)
|
|
Most EM implementations use 4 bytes for floats and 8 bytes
|
|
for doubles, but exceptions to this rule occur.
|
|
.IE
|
|
.IT "6.1 Characters and integers"
|
|
Objects of type \fIchar\fP are unsigned and do not cause
|
|
sign-extension when converted to \fIint\fP.
|
|
The range of characters values is from 0 to 255.
|
|
.IT "6.3 Floating and integral"
|
|
Floating point numbers are truncated towards zero when
|
|
converted to the integral types.
|
|
.IT "6.4 Pointers and integers"
|
|
When a \fIlong\fP is added to or subtracted from a pointer and
|
|
longs are larger then data pointers the \fIlong\fP is converted to an
|
|
\fIint\fP before the operation is performed.
|
|
.IT "8.5 Structure and union declarations"
|
|
The only type allowed for fields is \fIint\fP.
|
|
Fields with exactly the size of \fIint\fP are signed,
|
|
all other fields are unsigned.
|
|
.br
|
|
The size of any single structure must be less then 4096 bytes.
|
|
.IT "8.6 Initialization"
|
|
Initialization of structures containing bit fields is not
|
|
allowed.
|
|
There is one restriction when using an 'address expression' to initialize
|
|
an integral variable.
|
|
The integral variable must have the size of a data pointer.
|
|
Conversions altering the size of the address expression are not allowed.
|
|
.IT "10.1 External function definitions"
|
|
The total amount for storage used for parameters
|
|
in any function must be less then 4096 bytes.
|
|
The same holds for the total amount of storage occupied by the
|
|
automatic variables declared inside any function.
|
|
.sp
|
|
Using formal parameters whose size is smaller the the size of an int
|
|
is less efficient on several machines.
|
|
At procedure entry these parameters are converted from integer to the
|
|
declared type, because the compiler doesn't know where the least
|
|
significant bytes are stored in the int.
|
|
.IT "11.2 Scope of externals"
|
|
Most C compilers are rather lax in enforcing the restriction
|
|
that only one external definition without the keyword
|
|
\fIextern\fP is allowed in a program.
|
|
The Ack-C frontend is very strict in this.
|
|
The only exception is that declarations of arrays with a
|
|
missing first array bounds expression are regarded to have an
|
|
explicit keyword \fIextern\fP.
|
|
.IT "14.4 Explicit pointer conversions"
|
|
Pointers may be larger the ints, thus assigning a pointer to an
|
|
int and back will not always result in the same pointer.
|
|
The process mentioned above works with integrals
|
|
of the same size or larger as pointers in all EM implementations
|
|
having such integrals.
|
|
Note that pointers to functions have
|
|
twice the size of pointers to data.
|
|
When converting data pointers to an integral type or vice-versa,
|
|
the pointers is seen as an unsigned with the same size a data-pointer.
|
|
When converting function pointers to anything else the static link part
|
|
of the pointer is discarded,
|
|
the resulting value is treated as if it were a data pointer.
|
|
When converting a data pointer or object of integral type to a function pointer
|
|
a static link with the value 0 is added to complete the function pointer.
|
|
.br
|
|
EM guarantees that any object can be placed at a word boundary,
|
|
this allows the C-programs to use \fIint\fP pointers
|
|
as pointers to objects of any type not smaller than an \fIint\fP.
|
|
.CH "Frontend options"
|
|
The C-frontend has a few options, these are controlled
|
|
by flags:
|
|
.IS
|
|
.PT -V
|
|
This flag is followed by a sequence of letters each followed by
|
|
positive integers. Each letter indicates a
|
|
certain type, the integer following it specifies the size of
|
|
objects of that type. One letter indicates the wordsize used.
|
|
.IS
|
|
.sp 1
|
|
.TS
|
|
center tab(:);
|
|
l l16 l l.
|
|
letter:type:letter:type
|
|
|
|
w:wordsize:i:int
|
|
s:short:l:long
|
|
f:float:d:double
|
|
p:pointer::
|
|
.TE
|
|
.sp 1
|
|
All existing implementations use an integer size equal to the
|
|
wordsize.
|
|
.IE
|
|
The calling program \fIack\fP[4] provides the frontend with
|
|
this flag, with values depending on the machine used.
|
|
.sp 1
|
|
.PT -l
|
|
The frontend normally generates code to keep track of the line
|
|
number and source file name at runtime for debugging purposes.
|
|
Currently a pointer to a
|
|
string containing the filename is stored at a fixed place in
|
|
memory at each function
|
|
entry and the line number at the start of every expression.
|
|
At the return from a function these memory locations are not reset to
|
|
the values they had before the call.
|
|
Most library routines do not use this feature and thus do not
|
|
ruin the current line number and filename when called.
|
|
However, you are really unlucky when your program crashes due
|
|
to a bug in such a library function, because the line number
|
|
and filename do not indicate that something went wrong inside
|
|
the library function.
|
|
.br
|
|
Providing the flag -l to the frontend tells it not to generate
|
|
the code updating line number and file name.
|
|
This is, for example, used when translating the stdio library.
|
|
.br
|
|
When the \fIack\fP[4] is called with the -L flag it provides
|
|
the frontend with this flag.
|
|
.sp 1
|
|
.PT -Xp
|
|
When this flag is present the frontend generates a call to
|
|
the function \fBprocentry\fP at each function entry and a
|
|
call to \fBprocexit\fP at each function exit.
|
|
Both functions are provided with one parameter,
|
|
a pointer to a string containing the function name.
|
|
.br
|
|
When \fIack\fP is called with the -p flag it provides the
|
|
frontend with this flag.
|
|
.IE
|
|
.CH References
|
|
.IS
|
|
.PT [1]
|
|
A.S. Tanenbaum, Hans van Staveren, Ed Keizer and Johan
|
|
Stevenson \fIDescription of a machine architecture for use with
|
|
block structured languages\fP Informatica report IR-81.
|
|
.sp 1
|
|
.PT [2]
|
|
B.W. Kernighan and D.M. Ritchie, \fIThe C Programming
|
|
language\fP, Prentice-Hall, 1978
|
|
.PT [3]
|
|
D.M. Ritchie, \fIC Reference Manual\fP
|
|
.sp
|
|
.PT [4]
|
|
UNIX manual ack(I).
|