324 lines
		
	
	
	
		
			8.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			324 lines
		
	
	
	
		
			8.2 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
.\" $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.3 Keywords"
 | 
						|
The word \fBvoid\fP is also reserved as a keyword.
 | 
						|
.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 
 | 
						|
pointers 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)
 | 
						|
The size of pointers is a multiple of
 | 
						|
(or equal to) the size of an \fIint\fP.
 | 
						|
.PT (b)
 | 
						|
The following relations exist for the sizes of the types
 | 
						|
mentioned:
 | 
						|
.br
 | 
						|
.ti +5
 | 
						|
\fIchar<=short<=int<=long\fP
 | 
						|
.PT (c)
 | 
						|
Objects of type \fIchar\fP use one 8-bit byte of storage,
 | 
						|
although several bytes are allocated sometimes.
 | 
						|
.PT (d)
 | 
						|
All sizes are in multiples of bytes.
 | 
						|
.PT (e)
 | 
						|
Most EM implementations use 4 bytes for floats and 8 bytes
 | 
						|
for doubles, but exceptions to this rule occur.
 | 
						|
.IE
 | 
						|
.IT "4 What's in a name"
 | 
						|
The type \fIvoid\fP is added.
 | 
						|
Objects of type void do not exist.
 | 
						|
Functions declared as returning void, do not return a value at all.
 | 
						|
.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 pointers the \fIlong\fP is converted to an
 | 
						|
\fIint\fP before the operation is performed.
 | 
						|
.IT "7.2 Unary operators"
 | 
						|
It is allowed to cast any expression to the type \fIvoid\fP.
 | 
						|
.IT "8.2 Type specifiers"
 | 
						|
One type is added to the type-specifiers:
 | 
						|
.br
 | 
						|
.IS
 | 
						|
void
 | 
						|
.IE
 | 
						|
.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 same size as a pointer.
 | 
						|
Conversions altering the size of the address expression are not allowed.
 | 
						|
.IT "9.10 Return statement"
 | 
						|
Return statements of the form:
 | 
						|
.IS
 | 
						|
	return ;
 | 
						|
.IE
 | 
						|
are the only form of return statement allowed in a function of type
 | 
						|
function returning void.
 | 
						|
.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.
 | 
						|
When converting pointers to an integral type or vice-versa,
 | 
						|
the pointers is seen as an unsigned int.
 | 
						|
.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).
 |