.appendix Customizing the C Compiler .title Customizing the C Compiler .page .c Customizing the C Compiler .c -------------------------- .bl 1 .i 5 Compiling a C program requires running three compiler passes. The output of the compiler is assembly language, which must be assembled and linked with the C library to produce a runnable program. The amount of disk storage required for the compiler, assembler, and linker load modules, the C library, and the system include files is non-trivial. This appendix contains a discussion of compiler operation, as well as some suggestions for minimizing the disk storage requirements for the compilation process. .subtitle Compiler operation .hl 1 Compiler operation .i 5 The C compiler consists of three components: the Preprocessor (CP68), the Parser (C068), and the Code Generator (C168). The assembler (AS68) and linker (LO68) are also used in generating an executable program. These components are operated as follows: .ls .lec'CP68'The preprocessor is invoked to take the original source file and produce a file with all '_#define' and '_#include' statements resolved. The command line is: .bl 1 .i 8 CP68 [-I d:] file.C file.I .bl 1 The "-I" flag is used to indicate that the next argument is a CP/M drive specification. This drive will be used for all library include statements -- those of the form '_#include '. Drive specifications may also appear in the filename portion of a '_#include' statement, but this procedure is not recommended. "file.C" is the source file, and "file.I" is the output file. .lec'C068'The parser takes the file produced by the and creates an intermediate code file. The command line is: .bl 1 .i 8 C068 file.I file.IC file.ST .bl 1 "file.I" is the output from the preprocessor. "file.IC" is the intermediate code file for use by C168. "file.ST" is a temporary file used to collect constant data for inclusion at the end of the intermediate code file. .lec'C168'The code generator takes the intermediate code file from C068 and produces an assembly-language source file. The command line is: .bl 1 .i 8 C168 file.IC file.S [-LD] .bl 1 "file.IC" is the intermediate code output from C068. "file.S" is the assembly language output file. The "-L" flag is used to indicate that the compilation is to assume all address variables are 32 bits. Default is 16 bit addresses. The "-D" flag causes the compiler to include the line numbers from the source file (file.C) as comments in the generated assembly language. This can be very useful for debugging. .lec'AS68'The assembler is used to translate the compiler output to a form suitable for use by the linkage editor. The command line is: .bl 1 .i 8 AS68 -L -U [-F d:] [-S d:] file.S .bl 1 The "-L" option is used to indicate that addresses are to be considered 32 bit quantities. The "-U" option means that undefined symbols are to be considered external references. The "-F" option specifies a drive to be used for the assembler's temporary files. The "-S" option specifies a drive to be used for the assembler's initialization file "AS68SYMB.DAT". "file.S" is the output of C168, and "file.O" is produced by the assembler. .lec'LO68'The linker is used to produce an executable file from the output of one or more assembler runs. A startup file and the C library must also be included when linking C programs. The linker command line is: .bl 1 .i 8 LO68 -R [-F d:] -O file.68K S.O file.O CLIB .bl 1 The "-R" option specifies that the file is to be relocatable. Relocatable files may be run on any CP/M-68K system. The "-F" option allows placing the linker temporary files on a disk drive other than the default. The "-O file.68K" construct causes the linker to place the executable output in "file.68K". "S.O" is the runtime startup routine. This file must be included as the first file in every C program link. "file.O" is the output of the assembler. Multiple files may be specified between "S.O" and "CLIB" if separate compilation is desired. "CLIB" is the C library file. .els .subtitle Supplied SUBMIT files .hl 1 Supplied SUBMIT files .i 5 CP/M-68K includes two files, "C.SUB" and "CLINK.SUB", which may be used to compile and link (respectively) a C program. The use of these files is described in Chapter 1 under "Operating Instructions". It may be desirable, however, to edit these files to specify different disk drives for any of the following items: .bl 1 .ls .leb;The disk drive on which the compiler passes, assembler and linker reside. .leb;The disk drive which is referenced by '_#include ' statements in the C preprocessor. .leb;The disk drive on which the assembler initialization file is kept. .leb;The disk drive on which the assembler and linker create temporary files. .leb;The disk drive on which the C library file is kept. .els The default drive is currently used for all of the above items. .subtitle Disk Space Optimization .hl 1 Disk Space Optimization .i 5 In situations where disk space is at a premium, several things can be done to minimize diskette shuffling: .ls .leb;Use the "reloc" utility on all load modules which are to be used: the compiler, assembler, linker, and editor. This will significantly reduce file size and load time. .leb;Place all of the load modules on one disk, and use a second disk for sources and temporary files. This requires at least two drives. .leb;On single density diskette systems, it will be necessary to place the C library file and linker on a separate diskette, and to make a diskette swap before linking. .els .subtitle Speed Optimization .hl 1 Speed Optimization .i 5 In addition to the items listed above, it is possible to make the compilation process faster by: .ls .leb;Putting the assembler temp files on a different drive from the source and object files. .leb;Putting the linker temp files on a different drive from the object input, C library, and load module output. .leb;Using the linker "-S" (Suppress symbol table), and "-T" (absolute load module) switches in place of the "-R" flag. Note that the resulting program will not run on an arbitrary CP/M-68K system if this is done. .els