123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323 |
- .\" $Header$
- .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).
|