Annotation of researchv10no/cmd/lcc/etc/install.tex, revision 1.1.1.1

1.1       root        1: \documentstyle[11pt]{article}
                      2: 
                      3: \title{Installing lcc}
                      4: 
                      5: \author{Christopher W. Fraser\\
                      6: AT\&T Bell Laboratories, 600 Mountain Avenue,\\
                      7: Murray Hill, NJ 07974
                      8: \and
                      9: David R. Hanson\\
                     10: Department of Computer Science, Princeton University,\\
                     11: Princeton, NJ 08544}
                     12: 
                     13: \date{August 24, 1990}
                     14: 
                     15: \begin{document}
                     16: 
                     17: \maketitle
                     18: 
                     19: \section{Introduction}
                     20: 
                     21: \verb|lcc| is a retargetable compiler for C as defined
                     22: by the ANSI Standard X3.159--1989.
                     23: \verb|lcc| is in production use
                     24: at Princeton University and AT\&T Bell Laboratories.
                     25: When used with a conforming preprocessor and library,
                     26: \verb|lcc| passes the conformance section of Version 2.00 of the Plum-Hall
                     27: Validation Suite for ANSI~C, except that it
                     28: does not detect underflow/overflow in constant expressions.
                     29: 
                     30: Extract the distribution into its own directory.
                     31: All paths below are relative to this directory.
                     32: 
                     33: All distributions include the following top-level directories;
                     34: ``front-end'' distributions include {\em only} these directories.
                     35: 
                     36: \begin{center}
                     37: \begin{tabular}{ll}
                     38: \tt c          & front end \\
                     39: \tt etc                & driver, man page, this document \\
                     40: \tt include    & ANSI include files \\
                     41: \tt tst                & test suite \\
                     42: \tt gen0       & ``symbolic'' code generator \\
                     43: \end{tabular}
                     44: \end{center}
                     45: ``Front-end'' distributions include no code generators
                     46: and only Section~6 of this document applies.
                     47: 
                     48: ``Full'' distributions include code generators for the VAX, MIPS,
                     49: and Motorola 68020 with the 68881 floating-point co-processor.
                     50: These distributions add the following top-level directories.
                     51: 
                     52: \begin{center}
                     53: \begin{tabular}{ll}
                     54: \tt gen2       & production code generators \\
                     55: \tt gen3       & demonstration VAX code generator \\
                     56: \end{tabular}
                     57: \end{center}
                     58: 
                     59: Installation of a production compiler
                     60: involves three steps performed in the following order.
                     61: \begin{enumerate}
                     62: \item Decide where to install the man page, the include files,
                     63: the compiler, and \verb|lcc|, the driver program; see Section~2.
                     64: 
                     65: \item Install a host-specific driver; see Section~3.
                     66: 
                     67: \item Install a host- and target-specific compiler; see Section~4.
                     68: \end{enumerate}
                     69: 
                     70: \verb|c/version.h| identifies the version of the distribution
                     71: as {\tt (($x$<<8)|$y$)} for version {\tt $x$.$y$},
                     72: and \verb|LOG| describes the changes from the previous version.
                     73: 
                     74: 
                     75: \section{Paths}
                     76: 
                     77: Installation consists of three files and one directory;
                     78: these are summarized below along with paths used in typical installations.
                     79: 
                     80: \begin{center}
                     81: \begin{tabular}{ll}
                     82: \tt /usr/local/man/man1/lcc.1  & the man page \\
                     83: \tt /usr/local/lib/rcc         & the compiler \\
                     84: \tt /usr/local/bin/lcc         & the driver \\
                     85: \tt /usr/local/include/ansi    & include files (a directory) \\
                     86: \end{tabular}
                     87: \end{center}
                     88: 
                     89: These files can be placed in other, site-specific locations,
                     90: but the compiler should be named \verb|rcc|.
                     91: If the driver isn't named \verb|lcc|, edit the man page (\verb|etc/lcc.1|).
                     92: 
                     93: Include files are in directories named \verb|include/|{\it target}\verb|_|{\it system},
                     94: where {\it target\/} is one of \verb|mips|, \verb|mc|, \verb|vax|, or \verb|sparc|,
                     95: and {\it system\/} is one of
                     96: \verb|bsd| (4.3BSD UNIX),
                     97: \verb|ultrix| (ULTRIX 3.0),
                     98: \verb|mips| (RISC/os 4.0),
                     99: \verb|sun| (SUNOS 4.0), and
                    100: \verb|iris| (IRIX System V Release 3.2).
                    101: Not all combinations of {\it target}, {\it system\/} are provided
                    102: and many don't make sense.
                    103: Choose the include files that are appropriate for your system,
                    104: or make a copy of a closely related set and edit them.
                    105: 
                    106: For example, if the paths shown above are chosen and if
                    107: \verb|include/vax_ultrix| has the appropriate include files,
                    108: install the man page and include files by
                    109: \begin{verbatim}
                    110: $ cp etc/lcc.1 /usr/local/man/man1
                    111: $ cp include/vax_ultrix/*.h /usr/local/include/ansi
                    112: \end{verbatim}
                    113: 
                    114: 
                    115: \section{Installing the Driver}
                    116: 
                    117: The preprocessor, compiler, assembler, and loader are
                    118: invoked by a driver program, \verb|lcc|, which is similar
                    119: to \verb|cc| on most systems. It's described in the man page
                    120: \verb|etc/lcc.1|.
                    121: The driver is built by combining the host-independent
                    122: part, \verb|etc/lcc.c|, with a small host-specific part.
                    123: By convention, host-specific parts are named {\it hostname}\verb|.c|,
                    124: where {\it hostname\/} is the local name for the host on which \verb|lcc|
                    125: is being installed. \verb|etc| holds many examples.
                    126: Comments in most give the details of the
                    127: particular host; pick one that is closely related to your host,
                    128: copy it to \verb|etc/|{\it yourhostname}\verb|.c|,
                    129: and edit it as described below.
                    130: You should not have to edit \verb|etc/lcc.c|.
                    131: 
                    132: Debug your version of the driver by running it
                    133: with the \verb|-v -v| options, which cause it to echo the
                    134: commands it would execute, but not to execute them.
                    135: 
                    136: Here's \verb|etc/ffserver.c|, which we'll use as an example
                    137: in describing how to edit a host-specific part.
                    138: This example illustrates all of the important features.
                    139: \begin{verbatim}
                    140: /* VAXes running UNIX 4.3BSD or ULTRIX at Princeton University */
                    141: 
                    142: #include <string.h>
                    143: 
                    144: char *cpp[] = { "/usr/gnu/lib/gcc-cpp", "-undef", "-Dvax",
                    145:         "$1", "$2", "$3", 0 };
                    146: char *include[] = { "-I/usr/local/include/ansi", 0 };
                    147: char *com[] = { "/usr/local/lib/rcc", "$1", "$2", "$3", 0 };
                    148: char *as[] = { "/bin/as", "-J", "-o", "$3", "$1", "$2", 0 };
                    149: char *ld[] = { "/bin/ld", "-o", "$3", "/lib/crt0.o", "-X",
                    150:         "$1", "$2", "", "-lm", "", "-lc", 0 };
                    151: 
                    152: int option(arg) char *arg; {
                    153:         if (strcmp(arg, "-g") == 0)
                    154:                 ld[9]  = "-lg";
                    155:         else if (strcmp(arg, "-p") == 0) {
                    156:                 ld[3]  = "/lib/mcrt0.o";
                    157:                 ld[10] = "-lc_p";
                    158:         } else if (strcmp(arg, "-pg") == 0) {
                    159:                 ld[3]  = "/usr/lib/gcrt0.o";
                    160:                 ld[10] = "-lc_p";
                    161:         } else if (strcmp(arg, "-b") == 0
                    162:         && access("/usr/local/lib/bbexit.o", 4) == 0)
                    163:                 ld[7]  = "/usr/local/lib/bbexit.o";
                    164:         else
                    165:                 return 0;
                    166:         return 1;
                    167: }
                    168: \end{verbatim}
                    169: 
                    170: Most of the host-specific code is data that
                    171: gives prototypes for the commands that invoke
                    172: the preprocessor, compiler, assembler, and loader.
                    173: Each command prototype is an array of pointers to strings
                    174: terminated with a null pointer;
                    175: the first string is the full path name of the command and the others
                    176: are the arguments or argument placeholders, which are described below.
                    177: 
                    178: The \verb|cpp| array gives the command for running the preprocessor.
                    179: \verb|lcc| is intended to be used with an ANSI preprocessor,
                    180: such as the GNU C preprocessor available from the Free Software Foundation.
                    181: If the GNU preprocessor is used,
                    182: it must be named \verb|gcc-cpp| in order for \verb|lcc|'s \verb|-N| option
                    183: to work correctly.
                    184: 
                    185: Literal arguments specified in prototype, e.g., \verb|"-Dvax"| in
                    186: the \verb|cpp| command above, are passed to the command as given.
                    187: 
                    188: The strings \verb|"$1"|, \verb|"$2"|, and \verb|"$3"| in
                    189: prototypes are placeholders for {\em lists} of arguments that
                    190: are substituted in a copy of the prototype before the command is executed.
                    191: \verb|$1| is replaced by the {\em options} specified by the user;
                    192: for the preprocessor, this list always contains at least
                    193: \verb|-Dunix| and \verb|-D__LCC__|.
                    194: \verb|$2| is replaced by the {\em input} files,
                    195: and \verb|$3| is replaced by the {\em output} file.
                    196: 
                    197: Zero-length arguments after replacement are removed from
                    198: the argument list before the command is invoked. So, e.g.,
                    199: if the preprocessor is invoked without an output file,
                    200: \verb|"$3"| becomes \verb|""|, which is removed from the final argument list.
                    201: 
                    202: For example, to specify a preprocessor command prototype to invoke
                    203: \verb|/bin/cpp| with the options \verb|-Dvax| and \verb|-Dultrix|,
                    204: the \verb|cpp| array would be
                    205: \begin{verbatim}
                    206: char *cpp[] = { "/bin/cpp", "-Dvax", "-Dultrix",
                    207:         "$1", "$2", "$3", 0 };
                    208: \end{verbatim}
                    209: 
                    210: The \verb|include| array is a list of \verb|-I| options that
                    211: specify which directives should be searched to satisfy include directives.
                    212: These directories are searched in the order given.
                    213: The first directory should be the one to which the ANSI
                    214: header files were copied in Section~2.
                    215: The driver adds these options to \verb|cpp|'s arguments
                    216: when it invokes the preprocessor.
                    217: 
                    218: \verb|com| gives the command for invoking the compiler.
                    219: This prototype can appear exactly as shown above, except
                    220: that the command name should be edited to reflect the
                    221: location of the compiler chosen in Section~2.
                    222: 
                    223: \verb|as| gives the command for invoking the assembler.
                    224: 
                    225: \verb|ld| gives the command for invoking the loader.
                    226: For the other commands, the list \verb|$2| contains a single file;
                    227: for \verb|ld|, \verb|$2| contains all `.o' files and libraries, and
                    228: \verb|$3| is \verb|a.out|, unless the \verb|-o| option is specified.
                    229: As suggested in the code above, \verb|ld| must also specify
                    230: the appropriate startup code and default libraries.
                    231: 
                    232: The \verb|option| function is described below;
                    233: for now, use an existing \verb|option| function or one that returns \verb|0|.
                    234: 
                    235: After specifying the prototypes, compile the driver by
                    236: \begin{verbatim}
                    237: $ cd etc
                    238: $ make HOST=ffserver
                    239: \end{verbatim}
                    240: where \verb|ffserver| is replaced by {\it yourhostname}.
                    241: Run the resulting \verb|a.out| with the options \verb|-v -v|
                    242: to display the commands that would be executed, e.g.,
                    243: \begin{verbatim}
                    244: $ a.out -v -v foo.c baz.c mylib.a -lcurses
                    245: a.out version 1.2
                    246: foo.c:
                    247: /usr/gnu/lib/gcc-cpp -undef -Dvax -Dunix -D__LCC__ -v
                    248:     -I/usr/local/include/ansi foo.c |
                    249:     /usr/local/lib/rcc -v - /tmp/lcc00024.s
                    250: /bin/as -J -o foo.o /tmp/lcc00024.s
                    251: baz.c:
                    252: /usr/gnu/lib/gcc-cpp -undef -Dvax -Dunix -D__LCC__ -v
                    253:     -I/usr/local/include/ansi baz.c |
                    254:     /usr/local/lib/rcc -v - /tmp/lcc00024.s
                    255: /bin/as -J -o baz.o /tmp/lcc00024.s
                    256: /bin/ld -o a.out /lib/crt0.o -X foo.o baz.o mylib.a
                    257:     -lcurses -lm -lc
                    258: rm /tmp/lcc00024.s
                    259: \end{verbatim}
                    260: Leading spaces indicate lines that have been folded manually to fit this page.
                    261: Note the use of a pipeline to connect the preprocessor and compiler.
                    262: \verb|lcc| arranges this pipeline itself; it does not call the shell.
                    263:  
                    264: As the output shows, \verb|lcc| places temporary files in \verb|/tmp|.
                    265: Alternatives can be specified by defining \verb|TEMPDIR| in \verb|CFLAGS|
                    266: when making the driver, e.g.,
                    267: \begin{verbatim}
                    268: $ make CFLAGS='-DTEMPDIR=\"/usr/tmp\"' HOST=ffserver
                    269: \end{verbatim}
                    270: causes \verb|lcc| to place temporary files in \verb|/usr/tmp|.
                    271: 
                    272: Once the driver is completed, install it by
                    273: \begin{verbatim}
                    274: $ cp a.out /usr/local/bin/lcc
                    275: \end{verbatim}
                    276: where the destination is the location chosen for \verb|lcc| in Section~2.
                    277: 
                    278: The \verb|option| function is called for the options
                    279: \verb|-g|, \verb|-p|, \verb|-pg|, and \verb|-b| because these compiler options might
                    280: also affect the loader's arguments. For these options,
                    281: the driver calls \verb|option(arg)| to give the host-specific
                    282: code an opportunity to edit the \verb|ld| prototype, if necessary.
                    283: \verb|option| can change \verb|ld|, if necessary, and return \verb|1| to
                    284: announce its acceptance of the option. If the option
                    285: is unsupported, \verb|option| should return \verb|0|.
                    286: 
                    287: For example, in response to \verb|-g|, the \verb|option| function shown above
                    288: changes \verb|ld[9]| from \verb|""| to \verb|"-lg"|, which causes
                    289: a debugging library to be loaded. If \verb|-g| is not specified,
                    290: the \verb|""| argument is omitted from the \verb|ld| command
                    291: because it's empty.
                    292: 
                    293: Likewise, the \verb|-pg| causes \verb|option| to change the name
                    294: of the startup code and the name of the default C library. Note that
                    295: \verb|option| has been written to support simultaneous use
                    296: of \verb|-g| and \verb|-pg|, e.g.,
                    297: \begin{verbatim}
                    298: $ a.out -v -v -g -pg foo.o baz.o -o myfoo
                    299: a.out version 1.2
                    300: /bin/ld -o myfoo /usr/lib/gcrt0.o -X foo.o baz.o -lm -lg -lc_p
                    301: rm /tmp/lcc00660.s
                    302: \end{verbatim}
                    303: 
                    304: To support Sun's \verb|-f68881| option, the driver also
                    305: passes any option beginning with \verb|-f| to \verb|option|.
                    306: 
                    307: The option \verb|-Wo|{\it arg\/} causes the driver to pass {\it arg\/}
                    308: to \verb|option|. Such options have no other effect; this mechanism
                    309: is provide to support system-specific options that affect the
                    310: commands executed by the driver.
                    311: 
                    312: The \verb|-b| option causes the compiler to generate
                    313: code to count the number of times each expression is executed.
                    314: The \verb|exit| function in \verb|etc/bbexit.c| writes these
                    315: counts to \verb|prof.out| when the program terminates.
                    316: If \verb|option| is called with \verb|-b|,
                    317: it must edit the \verb|ld| command accordingly,
                    318: as shown above. This version of \verb|option| uses
                    319: the \verb|access| system call to insure that \verb|bbexit.o| is installed before
                    320: editing the \verb|ld| command. To install \verb|bbexit.o| execute
                    321: \begin{verbatim}
                    322: $ make bbexit.o
                    323: $ cp bbexit.o /usr/local/lib/bbexit.o
                    324: \end{verbatim}
                    325: If necessary, change \verb|/usr/local/lib| to reflect local conventions.
                    326: The \verb|exit| function in \verb|etc/bbexit.c| works on the
                    327: systems listed in \S2, but may need to be modified for other systems.
                    328: 
                    329: If \verb|option| supports \verb|-b|, you should also
                    330: install \verb|etc/bprint.c|, which reads \verb|prof.out|
                    331: and generates a listing annotated with execution counts.
                    332: After \verb|lcc| is installed, install \verb|bprint| with the commands
                    333: \begin{verbatim}
                    334: $ make bbexit.o bprint
                    335: $ cp bprint /usr/local/bin/bprint
                    336: $ cp bprint.1 /usr/local/man/man1
                    337: \end{verbatim}
                    338: The \verb|makefile| uses \verb|lcc| to compile \verb|bprint.c|;
                    339: you must use \verb|lcc| or another ANSI~C compiler
                    340: because \verb|bprint.c| is written in ANSI~C.
                    341: \verb|bprint.c| includes \verb|"../c/profio.c"|, so it must
                    342: be compiled in \verb|etc|.
                    343: 
                    344: To complete the driver,
                    345: write an appropriate \verb|option| function for your system,
                    346: and make and install the driver as described above.
                    347: 
                    348: 
                    349: \section{Installing a Production Compiler}
                    350: 
                    351: \verb|gen2| contains source code common to all of the production
                    352: code generators and directories for each of the supported targets:
                    353: 
                    354: \begin{center}
                    355: \begin{tabular}{ll}
                    356: \tt gen2/vax   & VAX code generator \\
                    357: \tt gen2/mips  & MIPS code generator \\
                    358: \tt gen2/mc    & Motorola 68020 \& 68881 code generator \\
                    359: \end{tabular}
                    360: \end{center}
                    361: 
                    362: A production compiler, \verb|rcc|, is built by compiling it
                    363: with the host C compiler and then using the result to re-compile itself.
                    364: A test suite is used to
                    365: verify that the compiler is working correctly.
                    366: The examples below use the VAX compiler to illustrate this process.
                    367: You must have the driver, \verb|lcc|, installed in order
                    368: to build and test \verb|rcc|.
                    369: If any of the steps below fail, contact us (see Section~7).
                    370: 
                    371: The \verb|makefile| runs the shell script
                    372: \verb|gen2/run| on each C program in the test suite, \verb|tst|.
                    373: The assignment to \verb|os| in \verb|gen2/run| indicates the target operating
                    374: system; edit this assignment if it's incorrect for your system.
                    375: 
                    376: To build a VAX \verb|rcc|, execute the commands
                    377: \begin{verbatim}
                    378: $ cd gen2/vax
                    379: $ make
                    380: \end{verbatim}
                    381: There may be a few warnings, but there should be no errors.
                    382: 
                    383: Once \verb|rcc| is built with the host C compiler,
                    384: run the test suite to verify that \verb|rcc| is working correctly:
                    385: \begin{verbatim}
                    386: $ make test
                    387: vax-bsd 8q:
                    388: vax-bsd array:
                    389: vax-bsd cf:
                    390: vax-bsd cq:
                    391: vax-bsd cvt:
                    392: vax-bsd fields:
                    393: vax-bsd front:
                    394: vax-bsd incr:
                    395: vax-bsd init:
                    396: vax-bsd paranoia:
                    397: 3456c3456
                    398: < .align 2; _881:.long 0xc5ac37a7,0x4788471b
                    399: ---
                    400: > .align 2; _881:.long 0xc5ac37a7,0x4784471b
                    401: 3674c3674
                    402: < .align 2; _72:.long 0xd70a3d23,0xa3d83d70
                    403: ---
                    404: > .align 2; _72:.long 0xd70a3d23,0xa3d73d70
                    405: 3688c3688
                    406: < .align 2; _14:.long 0x126e3b83,0x4fe0978d
                    407: ---
                    408: > .align 2; _14:.long 0x126e3b83,0x4fdf978d
                    409: vax-bsd sort:
                    410: vax-bsd spill:
                    411: vax-bsd stdarg:
                    412: vax-bsd struct:
                    413: vax-bsd switch:
                    414: vax-bsd wf1:
                    415: vax-bsd yacc:
                    416: \end{verbatim}
                    417: For each C program in the test suite,
                    418: \verb|gen2/run| compiles the program and uses \verb|diff|
                    419: to compare the generated assembly code
                    420: with the expected code (the expected VAX code for \verb|tst/8q.c| is
                    421: in \verb|gen2/vax/tst/8q.s.bak|, etc.). If there are differences, the script
                    422: executes the generated code with the input given in \verb|tst|
                    423: (the input for \verb|tst/8q.c| is in \verb|tst/8q.0|, etc.)
                    424: and compares the output with the expected output
                    425: (the expected output from \verb|tst/8q.c| on the VAX is
                    426: in \verb|gen2/vax/tst/8q.1|, etc.). The script also compares the
                    427: diagnostics from the compiler with the expected diagnostics.
                    428: 
                    429: As shown above, there may be a few differences between the generated code
                    430: and the expected code for the VAX.
                    431: These differences occur because the expected code is
                    432: generated by cross compilation
                    433: on a MIPS and the least-significant bits of some floating-point constants
                    434: differ from those bits in constants generated on a VAX.
                    435: There should be no differences in the output from executing the test programs.
                    436: 
                    437: If you edited the assignment to \verb|os| in \verb|gen2/run|,
                    438: a few differences may occur because of differences between the ANSI headers
                    439: for your system and those for the default system.
                    440: 
                    441: If your host is a little-endian MIPS, such as those from DEC,
                    442: there will be numerous differences (about 335 lines) because the expected code
                    443: is generated on a big-endian MIPS. Most of the differences
                    444: are in floating-point constants and data and instructions
                    445: concerning bit fields. It is easy to examine
                    446: the differences and verify that they are all due to the different
                    447: addressing order. Also, the output from \verb|tst/paranoia.c|
                    448: may differ trivially; if so, you'll need to \verb|make test| a second
                    449: time to finish the suite.
                    450: 
                    451: The \verb|vax-bsd| preceding the name of each test program in the output
                    452: above indicates a {\it target\/\it-system\/} combination, e.g.,
                    453: ``generating code for a \verb|vax| running the
                    454: \verb|bsd| operating system''.
                    455: 
                    456: Next, build \verb|rcc| again using the just-built \verb|rcc|:
                    457: \begin{verbatim}
                    458: $ make triple
                    459: rm -f *.o
                    460: make CC=lcc CFLAGS='-B./ -d0.1 -A -DPROTO -DENUMS' LDFLAGS='-s' rcc
                    461: lcc -c -B./ -d0.1 -A -DPROTO -DENUMS -I. -I.. -I../../c ../../c/dag.c
                    462: ...
                    463: lcc -s -o rcc dag.o ... sel.o
                    464: od +8 <rcc >tst/od2
                    465: rm -f *.o
                    466: make CC=lcc CFLAGS='-B./ -d0.1 -A -DPROTO -DENUMS' LDFLAGS='-s' rcc
                    467: lcc -c -B./ -d0.1 -A -DPROTO -DENUMS -I. -I.. -I../../c ../../c/dag.c
                    468: ...
                    469: lcc -s -o rcc dag.o ... sel.o
                    470: od +8 <rcc >tst/od3
                    471: cmp tst/od[23] && rm tst/od[23]
                    472: \end{verbatim}
                    473: This command builds \verb|rcc| twice; once using the
                    474: \verb|cc|-built \verb|rcc| and again using the \verb|lcc|-built \verb|rcc|.
                    475: After building each version, an octal dump of the resulting binary is made,
                    476: and the two dumps are compared. They should be identical, as shown
                    477: at the end of the output above.
                    478: If they aren't, our compiler is generating bad code.
                    479: This triple-compilation test is described in
                    480: B.~J. Cornelius, I.~R. Lowman, and D.~J. Robson,
                    481: `Steady-State Compilers,' {\it Software---Practice \& Experience \bf 14},
                    482: 8 (Aug.\ 1984) 705--9. (They name four generations because they
                    483: number them differently.)
                    484: 
                    485: The final version of \verb|rcc| should also pass the test suite;
                    486: i.e., the output from \verb|make test|
                    487: should be identical to that from the previous \verb|make test|.
                    488: 
                    489: Now install the final version of \verb|rcc|:
                    490: \begin{verbatim}
                    491: $ cp rcc /usr/local/lib/rcc
                    492: \end{verbatim}
                    493: where the destination is the location chosen for \verb|rcc| in Section~2.
                    494: 
                    495: The \verb|make| commands described above can be done with a single command:
                    496: \begin{verbatim}
                    497: $ make test triple test
                    498: \end{verbatim}
                    499: and \verb|make clean| cleans up, but does not remove \verb|rcc|.
                    500: 
                    501: The software used to build the production code generators
                    502: is described in C.~W. Fraser, `A Language for Writing Code Generators,'
                    503: {\it Proc.\ SIGPLAN Conf.\ on Programming Language Design and Implementation},
                    504: Portland, June 1989, 238--45. It is not yet available.
                    505: 
                    506: 
                    507: \section{Building the Demonstration VAX Compiler}
                    508: 
                    509: The code generator in \verb|gen3| emits naive VAX code.
                    510: It is not a production code generator. It is included only
                    511: to illustrate the interface between the front end
                    512: and the code generator. If you want to replace \verb|lcc|'s code generator,
                    513: study it and not the larger production code generators.
                    514: 
                    515: The command
                    516: \begin{verbatim}
                    517: $ make test
                    518: \end{verbatim}
                    519: builds and tests the demonstration VAX code generator.
                    520: The \verb|makefile| uses \verb|lcc| instead of \verb|cc|
                    521: because \verb|gen3/gen.c| is written in ANSI~C.
                    522: If \verb|lcc| is unavailable, use another ANSI~C compiler, e.g., \verb|gcc|,
                    523: and use a command like
                    524: \begin{verbatim}
                    525: $ make CC=gcc test
                    526: \end{verbatim}
                    527: to build the demonstration compiler. Alternatively, you can specify
                    528: another ANSI~C compiler by editing the first line in \verb|makefile|.
                    529: 
                    530: There may be warnings, but there should be no errors.
                    531: As for the production code generators, this command
                    532: tests \verb|rcc| by running a shell script,
                    533: \verb|gen3/run|, on each C program in the test suite.
                    534: This script compiles a program and compares the generated VAX code
                    535: with the expected code (the expected VAX code for \verb|tst/8q.c| is
                    536: in \verb|gen3/tst/8q.s.bak|, etc.). There should be no differences.
                    537: If there are differences, the script executes the generated code
                    538: and compares the output with the expected output
                    539: (the expected output from \verb|tst/8q.c| is
                    540: in \verb|gen3/tst/8q.1|, etc.).
                    541: 
                    542: \verb|make triple| is the same as for the production compilers, and
                    543: \verb|make clean| cleans up, but does not remove \verb|rcc|.
                    544: 
                    545: 
                    546: \section{Building the Symbolic Compiler}
                    547: 
                    548: The code generator in \verb|gen0| documents the
                    549: interface between the front end and the code generator and is used routinely in
                    550: front-end development. The output of this code generator is a printable
                    551: representation of the input program, e.g., the dags constructed by the
                    552: front end are printed, and other interface functions print their arguments.
                    553: The output is not executable, unlike the output of the demonstration
                    554: VAX code generator.
                    555: 
                    556: The interface is defined by a small set of functions in
                    557: \verb|gen0/symbolic.c|. Some of the interface functions are defined as
                    558: macros in \verb|gen0/config.h| along with other machine-specific parameters.
                    559: The dag language constitutes the bulk of the interface. The
                    560: operators are enumerated in \verb|c/ops.h|. Each generic operator (e.g.,
                    561: \verb|ADD|) has several type-specific variants indicated by type suffixes
                    562: (e.g., \verb|ADDI|, \verb|ADDF|, \verb|ADDP|, etc.). The suffixes are defined in
                    563: \verb|c/ops.h|.  The dag nodes (\verb|struct node|) are defined in \verb|c/c.h|; the
                    564: \verb|Xnode| field is machine specific and is defined in \verb|gen0/config.h|.
                    565: \verb|c/c.h| defines almost all of the data structures used the front end.
                    566: 
                    567: The command
                    568: \begin{verbatim}
                    569: $ make test
                    570: \end{verbatim}
                    571: builds the symbolic compiler, \verb|rcc|, and tests it by running the shell script
                    572: \verb|gen0/run| on each C program in the test suite, \verb|tst|.
                    573: This script compiles a program and uses \verb|diff| to compare the generated symbolic code
                    574: with the expected code (the expected code for \verb|tst/8q.c| is
                    575: in \verb|gen0/tst/8q.s.bak|, etc.). There should be no differences.
                    576: The script also compares the
                    577: diagnostics from the compiler with the expected diagnostics
                    578: (the expected diagnostics for \verb|tst/8q.c| are
                    579: in \verb|tst/8q.2|, etc.).
                    580: 
                    581: \verb|make clean| cleans up, but does not remove \verb|rcc|.
                    582: 
                    583: 
                    584: \section{Reporting Bugs}
                    585: 
                    586: Bugs can be reported by sending mail with the shortest program
                    587: that exposes them and the details reported by \verb|lcc|'s \verb|-v|
                    588: option to \verb|[email protected]|.
                    589: Other questions and comments can be mailed to \verb|[email protected]|.
                    590: 
                    591: \end{document}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.