|
|
1.1 ! root 1: \documentstyle{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{May 21, 1991\\ Last Revised September 15, 1992} ! 14: ! 15: \begin{document} ! 16: %\bibliographystyle{abbrv} ! 17: ! 18: \maketitle ! 19: ! 20: \section{Introduction} ! 21: ! 22: \verb|lcc| is a retargetable compiler for ANSI C~\cite{ansi:Cstandard}. ! 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. ! 28: ! 29: Extract the distribution into its own directory. ! 30: All paths below are relative to this directory. ! 31: ! 32: All distributions include the following top-level directories; ! 33: ``front-end'' distributions include {\em only\/} these directories. ! 34: ! 35: \begin{center} ! 36: \begin{tabular}{ll} ! 37: \tt c & front end \\ ! 38: \tt etc & driver, man page \\ ! 39: \tt doc & this document, other documentation \\ ! 40: \tt include & ANSI include files \\ ! 41: \tt tst & test suite \\ ! 42: \tt gen0 & ``symbolic'' code generator \\ ! 43: \tt gen3 & demonstration VAX code generator \\ ! 44: \end{tabular} ! 45: \end{center} ! 46: ``Front-end'' distributions include no production code generators ! 47: and Sec.~\ref{gen2} of this document does not apply. ! 48: Secs.~\ref{gen3} and \ref{gen0} describe how to build compilers ! 49: with the demonstation VAX code generator and ! 50: the symbolic code generator, respectively. ! 51: ! 52: ``Full'' distributions include code generators for the VAX, MIPS, ! 53: and Motorola 68020 with the 68881 floating-point co-processor. ! 54: These distributions add the top-level directory ! 55: \verb|gen2|, which holds the production code generators. ! 56: ! 57: Installation of a production compiler ! 58: involves three steps performed in the following order. ! 59: \begin{enumerate} ! 60: \item Decide where to install the man page, the include files, ! 61: the compiler, and \verb|lcc|, the driver program; see Sec.~\ref{paths}. ! 62: ! 63: \item Install a host-specific driver; see Sec.~\ref{driver}. ! 64: ! 65: \item Install a host- and target-specific compiler; see Sec.~\ref{gen2}. ! 66: \end{enumerate} ! 67: ! 68: \verb|c/version.h| identifies the version of the distribution ! 69: as {\tt (($x$<<8)|$y$)} for version {\tt $x$.$y$}, ! 70: and \verb|LOG| describes the changes from the previous version. ! 71: ! 72: \verb|doc/*.tex| are \LaTeX\ input files for several reports that ! 73: describe \verb|lcc|, including this one. ! 74: To format these reports, run \verb|latex| twice, e.g., ! 75: \begin{verbatim} ! 76: $ latex overview; latex overview ! 77: \end{verbatim} ! 78: Ignore warnings about overfull boxes. ! 79: ! 80: \section{Paths}\label{paths} ! 81: ! 82: Installation consists of three files and one directory; ! 83: these are summarized below along with paths used in typical installations. ! 84: ! 85: \begin{center} ! 86: \begin{tabular}{ll} ! 87: \tt /usr/local/man/man1/lcc.1 & the man page \\ ! 88: \tt /usr/local/lib/rcc & the compiler \\ ! 89: \tt /usr/local/bin/lcc & the driver \\ ! 90: \tt /usr/local/include/ansi & include files (a directory) \\ ! 91: \end{tabular} ! 92: \end{center} ! 93: ! 94: These files can be placed in other, site-specific locations, ! 95: but the compiler should be named \verb|rcc|. ! 96: If the driver isn't named \verb|lcc|, edit the man page (\verb|etc/lcc.1|). ! 97: ! 98: Include files are in directories named \verb|include/|{\it target}\verb|_|{\it system}; ! 99: the following table lists the available combinations. ! 100: \begin{center} ! 101: \begin{tabular}{lll} ! 102: \em target & \em system & operating system \\[0.5ex] ! 103: \tt vax & \tt bsd & 4.3BSD UNIX \\ ! 104: & \tt ultrix & ULTRIX 3.0 \\ ! 105: & \tt v9 & 9th Edition UNIX \\ ! 106: \tt mips & \tt iris & IRIX System V Release 3.2 \\ ! 107: & \tt mips & RISC/OS 4.0 \\ ! 108: & \tt ultrix & ULTRIX 4.0 \\ ! 109: \tt mc & \tt sun & SunOS 4.0 \\ ! 110: & \tt next & Mach \\ ! 111: % \tt sparc & \tt sun & SunOS 4.0 \\ ! 112: \end{tabular} ! 113: \end{center} ! 114: Not all combinations of {\it target}, {\it system\/} are provided ! 115: and many don't make sense. ! 116: Choose the include files that are appropriate for your system, ! 117: or make a copy of a closely related set and edit them. ! 118: ! 119: For example, if the paths shown above are chosen and if ! 120: \verb|include/mips_ultrix| has the appropriate include files, ! 121: install the man page and include files by ! 122: \begin{verbatim} ! 123: $ cp etc/lcc.1 /usr/local/man/man1 ! 124: $ cp include/mips_ultrix/*.h /usr/local/include/ansi ! 125: \end{verbatim} ! 126: ! 127: \section{Installing the Driver}\label{driver} ! 128: ! 129: The preprocessor, compiler, assembler, and loader are ! 130: invoked by a driver program, \verb|lcc|, which is similar ! 131: to \verb|cc| on most systems. It's described in the man page ! 132: \verb|etc/lcc.1|. ! 133: The driver is built by combining the host-independent ! 134: part, \verb|etc/lcc.c|, with a small host-specific part. ! 135: By convention, host-specific parts are named {\it hostname}\verb|.c|, ! 136: where {\it hostname\/} is the local name for the host on which \verb|lcc| ! 137: is being installed. \verb|etc| holds many examples. ! 138: Comments in most give the details of the ! 139: particular host; pick one that is closely related to your host, ! 140: copy it to \verb|etc/|{\it yourhostname}\verb|.c|, ! 141: and edit it as described below. ! 142: You should not have to edit \verb|etc/lcc.c|. ! 143: ! 144: Debug your version of the driver by running it ! 145: with the \verb|-v -v| options, which cause it to echo the ! 146: commands it would execute, but not to execute them. ! 147: ! 148: Here's \verb|etc/hart.c|, which we'll use as an example ! 149: in describing how to edit a host-specific part. ! 150: This example illustrates all of the important features. ! 151: \begin{verbatim} ! 152: /* DECStations running ULTRIX at Princeton University */ ! 153: ! 154: #include <string.h> ! 155: ! 156: char *cpp[] = { ! 157: "/usr/gnu/lib/gcc-cpp", "-undef", ! 158: "-DLANGUAGE_C", "-D_LANGUAGE_C", "-D__LANGUAGE_C", ! 159: "-D_unix", "-D__unix", ! 160: "-Dultrix", "-D_ultrix", "-D__ultrix", ! 161: "-Dmips", "-D_mips", "-D__mips", ! 162: "-Dhost_mips", "-D_host_mips", "-D__host_mips", ! 163: "-DMIPSEL", "-D_MIPSEL", "-D__MIPSEL", ! 164: "$1", "$2", "$3", 0 }; ! 165: char *include[] = { "-I/usr/local/include/ansi", 0 }; ! 166: char *com[] = { "/usr/local/lib/rcc", "$1", "$2", "$3", 0 }; ! 167: char *as[] = { "/bin/as", "-o", "$3", "", "$1", ! 168: "-nocpp", "-EL", "$2", 0 }; ! 169: char *ld[] = { "/usr/bin/ld", "-o", "$3", "/usr/lib/crt0.o", ! 170: "$1", "$2", "", "", "-lm", "-lc", 0 }; ! 171: ! 172: int option(arg) char *arg; { ! 173: if (strcmp(arg, "-g") == 0) ! 174: as[3] = "-g"; ! 175: else if (strcmp(arg, "-p") == 0 ! 176: && strcmp(ld[3], "/usr/lib/crt0.o") == 0) { ! 177: ld[3] = "/usr/lib/mcrt0.o"; ! 178: ld[7] = "/usr/lib/libprof1.a"; ! 179: } else if (strcmp(arg, "-b") == 0 ! 180: && access("/usr/local/lib/bbexit.o", 4) == 0) ! 181: ld[6] = "/usr/local/lib/bbexit.o"; ! 182: else ! 183: return 0; ! 184: return 1; ! 185: } ! 186: \end{verbatim} ! 187: ! 188: Most of the host-specific code is data that ! 189: gives prototypes for the commands that invoke ! 190: the preprocessor, compiler, assembler, and loader. ! 191: Each command prototype is an array of pointers to strings ! 192: terminated with a null pointer; ! 193: the first string is the full path name of the command and the others ! 194: are the arguments or argument placeholders, which are described below. ! 195: ! 196: The \verb|cpp| array gives the command for running the preprocessor. ! 197: \verb|lcc| is intended to be used with an ANSI preprocessor, ! 198: such as the GNU C preprocessor available from the Free Software Foundation. ! 199: If the GNU preprocessor is used, ! 200: it must be named \verb|gcc-cpp| in order for \verb|lcc|'s \verb|-N| option ! 201: to work correctly. ! 202: ! 203: Literal arguments specified in prototypes, e.g., \verb|"-Dmips"| in ! 204: the \verb|cpp| command above, are passed to the command as given. ! 205: ! 206: The strings \verb|"$1"|, \verb|"$2"|, and \verb|"$3"| in ! 207: prototypes are placeholders for {\em lists} of arguments that ! 208: are substituted in a copy of the prototype before the command is executed. ! 209: \verb|$1| is replaced by the {\em options} specified by the user; ! 210: for the preprocessor, this list always contains at least ! 211: \verb|-Dunix| and \verb|-D__LCC__|. ! 212: \verb|$2| is replaced by the {\em input} files, ! 213: and \verb|$3| is replaced by the {\em output} file. ! 214: ! 215: Zero-length arguments after replacement are removed from ! 216: the argument list before the command is invoked. So, e.g., ! 217: if the preprocessor is invoked without an output file, ! 218: \verb|"$3"| becomes \verb|""|, which is removed from the final argument list. ! 219: ! 220: For example, to specify a preprocessor command prototype to invoke ! 221: \verb|/bin/cpp| with the options \verb|-Dmips| and \verb|-Dultrix|, ! 222: the \verb|cpp| array would be ! 223: \begin{verbatim} ! 224: char *cpp[] = { "/bin/cpp", "-Dvax", "-Dultrix", ! 225: "$1", "$2", "$3", 0 }; ! 226: \end{verbatim} ! 227: ! 228: The \verb|include| array is a list of \verb|-I| options that ! 229: specify which directives should be searched to satisfy include directives. ! 230: These directories are searched in the order given. ! 231: The first directory should be the one to which the ANSI ! 232: header files were copied in Sec.~\ref{paths}. ! 233: The driver adds these options to \verb|cpp|'s arguments ! 234: when it invokes the preprocessor, except when \verb|-N| is specified. ! 235: ! 236: Design this list carefully. Mixing ANSI and pre-ANSI headers (e.g., by ! 237: listing \verb|/usr/include| after the directory of ANSI headers as ! 238: shown above) may mix incompatible headers. Unless the default list holds {\em only} ! 239: \verb|/usr/include| or {\em only\/} the ANSI headers, many users may be ! 240: forced to use \verb|-N| and \verb|-I| incessantly. ! 241: ! 242: \verb|com| gives the command for invoking the compiler. ! 243: This prototype can appear exactly as shown above, except ! 244: that the command name should be edited to reflect the ! 245: location of the compiler chosen in Sec.~\ref{paths}. ! 246: ! 247: \verb|as| gives the command for invoking the assembler. ! 248: ! 249: \verb|ld| gives the command for invoking the loader. ! 250: For the other commands, the list \verb|$2| contains a single file; ! 251: for \verb|ld|, \verb|$2| contains all `.o' files and libraries, and ! 252: \verb|$3| is \verb|a.out|, unless the \verb|-o| option is specified. ! 253: As suggested in the code above, \verb|ld| must also specify ! 254: the appropriate startup code and default libraries. ! 255: ! 256: The \verb|option| function is described below; ! 257: for now, use an existing \verb|option| function or one that returns \verb|0|. ! 258: ! 259: After specifying the prototypes, compile the driver by ! 260: \begin{verbatim} ! 261: $ cd etc ! 262: $ make HOST=hart ! 263: \end{verbatim} ! 264: where \verb|hart| is replaced by {\it yourhostname}. ! 265: Run the resulting \verb|a.out| with the options \verb|-v -v| ! 266: to display the commands that would be executed, e.g., ! 267: \begin{verbatim} ! 268: $ a.out -v -v foo.c baz.c mylib.a -lX11 ! 269: a.out version 1.9 ! 270: foo.c: ! 271: /usr/gnu/lib/gcc-cpp -undef -DLANGUAGE_C -D_LANGUAGE_C ! 272: -D__LANGUAGE_C -D_unix -D__unix -Dultrix -D_ultrix -D__ultrix ! 273: -Dmips -D_mips -D__mips -Dhost_mips -D_host_mips -D__host_mips ! 274: -DMIPSEL -D_MIPSEL -D__MIPSEL -Dunix -D__LCC__ -v ! 275: -I/usr/local/include/ansi foo.c | ! 276: /usr/local/lib/rcc -v - /tmp/lcc18299.s ! 277: /bin/as -o foo.o -nocpp -EL /tmp/lcc18299.s ! 278: baz.c: ! 279: /usr/gnu/lib/gcc-cpp -undef -DLANGUAGE_C -D_LANGUAGE_C ! 280: -D__LANGUAGE_C -D_unix -D__unix -Dultrix -D_ultrix -D__ultrix ! 281: -Dmips -D_mips -D__mips -Dhost_mips -D_host_mips -D__host_mips ! 282: -DMIPSEL -D_MIPSEL -D__MIPSEL -Dunix -D__LCC__ -v ! 283: -I/usr/local/include/ansi baz.c | ! 284: /usr/local/lib/rcc -v - /tmp/lcc18299.s ! 285: /bin/as -o baz.o -nocpp -EL /tmp/lcc18299.s ! 286: /usr/bin/ld -o a.out /usr/lib/crt0.o foo.o baz.o mylib.a ! 287: -lX11 -lm -lc ! 288: rm /tmp/lcc18299.s ! 289: \end{verbatim} ! 290: Leading spaces indicate lines that have been folded manually to fit this page. ! 291: Note the use of a pipeline to connect the preprocessor and compiler. ! 292: \verb|lcc| arranges this pipeline itself; it does not call the shell. ! 293: ! 294: As the output shows, \verb|lcc| places temporary files in \verb|/tmp|. ! 295: Alternatives can be specified by defining \verb|TEMPDIR| in \verb|CFLAGS| ! 296: when making the driver, e.g., ! 297: \begin{verbatim} ! 298: $ make CFLAGS='-DTEMPDIR=\"/usr/tmp\"' HOST=hart ! 299: \end{verbatim} ! 300: causes \verb|lcc| to place temporary files in \verb|/usr/tmp|. ! 301: ! 302: Once the driver is completed, install it by ! 303: \begin{verbatim} ! 304: $ cp a.out /usr/local/bin/lcc ! 305: \end{verbatim} ! 306: where the destination is the location chosen for \verb|lcc| in Sec.~\ref{paths}. ! 307: ! 308: The \verb|option| function is called for the options ! 309: \verb|-g|, \verb|-p|, \verb|-pg|, and \verb|-b| because these compiler options might ! 310: also affect the loader's arguments. For these options, ! 311: the driver calls \verb|option(arg)| to give the host-specific ! 312: code an opportunity to edit the \verb|ld| prototype, if necessary. ! 313: \verb|option| can change \verb|ld|, if necessary, and return \verb|1| to ! 314: announce its acceptance of the option. If the option ! 315: is unsupported, \verb|option| should return \verb|0|. ! 316: ! 317: For example, in response to \verb|-g|, the \verb|option| function shown above ! 318: changes \verb|as[3]| from \verb|""| to \verb|"-g"|, which specifies ! 319: the debugging option to the assembler. If \verb|-g| is not specified, ! 320: the \verb|""| argument is omitted from the \verb|as| command ! 321: because it's empty. ! 322: ! 323: Likewise, the \verb|-p| causes \verb|option| to change the name ! 324: of the startup code and add the name of the profiling library. Note that ! 325: \verb|option| has been written to support simultaneous use ! 326: of \verb|-g| and \verb|-p|, e.g., ! 327: \begin{verbatim} ! 328: $ a.out -v -v -g -p foo.s baz.o -o myfoo ! 329: a.out version 1.9 ! 330: /bin/as -o foo.o -g -nocpp -EL foo.s ! 331: /usr/bin/ld -o myfoo /usr/lib/mcrt0.o foo.o baz.o ! 332: /usr/lib/libprof1.a -lm -lc ! 333: rm /tmp/lcc18317.s ! 334: \end{verbatim} ! 335: ! 336: On Suns, the driver ! 337: passes any option beginning with \verb|-f| to \verb|option| ! 338: to support Sun's \verb|-f68881| option. The driver also ! 339: recognizes \verb|-Bstatic| and \verb|-Bdynamic| as linker options, ! 340: and recognizes but ignores Sun's \verb|-target|~{\it name\/} option. ! 341: ! 342: The option \verb|-Wo|{\it arg\/} causes the driver to pass {\it arg\/} ! 343: to \verb|option|. Such options have no other effect; this mechanism ! 344: is provided to support system-specific options that affect the ! 345: commands executed by the driver. ! 346: ! 347: The \verb|-b| option causes the compiler to generate ! 348: code to count the number of times each expression is executed. ! 349: The \verb|exit| function in \verb|etc/bbexit.c| writes these ! 350: counts to \verb|prof.out| when the program terminates. ! 351: If \verb|option| is called with \verb|-b|, ! 352: it must edit the \verb|ld| command accordingly, ! 353: as shown above. This version of \verb|option| uses ! 354: the \verb|access| system call to insure that \verb|bbexit.o| is installed before ! 355: editing the \verb|ld| command. To install \verb|bbexit.o| execute ! 356: \begin{verbatim} ! 357: $ make bbexit.o ! 358: $ cp bbexit.o /usr/local/lib/bbexit.o ! 359: \end{verbatim} ! 360: If necessary, change \verb|/usr/local/lib| to reflect local conventions. ! 361: The \verb|exit| function in \verb|etc/bbexit.c| works on the ! 362: systems listed in Sec.~\ref{paths}, but may need to be modified for other systems. ! 363: The implementation of the \verb|-b| option is described ! 364: in Ref.~\cite{fraser:hanson:91b}. ! 365: The \LaTeX\ source for the technical report version of this paper ! 366: is in \verb|doc/overview.tex|. ! 367: ! 368: If \verb|option| supports \verb|-b|, you should also ! 369: install \verb|etc/bprint.c|, which reads \verb|prof.out| ! 370: and generates a listing annotated with execution counts. ! 371: After \verb|lcc| is installed, install \verb|bprint| with the commands ! 372: \begin{verbatim} ! 373: $ make bprint ! 374: $ cp bprint /usr/local/bin/bprint ! 375: $ cp bprint.1 /usr/local/man/man1 ! 376: \end{verbatim} ! 377: The \verb|makefile| uses \verb|lcc| to compile \verb|bprint.c|; ! 378: you must use \verb|lcc| or another ANSI~C compiler, e.g., \verb|gcc|, ! 379: because \verb|bprint.c| is written in ANSI~C. ! 380: Also, \verb|bprint.c| {\em includes\/} \verb|"../c/profio.c"|, so it must ! 381: be compiled in \verb|etc|. ! 382: ! 383: To complete the driver, ! 384: write an appropriate \verb|option| function for your system, ! 385: and make and install the driver as described above. ! 386: ! 387: \section{Installing a Production Compiler}\label{gen2} ! 388: ! 389: \verb|gen2| contains source code common to all of the production ! 390: code generators and directories for each of the supported targets: ! 391: ! 392: \begin{center} ! 393: \begin{tabular}{ll} ! 394: \tt gen2/vax & VAX code generator \\ ! 395: \tt gen2/mips & MIPS code generator \\ ! 396: \tt gen2/mc & Motorola 68020 \& 68881 code generator \\ ! 397: %\tt gen2/sparc & SPARC code generator \\ ! 398: \end{tabular} ! 399: \end{center} ! 400: ! 401: A production compiler, \verb|rcc|, is built by compiling it ! 402: with the host C compiler and then using the result to re-compile itself. ! 403: A test suite is used to ! 404: verify that the compiler is working correctly. ! 405: The examples below use the MIPS compiler under Ultrix ! 406: to illustrate this process. ! 407: You must have the driver, \verb|lcc|, installed in order ! 408: to build and test \verb|rcc|. ! 409: If any of the steps below fail, contact us (see Sec.~\ref{bugs}). ! 410: ! 411: The \verb|makefile| runs the shell script ! 412: \verb|gen2/run| on each C program in the test suite, \verb|tst|. ! 413: \verb|gen2/makefile| uses \verb|include| directives, which are supported by ! 414: most versions of \verb|make|. If your version of \verb|make| ! 415: doesn't support \verb|include|, build a suitable \verb|makefile| ! 416: by replacing the \verb|include|s with the specified \verb|makefile|s. ! 417: Note that the path names are relative to the \verb|gen2| directory. ! 418: ! 419: The object files, \verb|rcc|, and the generated code for ! 420: the programs in the test suite are placed in the directory ! 421: {\tt gen2/\it target\/\tt-\it system\/} where {\it target\/} and {\it system\/} ! 422: are the names of your target machine and its operating system, respectively. ! 423: There are directories for the supported {\it target\/}, {\it system\/} combinations, ! 424: e.g., \verb|mips-ultrix|. ! 425: ! 426: The {\it target\/} and {\it system\/} values are read from the ! 427: variables \verb|TARGET| and \verb|OS|, respectively. ! 428: Values for these variables must be specified when invoking \verb|make| ! 429: along with system-specific values for \verb|CFLAGS| and \verb|LDFLAGS|, ! 430: if necessary. ! 431: The following table lists the \verb|make| commands for the supported ! 432: {\it target\/-system\/} combinations. ! 433: \begin{center}\tt ! 434: \begin{tabular}{llll} ! 435: make TARGET=vax & OS=bsd\\ ! 436: make TARGET=vax & OS=ultrix\\ ! 437: make TARGET=vax & OS=v9\\[1ex] ! 438: ! 439: make TARGET=mips & OS=iris & CFLAGS=-cckr\\ ! 440: make TARGET=mips & OS=ultrix\\ ! 441: make TARGET=mips & OS=mips\\[1ex] ! 442: ! 443: %make TARGET=sparc & OS=sun & LDFLAGS='-s -Bstatic'\\[1ex] ! 444: ! 445: make TARGET=mc & OS=sun & LDFLAGS='-s -Bstatic'\\ ! 446: make TARGET=mc & OS=next\\ ! 447: \end{tabular} ! 448: \end{center} ! 449: For example, to build an \verb|rcc| for a MIPS running Ultrix, execute the commands ! 450: \begin{verbatim} ! 451: $ cd gen2 ! 452: $ make TARGET=mips OS=ultrix ! 453: cd mips-ultrix; ! 454: cc -c -Dmips_ultrix -I../mips -I.. -I../../c ../../c/dag.c ! 455: ... ! 456: cd mips-ultrix; ! 457: cc -c -Dmips_ultrix -I../mips -I.. -I../../c ../mips/sel.c ! 458: cc -s -o mips-ultrix/rcc mips-ultrix/dag.o ... mips-ultrix/sel.o ! 459: \end{verbatim} ! 460: There may be a few warnings, but there should be no errors. ! 461: ! 462: Once \verb|rcc| is built with the host C compiler, ! 463: run the test suite to verify that \verb|rcc| is working correctly, ! 464: specifying the appropriate operating system from those listed ! 465: in Sec.~\ref{paths}, e.g., ! 466: \begin{verbatim} ! 467: $ make TARGET=mips OS=ultrix test ! 468: mips-ultrix 8q: ! 469: mips-ultrix array: ! 470: mips-ultrix cf: ! 471: mips-ultrix cq: ! 472: mips-ultrix cvt: ! 473: mips-ultrix fields: ! 474: mips-ultrix front: ! 475: mips-ultrix incr: ! 476: mips-ultrix init: ! 477: mips-ultrix limits: ! 478: mips-ultrix paranoia: ! 479: mips-ultrix sort: ! 480: mips-ultrix spill: ! 481: mips-ultrix stdarg: ! 482: mips-ultrix struct: ! 483: mips-ultrix switch: ! 484: mips-ultrix wf1: ! 485: mips-ultrix yacc: ! 486: \end{verbatim} ! 487: For each C program in the test suite, ! 488: \verb|gen2/run| compiles the program and uses \verb|diff| ! 489: to compare the generated assembly code ! 490: with the expected code (the expected MIPS code for \verb|tst/8q.c| is ! 491: in \verb|gen2/mips-ultrix/tst/8q.s.bak|, etc.). If there are differences, the script ! 492: executes the generated code with the input given in \verb|tst| ! 493: (the input for \verb|tst/8q.c| is in \verb|tst/8q.0|, etc.) ! 494: and compares the output with the expected output ! 495: (the expected output from \verb|tst/8q.c| on the MIPS is ! 496: in \verb|gen2/mips-ultrix/tst/8q.1.bak|, etc.). The script also compares the ! 497: diagnostics from the compiler with the expected diagnostics. ! 498: ! 499: On some systems, there may be a few differences between the generated code ! 500: and the expected code. ! 501: These differences occur because the expected code is ! 502: generated by cross compilation ! 503: on a MIPS and the least-significant bits of some floating-point constants ! 504: differ from those bits in constants generated on your system. ! 505: There should be no differences in the output from executing the test programs. ! 506: ! 507: The \verb|mips-ultrix| preceding the name of each test program in the output ! 508: above indicates a {\it target\/\it-system\/} combination, e.g., ! 509: ``generating code for a \verb|mips| running the ! 510: \verb|ultrix| operating system''. ! 511: ! 512: Next, build \verb|rcc| again using the just-built \verb|rcc|: ! 513: \begin{verbatim} ! 514: $ make TARGET=mips OS=ultrix triple ! 515: rm -f mips-ultrix/*.o ! 516: make TARGET=mips OS=ultrix CC='lcc -B./ -d0.1 -A' ! 517: CFLAGS='-N -I../../include/mips_ultrix ' ! 518: LDFLAGS='-s' mips-ultrix/rcc ! 519: cd mips-ultrix; ! 520: lcc -B./ -d0.1 -A -c -Dmips_ultrix -N -I../../include/mips_ultrix ! 521: -I../mips -I.. -I../../c ../../c/dag.c ! 522: ... ! 523: lcc -B./ -d0.1 -A -s -o mips-ultrix/rcc ! 524: mips-ultrix/dag.o ... mips-ultrix/sel.o ! 525: od +8 <mips-ultrix/rcc >mips-ultrix/tst/od2 ! 526: rm -f mips-ultrix/*.o ! 527: make TARGET=mips OS=ultrix CC='lcc -B./ -d0.1 -A' ! 528: CFLAGS='-N -I../../include/mips_ultrix ' ! 529: LDFLAGS='-s' mips-ultrix/rcc ! 530: cd mips-ultrix; ! 531: lcc -B./ -d0.1 -A -c -Dmips_ultrix -N -I../../include/mips_ultrix ! 532: -I../mips -I.. -I../../c ../../c/dag.c ! 533: ... ! 534: lcc -B./ -d0.1 -A -s -o mips-ultrix/rcc ! 535: mips-ultrix/dag.o ... mips-ultrix/sel.o ! 536: od +8 <mips-ultrix/rcc >mips-ultrix/tst/od3 ! 537: cmp mips-ultrix/tst/od[23] && rm mips-ultrix/tst/od[23] ! 538: \end{verbatim} ! 539: This command builds \verb|mips-ultrix/rcc| twice; once using the ! 540: \verb|mips-ultrix/rcc| built by \verb|cc| ! 541: and again using the \verb|mips-ultrix/rcc| built by \verb|lcc|. ! 542: After building each version, an octal dump of the resulting binary is made, ! 543: and the two dumps are compared. They should be identical, as shown ! 544: at the end of the output above. ! 545: If they aren't, our compiler is generating bad code. ! 546: This triple-compilation test is described in Ref.~\cite{cornelius:etal:84}. ! 547: (They name four generations because they number them differently.) ! 548: ! 549: The final version of \verb|mips-ultrix/rcc| should also pass the test suite; ! 550: i.e., the output from \verb|make TARGET=mips OS=ultrix test| ! 551: should be identical to that from the previous \verb|make|. ! 552: ! 553: Now install the final version of \verb|mips-ultrix/rcc|: ! 554: \begin{verbatim} ! 555: $ cp mips-ultrix/rcc /usr/local/lib/rcc ! 556: \end{verbatim} ! 557: where the destination is the location chosen for \verb|rcc| in Sec.~\ref{paths}. ! 558: ! 559: On some systems, you may be able ! 560: to use environment variables and \verb|make|'s \verb|-e| ! 561: option to avoid specifying \verb|TARGET| ! 562: and \verb|OS| on each \verb|make| command, and ! 563: the \verb|make| commands described above can be done with a single command: ! 564: \begin{verbatim} ! 565: $ TARGET=mips OS=ultrix export TARGET OS ! 566: $ make -e test triple test clean ! 567: \end{verbatim} ! 568: \verb|make clean| cleans up, but does not remove \verb|mips-ultrix/rcc|, and ! 569: \verb|make clobber| cleans up and removes \verb|mips-ultrix/rcc|. ! 570: ! 571: The software used to build the production code generators ! 572: is described in Ref.~\cite{fraser:sigplan89}; it is not available. ! 573: ! 574: \section{Building the Demonstration VAX Compiler}\label{gen3} ! 575: ! 576: The code generator in \verb|gen3| emits naive VAX code. ! 577: It is not a production code generator. It is included only ! 578: to illustrate the interface between the front end ! 579: and the code generator. If you want to replace \verb|lcc|'s code generator, ! 580: study it and not the larger production code generators. ! 581: ! 582: This code generator is detailed in ! 583: Refs.~\cite{fraser:hanson:interface:TR,fraser:hanson:91a,fraser:hanson:92}. ! 584: \verb|doc/interface.tex| holds the \LaTeX\ source for the latest ! 585: version of Ref.~\cite{fraser:hanson:interface:TR}. ! 586: ! 587: \verb|makefile| uses \verb|include| directives, which are supported by ! 588: most versions of \verb|make|. If your version of \verb|make| ! 589: doesn't support \verb|include|, build a suitable \verb|makefile| ! 590: by replacing the \verb|include|s with the specified \verb|makefile|s. ! 591: ! 592: The default and only acceptable \verb|TARGET| is \verb|vax| ! 593: and the default \verb|OS| is \verb|bsd|, so the commands ! 594: \begin{verbatim} ! 595: $ cd gen3 ! 596: $ make test ! 597: \end{verbatim} ! 598: build and test \verb|vax-bsd/rcc|; ! 599: The \verb|makefile| uses \verb|lcc| instead of \verb|cc| ! 600: because \verb|gen3/gen.c| is written in ANSI~C. ! 601: If \verb|lcc| is unavailable, use another ANSI~C compiler, e.g., \verb|gcc|, ! 602: and use a command like ! 603: \begin{verbatim} ! 604: $ make CC=gcc test ! 605: \end{verbatim} ! 606: to build the demonstration compiler. Alternatively, you can specify ! 607: another ANSI~C compiler by editing \verb|gen3/makefile|. ! 608: ! 609: There may be warnings, but there should be no errors. ! 610: As for the production code generators, this command ! 611: tests \verb|vax-bsd/rcc| by running a shell script, ! 612: \verb|gen3/run|, on each C program in the test suite. ! 613: This script compiles a program and compares the generated VAX code ! 614: with the expected code (the expected VAX code for \verb|tst/8q.c| is ! 615: in \verb|gen3/vax-bsd/tst/8q.s.bak|, etc.). ! 616: There should be no significant differences. ! 617: If there are differences, the script executes the generated code ! 618: and compares the output with the expected output ! 619: (the expected output from \verb|tst/8q.c| is ! 620: in \verb|gen3/vax-bsd/tst/8q.1.bak|, etc.). ! 621: ! 622: \verb|make triple| is the same as for the production compilers, ! 623: \verb|make clean| cleans up, but does not remove \verb|rcc|, and ! 624: \verb|make clobber| cleans up and removes \verb|rcc|. ! 625: ! 626: \section{Building the Symbolic Compiler}\label{gen0} ! 627: ! 628: The code generator in \verb|gen0| documents the ! 629: interface between the front end and the code generator and is used routinely in ! 630: front-end development. The output of this code generator is a printable ! 631: representation of the input program, e.g., the dags constructed by the ! 632: front end are printed, and other interface functions print their arguments. ! 633: The output is not executable, unlike the output of the demonstration ! 634: VAX code generator. ! 635: ! 636: The interface is described in ! 637: Refs.~\cite{fraser:hanson:interface:TR,fraser:hanson:91a}. ! 638: The \LaTeX\ source for the latest version of ! 639: Ref.~\cite{fraser:hanson:interface:TR} is in \verb|doc/interface.tex|. ! 640: ! 641: \verb|makefile| uses \verb|include| directives, which are supported by ! 642: most versions of \verb|make|. If your version of \verb|make| ! 643: doesn't support \verb|include|, build a suitable \verb|makefile| ! 644: by replacing the \verb|include|s with the specified \verb|makefile|s. ! 645: ! 646: For the symbolic compiler, \verb|TARGET| and \verb|OS| serve only ! 647: to identify an include directory, and \verb|gen0/makefile| ! 648: specifies \verb|vax| and \verb|bsd| as defaults. ! 649: The commands ! 650: \begin{verbatim} ! 651: $ cd gen0 ! 652: $ make test ! 653: \end{verbatim} ! 654: build the symbolic compiler, \verb|vax-bsd/rcc|, and tests it by running the shell script ! 655: \verb|gen0/run| on each C program in the test suite, \verb|tst|. ! 656: This script compiles a program and uses \verb|diff| to compare the generated symbolic code ! 657: with the expected code (the expected code for \verb|tst/8q.c| is ! 658: in \verb|gen0/vax-bsd/tst/8q.s.bak|, etc.). There should be no differences. ! 659: The script also compares the ! 660: diagnostics from the compiler with the expected diagnostics ! 661: (the expected diagnostics for \verb|tst/8q.c| are ! 662: in \verb|tst/8q.2|, etc.). ! 663: ! 664: \verb|make clean| cleans up, but does not remove \verb|rcc|, and ! 665: \verb|make clobber| cleans up and removes \verb|rcc|. ! 666: ! 667: \section{Reporting Bugs}\label{bugs} ! 668: ! 669: Bugs can be reported by sending mail with the shortest program ! 670: that exposes them and the details reported by \verb|lcc|'s \verb|-v| ! 671: option to \verb|[email protected]|. ! 672: Other questions, comments, and requests to be added ! 673: to the \verb|lcc| mailing list can be sent to \verb|[email protected]|. ! 674: ! 675: %\bibliography{refs,lib} ! 676: \begin{thebibliography}{1} ! 677: ! 678: \bibitem{ansi:Cstandard} ! 679: American National Standard Institute, Inc., New York. ! 680: \newblock {\em American National Standards for Information Systems, Programming ! 681: Language C {ANSI} X3.159--1989}, 1990. ! 682: ! 683: \bibitem{cornelius:etal:84} ! 684: B.~J. Cornelius, I.~R. Lowman, and D.~J. Robson. ! 685: \newblock Steady-state compilers. ! 686: \newblock {\em Software---Practice \& Experience}, 14(8):705--709, Aug. 1984. ! 687: ! 688: \bibitem{fraser:sigplan89} ! 689: C.~W. Fraser. ! 690: \newblock A language for writing code generators. ! 691: \newblock {\em Proceedings of the SIGPLAN'89 Conference on Programming Language ! 692: Design and Implementation, SIGPLAN Notices}, 24(7):238--245, July 1989. ! 693: ! 694: \bibitem{fraser:hanson:interface:TR} ! 695: C.~W. Fraser and D.~R. Hanson. ! 696: \newblock A code generation interface for {ANSI C}. ! 697: \newblock Technical Report CS-TR-270-90, Princeton University, Department of ! 698: Computer Science, Princeton, NJ, July 1990. ! 699: ! 700: \bibitem{fraser:hanson:91a} ! 701: C.~W. Fraser and D.~R. Hanson. ! 702: \newblock A code generation interface for {ANSI C}. ! 703: \newblock {\em Software---Practice \& Experience}, 21(9):963--988, Sept. 1991. ! 704: ! 705: \bibitem{fraser:hanson:91b} ! 706: C.~W. Fraser and D.~R. Hanson. ! 707: \newblock A retargetable compiler for {ANSI C}. ! 708: \newblock {\em SIGPLAN Notices}, 26(10):29--43, Oct. 1991. ! 709: ! 710: \bibitem{fraser:hanson:92} ! 711: C.~W. Fraser and D.~R. Hanson. ! 712: \newblock Simple register spilling in a retargetable compiler. ! 713: \newblock {\em Software---Practice \& Experience}, 22(1):85--99, Jan. 1992. ! 714: ! 715: \end{thebibliography} ! 716: ! 717: \end{document}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.