This file documents the installation of the GNU compiler.  Copyright
(C) 1988, 1989, 1992, 1994, 1995 Free Software Foundation, Inc.  You
may copy, distribute, and modify it freely as long as you preserve this
copyright notice and permission notice.

Installing GNU CC
*****************

   Here is the procedure for installing GNU CC on a Unix system.  See
*Note VMS Install::, for VMS systems.  In this section we assume you
compile in the same directory that contains the source files; see *Note
Other Dir::, to find out how to compile in a separate directory on Unix
systems.

   You cannot install GNU C by itself on MSDOS; it will not compile
under any MSDOS compiler except itself.  You need to get the complete
compilation package DJGPP, which includes binaries as well as sources,
and includes all the necessary compilation tools and libraries.

  1. If you have built GNU CC previously in the same directory for a
     different target machine, do `make distclean' to delete all files
     that might be invalid.  One of the files this deletes is
     `Makefile'; if `make distclean' complains that `Makefile' does not
     exist, it probably means that the directory is already suitably
     clean.

  2. On a System V release 4 system, make sure `/usr/bin' precedes
     `/usr/ucb' in `PATH'.  The `cc' command in `/usr/ucb' uses
     libraries which have bugs.

  3. Specify the host, build and target machine configurations.  You do
     this by running the file `configure'.

     The "build" machine is the system which you are using, the "host"
     machine is the system where you want to run the resulting compiler
     (normally the build machine), and the "target" machine is the
     system for which you want the compiler to generate code.

     If you are building a compiler to produce code for the machine it
     runs on (a native compiler), you normally do not need to specify
     any operands to `configure'; it will try to guess the type of
     machine you are on and use that as the build, host and target
     machines.  So you don't need to specify a configuration when
     building a native compiler unless `configure' cannot figure out
     what your configuration is or guesses wrong.

     In those cases, specify the build machine's "configuration name"
     with the `--build' option; the host and target will default to be
     the same as the build machine.  (If you are building a
     cross-compiler, see *Note Cross-Compiler::.)

     Here is an example:

          ./configure --build=sparc-sun-sunos4.1

     A configuration name may be canonical or it may be more or less
     abbreviated.

     A canonical configuration name has three parts, separated by
     dashes.  It looks like this: `CPU-COMPANY-SYSTEM'.  (The three
     parts may themselves contain dashes; `configure' can figure out
     which dashes serve which purpose.)  For example,
     `m68k-sun-sunos4.1' specifies a Sun 3.

     You can also replace parts of the configuration by nicknames or
     aliases.  For example, `sun3' stands for `m68k-sun', so
     `sun3-sunos4.1' is another way to specify a Sun 3.  You can also
     use simply `sun3-sunos', since the version of SunOS is assumed by
     default to be version 4.

     You can specify a version number after any of the system types,
     and some of the CPU types.  In most cases, the version is
     irrelevant, and will be ignored.  So you might as well specify the
     version if you know it.

     See *Note Configurations::, for a list of supported configuration
     names and notes on many of the configurations.  You should check
     the notes in that section before proceeding any further with the
     installation of GNU CC.

     There are four additional options you can specify independently to
     describe variant hardware and software configurations.  These are
     `--with-gnu-as', `--with-gnu-ld', `--with-stabs' and `--nfp'.

    `--with-gnu-as'
          If you will use GNU CC with the GNU assembler (GAS), you
          should declare this by using the `--with-gnu-as' option when
          you run `configure'.

          Using this option does not install GAS.  It only modifies the
          output of GNU CC to work with GAS.  Building and installing
          GAS is up to you.

          Conversely, if you *do not* wish to use GAS and do not specify
          `--with-gnu-as' when building GNU CC, it is up to you to make
          sure that GAS is not installed.  GNU CC searches for a
          program named `as' in various directories; if the program it
          finds is GAS, then it runs GAS.  If you are not sure where
          GNU CC finds the assembler it is using, try specifying `-v'
          when you run it.

          The systems where it makes a difference whether you use GAS
          are
          `hppa1.0-ANY-ANY', `hppa1.1-ANY-ANY', `i386-ANY-sysv',
          `i386-ANY-isc',
          `i860-ANY-bsd', `m68k-bull-sysv',
          `m68k-hp-hpux', `m68k-sony-bsd',
          `m68k-altos-sysv', `m68000-hp-hpux',
          `m68000-att-sysv', `ANY-lynx-lynxos', and `mips-ANY').  On
          any other system, `--with-gnu-as' has no effect.

          On the systems listed above (except for the HP-PA, for ISC on
          the 386, and for `mips-sgi-irix5.*'), if you use GAS, you
          should also use the GNU linker (and specify `--with-gnu-ld').

    `--with-gnu-ld'
          Specify the option `--with-gnu-ld' if you plan to use the GNU
          linker with GNU CC.

          This option does not cause the GNU linker to be installed; it
          just modifies the behavior of GNU CC to work with the GNU
          linker.  Specifically, it inhibits the installation of
          `collect2', a program which otherwise serves as a front-end
          for the system's linker on most configurations.

    `--with-stabs'
          On MIPS based systems and on Alphas, you must specify whether
          you want GNU CC to create the normal ECOFF debugging format,
          or to use BSD-style stabs passed through the ECOFF symbol
          table.  The normal ECOFF debug format cannot fully handle
          languages other than C.  BSD stabs format can handle other
          languages, but it only works with the GNU debugger GDB.

          Normally, GNU CC uses the ECOFF debugging format by default;
          if you prefer BSD stabs, specify `--with-stabs' when you
          configure GNU CC.

          No matter which default you choose when you configure GNU CC,
          the user can use the `-gcoff' and `-gstabs+' options to
          specify explicitly the debug format for a particular
          compilation.

          `--with-stabs' is meaningful on the ISC system on the 386,
          also, if `--with-gas' is used.  It selects use of stabs
          debugging information embedded in COFF output.  This kind of
          debugging information supports C++ well; ordinary COFF
          debugging information does not.

          `--with-stabs' is also meaningful on 386 systems running
          SVR4.  It selects use of stabs debugging information embedded
          in ELF output.  The C++ compiler currently (2.6.0) does not
          support the DWARF debugging information normally used on 386
          SVR4 platforms; stabs provide a workable alternative.  This
          requires gas and gdb, as the normal SVR4 tools can not
          generate or interpret stabs.

    `--nfp'
          On certain systems, you must specify whether the machine has
          a floating point unit.  These systems include
          `m68k-sun-sunosN' and `m68k-isi-bsd'.  On any other system,
          `--nfp' currently has no effect, though perhaps there are
          other systems where it could usefully make a difference.

    `--enable-threads=TYPE'
          Certain systems, notably Linux-based GNU systems, can't be
          relied on to supply a threads facility for the Objective C
          runtime and so will default to single-threaded runtime.  They
          may, however, have a library threads implementation
          available, in which case threads can be enabled with this
          option by supplying a suitable TYPE, probably `posix'.  The
          possibilities for TYPE are `single', `posix', `win32',
          `solaris', `irix' and `mach'.

     The `configure' script searches subdirectories of the source
     directory for other compilers that are to be integrated into GNU
     CC.  The GNU compiler for C++, called G++ is in a subdirectory
     named `cp'.  `configure' inserts rules into `Makefile' to build
     all of those compilers.

     Here we spell out what files will be set up by `configure'.
     Normally you need not be concerned with these files.

        * A file named `config.h' is created that contains a `#include'
          of the top-level config file for the machine you will run the
          compiler on (*note The Configuration File:
          (gcc.info)Config.).  This file is responsible for defining
          information about the host machine.  It includes `tm.h'.

          The top-level config file is located in the subdirectory
          `config'.  Its name is always `xm-SOMETHING.h'; usually
          `xm-MACHINE.h', but there are some exceptions.

          If your system does not support symbolic links, you might
          want to set up `config.h' to contain a `#include' command
          which refers to the appropriate file.

        * A file named `tconfig.h' is created which includes the
          top-level config file for your target machine.  This is used
          for compiling certain programs to run on that machine.

        * A file named `tm.h' is created which includes the
          machine-description macro file for your target machine.  It
          should be in the subdirectory `config' and its name is often
          `MACHINE.h'.

        * The command file `configure' also constructs the file
          `Makefile' by adding some text to the template file
          `Makefile.in'.  The additional text comes from files in the
          `config' directory, named `t-TARGET' and `x-HOST'.  If these
          files do not exist, it means nothing needs to be added for a
          given target or host.

  4. The standard directory for installing GNU CC is `/usr/local/lib'.
     If you want to install its files somewhere else, specify
     `--prefix=DIR' when you run `configure'.  Here DIR is a directory
     name to use instead of `/usr/local' for all purposes with one
     exception: the directory `/usr/local/include' is searched for
     header files no matter where you install the compiler.  To override
     this name, use the `--local-prefix' option below.

  5. Specify `--local-prefix=DIR' if you want the compiler to search
     directory `DIR/include' for locally installed header files
     *instead* of `/usr/local/include'.

     You should specify `--local-prefix' *only* if your site has a
     different convention (not `/usr/local') for where to put
     site-specific files.

     The default value for `--local-prefix' is `/usr/local' regardless
     of the value of `--prefix'.  Specifying `--prefix' has no effect
     on which directory GNU CC searches for local header files.  This
     may seem counterintuitive, but actually it is logical.

     The purpose of `--prefix' is to specify where to *install GNU CC*.
     The local header files in `/usr/local/include'--if you put any in
     that directory--are not part of GNU CC.  They are part of other
     programs--perhaps many others.  (GNU CC installs its own header
     files in another directory which is based on the `--prefix' value.)

     *Do not* specify `/usr' as the `--local-prefix'!  The directory
     you use for `--local-prefix' *must not* contain any of the
     system's standard header files.  If it did contain them, certain
     programs would be miscompiled (including GNU Emacs, on certain
     targets), because this would override and nullify the header file
     corrections made by the `fixincludes' script.

     Indications are that people who use this option use it based on
     mistaken ideas of what it is for.  People use it as if it specified
     where to install part of GNU CC.  Perhaps they make this assumption
     because installing GNU CC creates the directory.

  6. Make sure the Bison parser generator is installed.  (This is
     unnecessary if the Bison output files `c-parse.c' and `cexp.c' are
     more recent than `c-parse.y' and `cexp.y' and you do not plan to
     change the `.y' files.)

     Bison versions older than Sept 8, 1988 will produce incorrect
     output for `c-parse.c'.

  7. If you have chosen a configuration for GNU CC which requires other
     GNU tools (such as GAS or the GNU linker) instead of the standard
     system tools, install the required tools in the build directory
     under the names `as', `ld' or whatever is appropriate.  This will
     enable the compiler to find the proper tools for compilation of
     the program `enquire'.

     Alternatively, you can do subsequent compilation using a value of
     the `PATH' environment variable such that the necessary GNU tools
     come before the standard system tools.

  8. Build the compiler.  Just type `make LANGUAGES=c' in the compiler
     directory.

     `LANGUAGES=c' specifies that only the C compiler should be
     compiled.  The makefile normally builds compilers for all the
     supported languages; currently, C, C++ and Objective C.  However,
     C is the only language that is sure to work when you build with
     other non-GNU C compilers.  In addition, building anything but C
     at this stage is a waste of time.

     In general, you can specify the languages to build by typing the
     argument `LANGUAGES="LIST"', where LIST is one or more words from
     the list `c', `c++', and `objective-c'.  If you have any
     additional GNU compilers as subdirectories of the GNU CC source
     directory, you may also specify their names in this list.

     Ignore any warnings you may see about "statement not reached" in
     `insn-emit.c'; they are normal.  Also, warnings about "unknown
     escape sequence" are normal in `genopinit.c' and perhaps some
     other files.  Likewise, you should ignore warnings about "constant
     is so large that it is unsigned" in `insn-emit.c' and
     `insn-recog.c' and a warning about a comparison always being zero
     in `enquire.o'.  Any other compilation errors may represent bugs in
     the port to your machine or operating system, and should be
     investigated and reported.

     Some commercial compilers fail to compile GNU CC because they have
     bugs or limitations.  For example, the Microsoft compiler is said
     to run out of macro space.  Some Ultrix compilers run out of
     expression space; then you need to break up the statement where
     the problem happens.

  9. If you are building a cross-compiler, stop here.  *Note
     Cross-Compiler::.

 10. Move the first-stage object files and executables into a
     subdirectory with this command:

          make stage1

     The files are moved into a subdirectory named `stage1'.  Once
     installation is complete, you may wish to delete these files with
     `rm -r stage1'.

 11. If you have chosen a configuration for GNU CC which requires other
     GNU tools (such as GAS or the GNU linker) instead of the standard
     system tools, install the required tools in the `stage1'
     subdirectory under the names `as', `ld' or whatever is
     appropriate.  This will enable the stage 1 compiler to find the
     proper tools in the following stage.

     Alternatively, you can do subsequent compilation using a value of
     the `PATH' environment variable such that the necessary GNU tools
     come before the standard system tools.

 12. Recompile the compiler with itself, with this command:

          make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2"

     This is called making the stage 2 compiler.

     The command shown above builds compilers for all the supported
     languages.  If you don't want them all, you can specify the
     languages to build by typing the argument `LANGUAGES="LIST"'.  LIST
     should contain one or more words from the list `c', `c++',
     `objective-c', and `proto'.  Separate the words with spaces.
     `proto' stands for the programs `protoize' and `unprotoize'; they
     are not a separate language, but you use `LANGUAGES' to enable or
     disable their installation.

     If you are going to build the stage 3 compiler, then you might
     want to build only the C language in stage 2.

     Once you have built the stage 2 compiler, if you are short of disk
     space, you can delete the subdirectory `stage1'.

     On a 68000 or 68020 system lacking floating point hardware, unless
     you have selected a `tm.h' file that expects by default that there
     is no such hardware, do this instead:

          make CC="stage1/xgcc -Bstage1/" CFLAGS="-g -O2 -msoft-float"

 13. If you wish to test the compiler by compiling it with itself one
     more time, install any other necessary GNU tools (such as GAS or
     the GNU linker) in the `stage2' subdirectory as you did in the
     `stage1' subdirectory, then do this:

          make stage2
          make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2"

     This is called making the stage 3 compiler.  Aside from the `-B'
     option, the compiler options should be the same as when you made
     the stage 2 compiler.  But the `LANGUAGES' option need not be the
     same.  The command shown above builds compilers for all the
     supported languages; if you don't want them all, you can specify
     the languages to build by typing the argument `LANGUAGES="LIST"',
     as described above.

     If you do not have to install any additional GNU tools, you may
     use the command

          make bootstrap LANGUAGES=LANGUAGE-LIST BOOT_CFLAGS=OPTION-LIST

     instead of making `stage1', `stage2', and performing the two
     compiler builds.

 14. Then compare the latest object files with the stage 2 object
     files--they ought to be identical, aside from time stamps (if any).

     On some systems, meaningful comparison of object files is
     impossible; they always appear "different."  This is currently
     true on Solaris and some systems that use ELF object file format.
     On some versions of Irix on SGI machines and DEC Unix (OSF/1) on
     Alpha systems, you will not be able to compare the files without
     specifying `-save-temps'; see the description of individual
     systems above to see if you get comparison failures.  You may have
     similar problems on other systems.

     Use this command to compare the files:

          make compare

     This will mention any object files that differ between stage 2 and
     stage 3.  Any difference, no matter how innocuous, indicates that
     the stage 2 compiler has compiled GNU CC incorrectly, and is
     therefore a potentially serious bug which you should investigate
     and report.

     If your system does not put time stamps in the object files, then
     this is a faster way to compare them (using the Bourne shell):

          for file in *.o; do
          cmp $file stage2/$file
          done

     If you have built the compiler with the `-mno-mips-tfile' option on
     MIPS machines, you will not be able to compare the files.

 15. Install the compiler driver, the compiler's passes and run-time
     support with `make install'.  Use the same value for `CC',
     `CFLAGS' and `LANGUAGES' that you used when compiling the files
     that are being installed.  One reason this is necessary is that
     some versions of Make have bugs and recompile files gratuitously
     when you do this step.  If you use the same variable values, those
     files will be recompiled properly.

     For example, if you have built the stage 2 compiler, you can use
     the following command:

          make install CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O" LANGUAGES="LIST"

     This copies the files `cc1', `cpp' and `libgcc.a' to files `cc1',
     `cpp' and `libgcc.a' in the directory
     `/usr/local/lib/gcc-lib/TARGET/VERSION', which is where the
     compiler driver program looks for them.  Here TARGET is the target
     machine type specified when you ran `configure', and VERSION is
     the version number of GNU CC.  This naming scheme permits various
     versions and/or cross-compilers to coexist.  It also copies the
     executables for compilers for other languages (e.g., `cc1plus' for
     C++) to the same directory.

     This also copies the driver program `xgcc' into
     `/usr/local/bin/gcc', so that it appears in typical execution
     search paths.  It also copies `gcc.1' into `/usr/local/man/man1'
     and info pages into `/usr/local/info'.

     On some systems, this command causes recompilation of some files.
     This is usually due to bugs in `make'.  You should either ignore
     this problem, or use GNU Make.

     *Warning: there is a bug in `alloca' in the Sun library.  To avoid
     this bug, be sure to install the executables of GNU CC that were
     compiled by GNU CC.  (That is, the executables from stage 2 or 3,
     not stage 1.)  They use `alloca' as a built-in function and never
     the one in the library.*

     (It is usually better to install GNU CC executables from stage 2
     or 3, since they usually run faster than the ones compiled with
     some other compiler.)

 16. If you're going to use C++, it's likely that you need to also
     install a C++ runtime library.  Just as GNU C does not distribute
     a C runtime library, it also does not include a C++ runtime
     library.  All I/O functionality, special class libraries, etc., are
     provided by the C++ runtime library.

     Here's one way to build and install a C++ runtime library for GNU
     CC:

        * Build and install GNU CC, so that invoking `gcc' obtains the
          GNU CC that was just built.

        * Obtain a copy of a compatible `libstdc++' distribution.  For
          example, the `libstdc++-2.8.0.tar.gz' distribution should be
          compatible with GCC 2.8.0.  GCC distributors normally
          distribute `libstdc++' as well.

        * Set the `CXX' environment variable to `gcc' while running the
          `libstdc++' distribution's `configure' command.  Use the same
          `configure' options that you used when you invoked GCC's
          `configure' command.

        * Invoke `make' to build the C++ runtime.

        * Invoke `make install' to install the C++ runtime.

     To summarize, after building and installing GNU CC, invoke the
     following shell commands in the topmost directory of the C++
     library distribution.  For CONFIGURE-OPTIONS, use the same options
     that you used to configure GNU CC.

          $ CXX=gcc ./configure CONFIGURE-OPTIONS
          $ make
          $ make install

 17. GNU CC includes a runtime library for Objective-C because it is an
     integral part of the language.  You can find the files associated
     with the library in the subdirectory `objc'.  The GNU Objective-C
     Runtime Library requires header files for the target's C library in
     order to be compiled,and also requires the header files for the
     target's thread library if you want thread support.  *Note
     Cross-Compilers and Header Files: Cross Headers, for discussion
     about header files issues for cross-compilation.

     When you run `configure', it picks the appropriate Objective-C
     thread implementation file for the target platform.  In some
     situations, you may wish to choose a different back-end as some
     platforms support multiple thread implementations or you may wish
     to disable thread support completely.  You do this by specifying a
     value for the OBJC_THREAD_FILE makefile variable on the command
     line when you run make, for example:

          make CC="stage2/xgcc -Bstage2/" CFLAGS="-g -O2" OBJC_THREAD_FILE=thr-single

     Below is a list of the currently available back-ends.

        * thr-single Disable thread support, should work for all
          platforms.

        * thr-decosf1 DEC OSF/1 thread support.

        * thr-irix SGI IRIX thread support.

        * thr-mach Generic MACH thread support, known to work on
          NEXTSTEP.

        * thr-os2 IBM OS/2 thread support.

        * thr-posix Generix POSIX thread support.

        * thr-pthreads PCThreads on Linux-based GNU systems.

        * thr-solaris SUN Solaris thread support.

        * thr-win32 Microsoft Win32 API thread support.

Configurations Supported by GNU CC
==================================

   Here are the possible CPU types:

     1750a, a29k, alpha, arm, cN, clipper, dsp16xx, elxsi, h8300,
     hppa1.0, hppa1.1, i370, i386, i486, i586, i860, i960, m32r,
     m68000, m68k, m88k, mips, mipsel, mips64, mips64el, ns32k,
     powerpc, powerpcle, pyramid, romp, rs6000, sh, sparc, sparclite,
     sparc64, vax, we32k.

   Here are the recognized company names.  As you can see, customary
abbreviations are used rather than the longer official names.

     acorn, alliant, altos, apollo, apple, att, bull, cbm, convergent,
     convex, crds, dec, dg, dolphin, elxsi, encore, harris, hitachi,
     hp, ibm, intergraph, isi, mips, motorola, ncr, next, ns, omron,
     plexus, sequent, sgi, sony, sun, tti, unicom, wrs.

   The company name is meaningful only to disambiguate when the rest of
the information supplied is insufficient.  You can omit it, writing
just `CPU-SYSTEM', if it is not needed.  For example, `vax-ultrix4.2'
is equivalent to `vax-dec-ultrix4.2'.

   Here is a list of system types:

     386bsd, aix, acis, amigaos, aos, aout, aux, bosx, bsd, clix, coff,
     ctix, cxux, dgux, dynix, ebmon, ecoff, elf, esix, freebsd, hms,
     genix, gnu, linux-gnu, hiux, hpux, iris, irix, isc, luna, lynxos,
     mach, minix, msdos, mvs, netbsd, newsos, nindy, ns, osf, osfrose,
     ptx, riscix, riscos, rtu, sco, sim, solaris, sunos, sym, sysv,
     udi, ultrix, unicos, uniplus, unos, vms, vsta, vxworks, winnt,
     xenix.

You can omit the system type; then `configure' guesses the operating
system from the CPU and company.

   You can add a version number to the system type; this may or may not
make a difference.  For example, you can write `bsd4.3' or `bsd4.4' to
distinguish versions of BSD.  In practice, the version number is most
needed for `sysv3' and `sysv4', which are often treated differently.

   If you specify an impossible combination such as `i860-dg-vms', then
you may get an error message from `configure', or it may ignore part of
the information and do the best it can with the rest.  `configure'
always prints the canonical name for the alternative that it used.  GNU
CC does not support all possible alternatives.

   Often a particular model of machine has a name.  Many machine names
are recognized as aliases for CPU/company combinations.  Thus, the
machine name `sun3', mentioned above, is an alias for `m68k-sun'.
Sometimes we accept a company name as a machine name, when the name is
popularly used for a particular machine.  Here is a table of the known
machine names:

     3300, 3b1, 3bN, 7300, altos3068, altos, apollo68, att-7300,
     balance, convex-cN, crds, decstation-3100, decstation, delta,
     encore, fx2800, gmicro, hp7NN, hp8NN, hp9k2NN, hp9k3NN, hp9k7NN,
     hp9k8NN, iris4d, iris, isi68, m3230, magnum, merlin, miniframe,
     mmax, news-3600, news800, news, next, pbd, pc532, pmax, powerpc,
     powerpcle, ps2, risc-news, rtpc, sun2, sun386i, sun386, sun3,
     sun4, symmetry, tower-32, tower.

Remember that a machine name specifies both the cpu type and the company
name.  If you want to install your own homemade configuration files,
you can use `local' as the company name to access them.  If you use
configuration `CPU-local', the configuration name without the cpu prefix
is used to form the configuration file names.

   Thus, if you specify `m68k-local', configuration uses files
`m68k.md', `local.h', `m68k.c', `xm-local.h', `t-local', and `x-local',
all in the directory `config/m68k'.

   Here is a list of configurations that have special treatment or
special things you must know:

`1750a-*-*'
     MIL-STD-1750A processors.

     The MIL-STD-1750A cross configuration produces output for
     `as1750', an assembler/linker available under the GNU Public
     License for the 1750A. `as1750' can be obtained at
     *ftp://ftp.fta-berlin.de/pub/crossgcc/1750gals/*.  A similarly
     licensed simulator for the 1750A is available from same address.

     You should ignore a fatal error during the building of libgcc
     (libgcc is not yet implemented for the 1750A.)

     The `as1750' assembler requires the file `ms1750.inc', which is
     found in the directory `config/1750a'.

     GNU CC produced the same sections as the Fairchild F9450 C
     Compiler, namely:

    `Normal'
          The program code section.

    `Static'
          The read/write (RAM) data section.

    `Konst'
          The read-only (ROM) constants section.

    `Init'
          Initialization section (code to copy KREL to SREL).

     The smallest addressable unit is 16 bits (BITS_PER_UNIT is 16).
     This means that type `char' is represented with a 16-bit word per
     character.  The 1750A's "Load/Store Upper/Lower Byte" instructions
     are not used by GNU CC.

`alpha-*-osf1'
     Systems using processors that implement the DEC Alpha architecture
     and are running the DEC Unix (OSF/1) operating system, for example
     the DEC Alpha AXP systems.CC.)

     GNU CC writes a `.verstamp' directive to the assembler output file
     unless it is built as a cross-compiler.  It gets the version to
     use from the system header file `/usr/include/stamp.h'.  If you
     install a new version of DEC Unix, you should rebuild GCC to pick
     up the new version stamp.

     Note that since the Alpha is a 64-bit architecture,
     cross-compilers from 32-bit machines will not generate code as
     efficient as that generated when the compiler is running on a
     64-bit machine because many optimizations that depend on being
     able to represent a word on the target in an integral value on the
     host cannot be performed.  Building cross-compilers on the Alpha
     for 32-bit machines has only been tested in a few cases and may
     not work properly.

     `make compare' may fail on old versions of DEC Unix unless you add
     `-save-temps' to `CFLAGS'.  On these systems, the name of the
     assembler input file is stored in the object file, and that makes
     comparison fail if it differs between the `stage1' and `stage2'
     compilations.  The option `-save-temps' forces a fixed name to be
     used for the assembler input file, instead of a randomly chosen
     name in `/tmp'.  Do not add `-save-temps' unless the comparisons
     fail without that option.  If you add `-save-temps', you will have
     to manually delete the `.i' and `.s' files after each series of
     compilations.

     GNU CC now supports both the native (ECOFF) debugging format used
     by DBX and GDB and an encapsulated STABS format for use only with
     GDB.  See the discussion of the `--with-stabs' option of
     `configure' above for more information on these formats and how to
     select them.

     There is a bug in DEC's assembler that produces incorrect line
     numbers for ECOFF format when the `.align' directive is used.  To
     work around this problem, GNU CC will not emit such alignment
     directives while writing ECOFF format debugging information even
     if optimization is being performed.  Unfortunately, this has the
     very undesirable side-effect that code addresses when `-O' is
     specified are different depending on whether or not `-g' is also
     specified.

     To avoid this behavior, specify `-gstabs+' and use GDB instead of
     DBX.  DEC is now aware of this problem with the assembler and
     hopes to provide a fix shortly.

`arc-*-elf'
     Argonaut ARC processor.  This configuration is intended for
     embedded systems.

`arm-*-aout'
     Advanced RISC Machines ARM-family processors.  These are often
     used in embedded applications.  There are no standard Unix
     configurations.  This configuration corresponds to the basic
     instruction sequences and will produce `a.out' format object
     modules.

     You may need to make a variant of the file `arm.h' for your
     particular configuration.

`arm-*-linuxaout'
     Any of the ARM family processors running the Linux-based GNU
     system with the `a.out' binary format (ELF is not yet supported).
     You must use version 2.8.1.0.7 or later of the GNU/Linux binutils,
     which you can download from `sunsite.unc.edu:/pub/Linux/GCC' and
     other mirror sites for Linux-based GNU systems.

`arm-*-riscix'
     The ARM2 or ARM3 processor running RISC iX, Acorn's port of BSD
     Unix.  If you are running a version of RISC iX prior to 1.2 then
     you must specify the version number during configuration.  Note
     that the assembler shipped with RISC iX does not support stabs
     debugging information; a new version of the assembler, with stabs
     support included, is now available from Acorn and via ftp
     `ftp.acorn.com:/pub/riscix/as+xterm.tar.Z'.  To enable stabs
     debugging, pass `--with-gnu-as' to configure.

     You will need to install GNU `sed' before you can run configure.

`a29k'
     AMD Am29k-family processors.  These are normally used in embedded
     applications.  There are no standard Unix configurations.  This
     configuration corresponds to AMD's standard calling sequence and
     binary interface and is compatible with other 29k tools.

     You may need to make a variant of the file `a29k.h' for your
     particular configuration.

`a29k-*-bsd'
     AMD Am29050 used in a system running a variant of BSD Unix.

`decstation-*'
     DECstations can support three different personalities: Ultrix, DEC
     OSF/1, and OSF/rose.  To configure GCC for these platforms use the
     following configurations:

    `decstation-ultrix'
          Ultrix configuration.

    `decstation-osf1'
          Dec's version of OSF/1.

    `decstation-osfrose'
          Open Software Foundation reference port of OSF/1 which uses
          the OSF/rose object file format instead of ECOFF.  Normally,
          you would not select this configuration.

     The MIPS C compiler needs to be told to increase its table size
     for switch statements with the `-Wf,-XNg1500' option in order to
     compile `cp/parse.c'.  If you use the `-O2' optimization option,
     you also need to use `-Olimit 3000'.  Both of these options are
     automatically generated in the `Makefile' that the shell script
     `configure' builds.  If you override the `CC' make variable and
     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
     3000'.

`elxsi-elxsi-bsd'
     The Elxsi's C compiler has known limitations that prevent it from
     compiling GNU C.  Please contact `mrs@cygnus.com' for more details.

`dsp16xx'
     A port to the AT&T DSP1610 family of processors.

`h8300-*-*'
     Hitachi H8/300 series of processors.

     The calling convention and structure layout has changed in release
     2.6.  All code must be recompiled.  The calling convention now
     passes the first three arguments in function calls in registers.
     Structures are no longer a multiple of 2 bytes.

`hppa*-*-*'
     There are several variants of the HP-PA processor which run a
     variety of operating systems.  GNU CC must be configured to use
     the correct processor type and operating system, or GNU CC will
     not function correctly.  The easiest way to handle this problem is
     to *not* specify a target when configuring GNU CC, the `configure'
     script will try to automatically determine the right processor
     type and operating system.

     `-g' does not work on HP-UX, since that system uses a peculiar
     debugging format which GNU CC does not know about.  However, `-g'
     will work if you also use GAS and GDB in conjunction with GCC.  We
     highly recommend using GAS for all HP-PA configurations.

     You should be using GAS-2.6 (or later) along with GDB-4.16 (or
     later).  These can be retrieved from all the traditional GNU ftp
     archive sites.

     GAS will need to be installed into a directory before `/bin',
     `/usr/bin', and `/usr/ccs/bin' in your search path.  You should
     install GAS before you build GNU CC.

     To enable debugging, you must configure GNU CC with the
     `--with-gnu-as' option before building.

`i370-*-*'
     This port is very preliminary and has many known bugs.  We hope to
     have a higher-quality port for this machine soon.

`i386-*-linux-gnuoldld'
     Use this configuration to generate `a.out' binaries on Linux-based
     GNU systems if you do not have gas/binutils version 2.5.2 or later
     installed. This is an obsolete configuration.

`i386-*-linux-gnuaout'
     Use this configuration to generate `a.out' binaries on Linux-based
     GNU systems. This configuration is being superseded. You must use
     gas/binutils version 2.5.2 or later.

`i386-*-linux-gnu'
     Use this configuration to generate ELF binaries on Linux-based GNU
     systems.  You must use gas/binutils version 2.5.2 or later.

`i386-*-sco'
     Compilation with RCC is recommended.  Also, it may be a good idea
     to link with GNU malloc instead of the malloc that comes with the
     system.

`i386-*-sco3.2v4'
     Use this configuration for SCO release 3.2 version 4.

`i386-*-sco3.2v5*'
     Use this for the SCO OpenServer Release family including 5.0.0,
     5.0.2, 5.0.4, Internet FastStart 1.0, and Internet FastStart 1.1.

     GNU CC can generate ELF binaries (if you specify `-melf') or COFF
     binaries (the default).  If you are going to build your compiler
     in ELF mode (once you have bootstrapped the first stage compiler)
     you *must* specify `-melf' as part of `CC', *not* `CFLAGS', for
     example as `CC="stage1/xgcc -melf -Bstage1/" '.  If you do not do
     this, the bootstrap will generate incorrect versions of `libgcc.a'.

     You must have TLS597 (from ftp.sco.com/TLS) installed for ELF
     binaries to work correctly. Note that Open Server 5.0.2 *does*
     need TLS597 installed.

     *NOTE:* You must follow the instructions about invoking `make
     bootstrap' because the native OpenServer compiler builds a
     `cc1plus' that will not correctly parse many valid C++ programs.
     You must do a `make bootstrap' if you are building with the native
     compiler.

`i386-*-isc'
     It may be a good idea to link with GNU malloc instead of the
     malloc that comes with the system.

     In ISC version 4.1, `sed' core dumps when building `deduced.h'.
     Use the version of `sed' from version 4.0.

`i386-*-esix'
     It may be good idea to link with GNU malloc instead of the malloc
     that comes with the system.

`i386-ibm-aix'
     You need to use GAS version 2.1 or later, and LD from GNU binutils
     version 2.2 or later.

`i386-sequent-bsd'
     Go to the Berkeley universe before compiling.

`i386-sequent-ptx1*'
     Sequent DYNIX/ptx 1.x.

`i386-sequent-ptx2*'
     Sequent DYNIX/ptx 2.x.

`i386-sun-sunos4'
     You may find that you need another version of GNU CC to begin
     bootstrapping with, since the current version when built with the
     system's own compiler seems to get an infinite loop compiling part
     of `libgcc2.c'.  GNU CC version 2 compiled with GNU CC (any
     version) seems not to have this problem.

     See *Note Sun Install::, for information on installing GNU CC on
     Sun systems.

`i[345]86-*-winnt3.5'
     This version requires a GAS that has not yet been released.  Until
     it is, you can get a prebuilt binary version via anonymous ftp from
     `cs.washington.edu:pub/gnat' or `cs.nyu.edu:pub/gnat'. You must
     also use the Microsoft header files from the Windows NT 3.5 SDK.
     Find these on the CDROM in the `/mstools/h' directory dated
     9/4/94.  You must use a fixed version of Microsoft linker made
     especially for NT 3.5, which is also is available on the NT 3.5
     SDK CDROM.  If you do not have this linker, can you also use the
     linker from Visual C/C++ 1.0 or 2.0.

     Installing GNU CC for NT builds a wrapper linker, called `ld.exe',
     which mimics the behaviour of Unix `ld' in the specification of
     libraries (`-L' and `-l').  `ld.exe' looks for both Unix and
     Microsoft named libraries.  For example, if you specify `-lfoo',
     `ld.exe' will look first for `libfoo.a' and then for `foo.lib'.

     You may install GNU CC for Windows NT in one of two ways,
     depending on whether or not you have a Unix-like shell and various
     Unix-like utilities.

       1. If you do not have a Unix-like shell and few Unix-like
          utilities, you will use a DOS style batch script called
          `configure.bat'.  Invoke it as `configure winnt' from an
          MSDOS console window or from the program manager dialog box.
          `configure.bat' assumes you have already installed and have
          in your path a Unix-like `sed' program which is used to
          create a working `Makefile' from `Makefile.in'.

          `Makefile' uses the Microsoft Nmake program maintenance
          utility and the Visual C/C++ V8.00 compiler to build GNU CC.
          You need only have the utilities `sed' and `touch' to use
          this installation method, which only automatically builds the
          compiler itself.  You must then examine what `fixinc.winnt'
          does, edit the header files by hand and build `libgcc.a'
          manually.

       2. The second type of installation assumes you are running a
          Unix-like shell, have a complete suite of Unix-like utilities
          in your path, and have a previous version of GNU CC already
          installed, either through building it via the above
          installation method or acquiring a pre-built binary.  In this
          case, use the `configure' script in the normal fashion.

`i860-intel-osf1'
     This is the Paragon.  If you have version 1.0 of the operating
     system, you need to take special steps to build GNU CC due to
     peculiarities of the system.  Newer system versions have no
     problem.  See the section `Installation Problems' in the GNU CC
     Manual.

`*-lynx-lynxos'
     LynxOS 2.2 and earlier comes with GNU CC 1.x already installed as
     `/bin/gcc'.  You should compile with this instead of `/bin/cc'.
     You can tell GNU CC to use the GNU assembler and linker, by
     specifying `--with-gnu-as --with-gnu-ld' when configuring.  These
     will produce COFF format object files and executables;  otherwise
     GNU CC will use the installed tools, which produce `a.out' format
     executables.

`m32r-*-elf'
     Mitsubishi M32R processor.  This configuration is intended for
     embedded systems.

`m68000-hp-bsd'
     HP 9000 series 200 running BSD.  Note that the C compiler that
     comes with this system cannot compile GNU CC; contact
     `law@cs.utah.edu' to get binaries of GNU CC for bootstrapping.

`m68k-altos'
     Altos 3068.  You must use the GNU assembler, linker and debugger.
     Also, you must fix a kernel bug.  Details in the file
     `README.ALTOS'.

`m68k-apple-aux'
     Apple Macintosh running A/UX.  You may configure GCC  to use
     either the system assembler and linker or the GNU assembler and
     linker.  You should use the GNU configuration if you can,
     especially if you also want to use GNU C++.  You enabled that
     configuration with + the `--with-gnu-as' and `--with-gnu-ld'
     options to `configure'.

     Note the C compiler that comes with this system cannot compile GNU
     CC.  You can fine binaries of GNU CC for bootstrapping on
     `jagubox.gsfc.nasa.gov'.  You will also a patched version of
     `/bin/ld' there that raises some of the arbitrary limits found in
     the original.

`m68k-att-sysv'
     AT&T 3b1, a.k.a. 7300 PC.  Special procedures are needed to
     compile GNU CC with this machine's standard C compiler, due to
     bugs in that compiler.  You can bootstrap it more easily with
     previous versions of GNU CC if you have them.

     Installing GNU CC on the 3b1 is difficult if you do not already
     have GNU CC running, due to bugs in the installed C compiler.
     However, the following procedure might work.  We are unable to
     test it.

       1. Comment out the `#include "config.h"' line near the start of
          `cccp.c' and do `make cpp'.  This makes a preliminary version
          of GNU cpp.

       2. Save the old `/lib/cpp' and copy the preliminary GNU cpp to
          that file name.

       3. Undo your change in `cccp.c', or reinstall the original
          version, and do `make cpp' again.

       4. Copy this final version of GNU cpp into `/lib/cpp'.

       5. Replace every occurrence of `obstack_free' in the file
          `tree.c' with `_obstack_free'.

       6. Run `make' to get the first-stage GNU CC.

       7. Reinstall the original version of `/lib/cpp'.

       8. Now you can compile GNU CC with itself and install it in the
          normal fashion.

`m68k-bull-sysv'
     Bull DPX/2 series 200 and 300 with BOS-2.00.45 up to BOS-2.01. GNU
     CC works either with native assembler or GNU assembler. You can use
     GNU assembler with native coff generation by providing
     `--with-gnu-as' to the configure script or use GNU assembler with
     dbx-in-coff encapsulation by providing `--with-gnu-as --stabs'.
     For any problem with native assembler or for availability of the
     DPX/2 port of GAS, contact `F.Pierresteguy@frcl.bull.fr'.

`m68k-crds-unox'
     Use `configure unos' for building on Unos.

     The Unos assembler is named `casm' instead of `as'.  For some
     strange reason linking `/bin/as' to `/bin/casm' changes the
     behavior, and does not work.  So, when installing GNU CC, you
     should install the following script as `as' in the subdirectory
     where the passes of GCC are installed:

          #!/bin/sh
          casm $*

     The default Unos library is named `libunos.a' instead of `libc.a'.
     To allow GNU CC to function, either change all references to
     `-lc' in `gcc.c' to `-lunos' or link `/lib/libc.a' to
     `/lib/libunos.a'.

     When compiling GNU CC with the standard compiler, to overcome bugs
     in the support of `alloca', do not use `-O' when making stage 2.
     Then use the stage 2 compiler with `-O' to make the stage 3
     compiler.  This compiler will have the same characteristics as the
     usual stage 2 compiler on other systems.  Use it to make a stage 4
     compiler and compare that with stage 3 to verify proper
     compilation.

     (Perhaps simply defining `ALLOCA' in `x-crds' as described in the
     comments there will make the above paragraph superfluous.  Please
     inform us of whether this works.)

     Unos uses memory segmentation instead of demand paging, so you
     will need a lot of memory.  5 Mb is barely enough if no other
     tasks are running.  If linking `cc1' fails, try putting the object
     files into a library and linking from that library.

`m68k-hp-hpux'
     HP 9000 series 300 or 400 running HP-UX.  HP-UX version 8.0 has a
     bug in the assembler that prevents compilation of GNU CC.  To fix
     it, get patch PHCO_4484 from HP.

     In addition, if you wish to use gas `--with-gnu-as' you must use
     gas version 2.1 or later, and you must use the GNU linker version
     2.1 or later.  Earlier versions of gas relied upon a program which
     converted the gas output into the native HP/UX format, but that
     program has not been kept up to date.  gdb does not understand
     that native HP/UX format, so you must use gas if you wish to use
     gdb.

`m68k-sun'
     Sun 3.  We do not provide a configuration file to use the Sun FPA
     by default, because programs that establish signal handlers for
     floating point traps inherently cannot work with the FPA.

     See *Note Sun Install::, for information on installing GNU CC on
     Sun systems.

`m88k-*-svr3'
     Motorola m88k running the AT&T/Unisoft/Motorola V.3 reference port.
     These systems tend to use the Green Hills C, revision 1.8.5, as the
     standard C compiler.  There are apparently bugs in this compiler
     that result in object files differences between stage 2 and stage
     3.  If this happens, make the stage 4 compiler and compare it to
     the stage 3 compiler.  If the stage 3 and stage 4 object files are
     identical, this suggests you encountered a problem with the
     standard C compiler; the stage 3 and 4 compilers may be usable.

     It is best, however, to use an older version of GNU CC for
     bootstrapping if you have one.

`m88k-*-dgux'
     Motorola m88k running DG/UX.  To build 88open BCS native or cross
     compilers on DG/UX, specify the configuration name as
     `m88k-*-dguxbcs' and build in the 88open BCS software development
     environment.  To build ELF native or cross compilers on DG/UX,
     specify `m88k-*-dgux' and build in the DG/UX ELF development
     environment.  You set the software development environment by
     issuing `sde-target' command and specifying either `m88kbcs' or
     `m88kdguxelf' as the operand.

     If you do not specify a configuration name, `configure' guesses the
     configuration based on the current software development
     environment.

`m88k-tektronix-sysv3'
     Tektronix XD88 running UTekV 3.2e.  Do not turn on optimization
     while building stage1 if you bootstrap with the buggy Green Hills
     compiler.  Also, The bundled LAI System V NFS is buggy so if you
     build in an NFS mounted directory, start from a fresh reboot, or
     avoid NFS all together.  Otherwise you may have trouble getting
     clean comparisons between stages.

`mips-mips-bsd'
     MIPS machines running the MIPS operating system in BSD mode.  It's
     possible that some old versions of the system lack the functions
     `memcpy', `memcmp', and `memset'.  If your system lacks these, you
     must remove or undo the definition of `TARGET_MEM_FUNCTIONS' in
     `mips-bsd.h'.

     The MIPS C compiler needs to be told to increase its table size
     for switch statements with the `-Wf,-XNg1500' option in order to
     compile `cp/parse.c'.  If you use the `-O2' optimization option,
     you also need to use `-Olimit 3000'.  Both of these options are
     automatically generated in the `Makefile' that the shell script
     `configure' builds.  If you override the `CC' make variable and
     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
     3000'.

`mips-mips-riscos*'
     The MIPS C compiler needs to be told to increase its table size
     for switch statements with the `-Wf,-XNg1500' option in order to
     compile `cp/parse.c'.  If you use the `-O2' optimization option,
     you also need to use `-Olimit 3000'.  Both of these options are
     automatically generated in the `Makefile' that the shell script
     `configure' builds.  If you override the `CC' make variable and
     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
     3000'.

     MIPS computers running RISC-OS can support four different
     personalities: default, BSD 4.3, System V.3, and System V.4 (older
     versions of RISC-OS don't support V.4).  To configure GCC for
     these platforms use the following configurations:

    `mips-mips-riscos`rev''
          Default configuration for RISC-OS, revision `rev'.

    `mips-mips-riscos`rev'bsd'
          BSD 4.3 configuration for RISC-OS, revision `rev'.

    `mips-mips-riscos`rev'sysv4'
          System V.4 configuration for RISC-OS, revision `rev'.

    `mips-mips-riscos`rev'sysv'
          System V.3 configuration for RISC-OS, revision `rev'.

     The revision `rev' mentioned above is the revision of RISC-OS to
     use.  You must reconfigure GCC when going from a RISC-OS revision
     4 to RISC-OS revision 5.  This has the effect of avoiding a linker
     bug.

`mips-sgi-*'
     In order to compile GCC on an SGI running IRIX 4, the "c.hdr.lib"
     option must be installed from the CD-ROM supplied from Silicon
     Graphics.  This is found on the 2nd CD in release 4.0.1.

     In order to compile GCC on an SGI running IRIX 5, the
     "compiler_dev.hdr" subsystem must be installed from the IDO CD-ROM
     supplied by Silicon Graphics.

     `make compare' may fail on version 5 of IRIX unless you add
     `-save-temps' to `CFLAGS'.  On these systems, the name of the
     assembler input file is stored in the object file, and that makes
     comparison fail if it differs between the `stage1' and `stage2'
     compilations.  The option `-save-temps' forces a fixed name to be
     used for the assembler input file, instead of a randomly chosen
     name in `/tmp'.  Do not add `-save-temps' unless the comparisons
     fail without that option.  If you do you `-save-temps', you will
     have to manually delete the `.i' and `.s' files after each series
     of compilations.

     The MIPS C compiler needs to be told to increase its table size
     for switch statements with the `-Wf,-XNg1500' option in order to
     compile `cp/parse.c'.  If you use the `-O2' optimization option,
     you also need to use `-Olimit 3000'.  Both of these options are
     automatically generated in the `Makefile' that the shell script
     `configure' builds.  If you override the `CC' make variable and
     use the MIPS compilers, you may need to add `-Wf,-XNg1500 -Olimit
     3000'.

     On Irix version 4.0.5F, and perhaps on some other versions as well,
     there is an assembler bug that reorders instructions incorrectly.
     To work around it, specify the target configuration
     `mips-sgi-irix4loser'.  This configuration inhibits assembler
     optimization.

     In a compiler configured with target `mips-sgi-irix4', you can turn
     off assembler optimization by using the `-noasmopt' option.  This
     compiler option passes the option `-O0' to the assembler, to
     inhibit reordering.

     The `-noasmopt' option can be useful for testing whether a problem
     is due to erroneous assembler reordering.  Even if a problem does
     not go away with `-noasmopt', it may still be due to assembler
     reordering--perhaps GNU CC itself was miscompiled as a result.

     To enable debugging under Irix 5, you must use GNU as 2.5 or later,
     and use the `--with-gnu-as' configure option when configuring gcc.
     GNU as is distributed as part of the binutils package.

`mips-sony-sysv'
     Sony MIPS NEWS.  This works in NEWSOS 5.0.1, but not in 5.0.2
     (which uses ELF instead of COFF).  Support for 5.0.2 will probably
     be provided soon by volunteers.  In particular, the linker does
     not like the code generated by GCC when shared libraries are
     linked in.

`ns32k-encore'
     Encore ns32000 system.  Encore systems are supported only under
     BSD.

`ns32k-*-genix'
     National Semiconductor ns32000 system.  Genix has bugs in `alloca'
     and `malloc'; you must get the compiled versions of these from GNU
     Emacs.

`ns32k-sequent'
     Go to the Berkeley universe before compiling.

`ns32k-utek'
     UTEK ns32000 system ("merlin").  The C compiler that comes with
     this system cannot compile GNU CC; contact `tektronix!reed!mason'
     to get binaries of GNU CC for bootstrapping.

`romp-*-aos'
`romp-*-mach'
     The only operating systems supported for the IBM RT PC are AOS and
     MACH.  GNU CC does not support AIX running on the RT.  We
     recommend you compile GNU CC with an earlier version of itself; if
     you compile GNU CC with `hc', the Metaware compiler, it will work,
     but you will get mismatches between the stage 2 and stage 3
     compilers in various files.  These errors are minor differences in
     some floating-point constants and can be safely ignored; the stage
     3 compiler is correct.

`rs6000-*-aix'
`powerpc-*-aix'
     Various early versions of each release of the IBM XLC compiler
     will not bootstrap GNU CC.  Symptoms include differences between
     the stage2 and stage3 object files, and errors when compiling
     `libgcc.a' or `enquire'.  Known problematic releases include:
     xlc-1.2.1.8, xlc-1.3.0.0 (distributed with AIX 3.2.5), and
     xlc-1.3.0.19.  Both xlc-1.2.1.28 and xlc-1.3.0.24 (PTF 432238) are
     known to produce working versions of GNU CC, but most other recent
     releases correctly bootstrap GNU CC.  Also, releases of AIX prior
     to AIX 3.2.4 include a version of the IBM assembler which does not
     accept debugging directives: assembler updates are available as
     PTFs.  Also, if you are using AIX 3.2.5 or greater and the GNU
     assembler, you must have a version modified after October 16th,
     1995 in order for the GNU C compiler to build.  See the file
     `README.RS6000' for more details on of these problems.

     GNU CC does not yet support the 64-bit PowerPC instructions.

     Objective C does not work on this architecture because it makes
     assumptions that are incompatible with the calling conventions.

     AIX on the RS/6000 provides support (NLS) for environments outside
     of the United States.  Compilers and assemblers use NLS to support
     locale-specific representations of various objects including
     floating-point numbers ("." vs "," for separating decimal
     fractions).  There have been problems reported where the library
     linked with GNU CC does not produce the same floating-point
     formats that the assembler accepts.  If you have this problem, set
     the LANG environment variable to "C" or "En_US".

     Due to changes in the way that GNU CC invokes the binder (linker)
     for AIX 4.1, you may now receive warnings of duplicate symbols
     from the link step that were not reported before.  The assembly
     files generated by GNU CC for AIX have always included multiple
     symbol definitions for certain global variable and function
     declarations in the original program.  The warnings should not
     prevent the linker from producing a correct library or runnable
     executable.

     By default, AIX 4.1 produces code that can be used on either Power
     or PowerPC processors.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.

`powerpc-*-elf'
`powerpc-*-sysv4'
     PowerPC system in big endian mode, running System V.4.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.

`powerpc-*-linux-gnu'
     PowerPC system in big endian mode, running the Linux-based GNU
     system.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.

`powerpc-*-eabiaix'
     Embedded PowerPC system in big endian mode with -mcall-aix
     selected as the default.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.

`powerpc-*-eabisim'
     Embedded PowerPC system in big endian mode for use in running
     under the PSIM simulator.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.

`powerpc-*-eabi'
     Embedded PowerPC system in big endian mode.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.

`powerpcle-*-elf'
`powerpcle-*-sysv4'
     PowerPC system in little endian mode, running System V.4.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.

`powerpcle-*-solaris2*'
     PowerPC system in little endian mode, running Solaris 2.5.1 or
     higher.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.  Beta
     versions of the Sun 4.0 compiler do not seem to be able to build
     GNU CC correctly.  There are also problems with the host assembler
     and linker that are fixed by using the GNU versions of these tools.

`powerpcle-*-eabisim'
     Embedded PowerPC system in little endian mode for use in running
     under the PSIM simulator.

`powerpcle-*-eabi'
     Embedded PowerPC system in little endian mode.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.

`powerpcle-*-winnt'
`powerpcle-*-pe'
     PowerPC system in little endian mode running Windows NT.

     You can specify a default version for the `-mcpu='CPU_TYPE switch
     by using the configure option `--with-cpu-'CPU_TYPE.

`vax-dec-ultrix'
     Don't try compiling with Vax C (`vcc').  It produces incorrect code
     in some cases (for example, when `alloca' is used).

     Meanwhile, compiling `cp/parse.c' with pcc does not work because of
     an internal table size limitation in that compiler.  To avoid this
     problem, compile just the GNU C compiler first, and use it to
     recompile building all the languages that you want to run.

`sparc-sun-*'
     See *Note Sun Install::, for information on installing GNU CC on
     Sun systems.

`vax-dec-vms'
     See *Note VMS Install::, for details on how to install GNU CC on
     VMS.

`we32k-*-*'
     These computers are also known as the 3b2, 3b5, 3b20 and other
     similar names.  (However, the 3b1 is actually a 68000; see *Note
     Configurations::.)

     Don't use `-g' when compiling with the system's compiler.  The
     system's linker seems to be unable to handle such a large program
     with debugging information.

     The system's compiler runs out of capacity when compiling `stmt.c'
     in GNU CC.  You can work around this by building `cpp' in GNU CC
     first, then use that instead of the system's preprocessor with the
     system's C compiler to compile `stmt.c'.  Here is how:

          mv /lib/cpp /lib/cpp.att
          cp cpp /lib/cpp.gnu
          echo '/lib/cpp.gnu -traditional ${1+"$@"}' > /lib/cpp
          chmod +x /lib/cpp

     The system's compiler produces bad code for some of the GNU CC
     optimization files.  So you must build the stage 2 compiler without
     optimization.  Then build a stage 3 compiler with optimization.
     That executable should work.  Here are the necessary commands:

          make LANGUAGES=c CC=stage1/xgcc CFLAGS="-Bstage1/ -g"
          make stage2
          make CC=stage2/xgcc CFLAGS="-Bstage2/ -g -O"

     You may need to raise the ULIMIT setting to build a C++ compiler,
     as the file `cc1plus' is larger than one megabyte.

Compilation in a Separate Directory
===================================

   If you wish to build the object files and executables in a directory
other than the one containing the source files, here is what you must
do differently:

  1. Make sure you have a version of Make that supports the `VPATH'
     feature.  (GNU Make supports it, as do Make versions on most BSD
     systems.)

  2. If you have ever run `configure' in the source directory, you must
     undo the configuration.  Do this by running:

          make distclean

  3. Go to the directory in which you want to build the compiler before
     running `configure':

          mkdir gcc-sun3
          cd gcc-sun3

     On systems that do not support symbolic links, this directory must
     be on the same file system as the source code directory.

  4. Specify where to find `configure' when you run it:

          ../gcc/configure ...

     This also tells `configure' where to find the compiler sources;
     `configure' takes the directory from the file name that was used to
     invoke it.  But if you want to be sure, you can specify the source
     directory with the `--srcdir' option, like this:

          ../gcc/configure --srcdir=../gcc OTHER OPTIONS

     The directory you specify with `--srcdir' need not be the same as
     the one that `configure' is found in.

   Now, you can run `make' in that directory.  You need not repeat the
configuration steps shown above, when ordinary source files change.  You
must, however, run `configure' again when the configuration files
change, if your system does not support symbolic links.

Building and Installing a Cross-Compiler
========================================

   GNU CC can function as a cross-compiler for many machines, but not
all.

   * Cross-compilers for the Mips as target using the Mips assembler
     currently do not work, because the auxiliary programs
     `mips-tdump.c' and `mips-tfile.c' can't be compiled on anything
     but a Mips.  It does work to cross compile for a Mips if you use
     the GNU assembler and linker.

   * Cross-compilers between machines with different floating point
     formats have not all been made to work.  GNU CC now has a floating
     point emulator with which these can work, but each target machine
     description needs to be updated to take advantage of it.

   * Cross-compilation between machines of different word sizes is
     somewhat problematic and sometimes does not work.

   Since GNU CC generates assembler code, you probably need a
cross-assembler that GNU CC can run, in order to produce object files.
If you want to link on other than the target machine, you need a
cross-linker as well.  You also need header files and libraries suitable
for the target machine that you can install on the host machine.

Steps of Cross-Compilation
--------------------------

   To compile and run a program using a cross-compiler involves several
steps:

   * Run the cross-compiler on the host machine to produce assembler
     files for the target machine.  This requires header files for the
     target machine.

   * Assemble the files produced by the cross-compiler.  You can do this
     either with an assembler on the target machine, or with a
     cross-assembler on the host machine.

   * Link those files to make an executable.  You can do this either
     with a linker on the target machine, or with a cross-linker on the
     host machine.  Whichever machine you use, you need libraries and
     certain startup files (typically `crt....o') for the target
     machine.

   It is most convenient to do all of these steps on the same host
machine, since then you can do it all with a single invocation of GNU
CC.  This requires a suitable cross-assembler and cross-linker.  For
some targets, the GNU assembler and linker are available.

Configuring a Cross-Compiler
----------------------------

   To build GNU CC as a cross-compiler, you start out by running
`configure'.  Use the `--target=TARGET' to specify the target type.  If
`configure' was unable to correctly identify the system you are running
on, also specify the `--build=BUILD' option.  For example, here is how
to configure for a cross-compiler that produces code for an HP 68030
system running BSD on a system that `configure' can correctly identify:

     ./configure --target=m68k-hp-bsd4.3

Tools and Libraries for a Cross-Compiler
----------------------------------------

   If you have a cross-assembler and cross-linker available, you should
install them now.  Put them in the directory `/usr/local/TARGET/bin'.
Here is a table of the tools you should put in this directory:

`as'
     This should be the cross-assembler.

`ld'
     This should be the cross-linker.

`ar'
     This should be the cross-archiver: a program which can manipulate
     archive files (linker libraries) in the target machine's format.

`ranlib'
     This should be a program to construct a symbol table in an archive
     file.

   The installation of GNU CC will find these programs in that
directory, and copy or link them to the proper place to for the
cross-compiler to find them when run later.

   The easiest way to provide these files is to build the Binutils
package and GAS.  Configure them with the same `--host' and `--target'
options that you use for configuring GNU CC, then build and install
them.  They install their executables automatically into the proper
directory.  Alas, they do not support all the targets that GNU CC
supports.

   If you want to install libraries to use with the cross-compiler,
such as a standard C library, put them in the directory
`/usr/local/TARGET/lib'; installation of GNU CC copies all the files in
that subdirectory into the proper place for GNU CC to find them and
link with them.  Here's an example of copying some libraries from a
target machine:

     ftp TARGET-MACHINE
     lcd /usr/local/TARGET/lib
     cd /lib
     get libc.a
     cd /usr/lib
     get libg.a
     get libm.a
     quit

The precise set of libraries you'll need, and their locations on the
target machine, vary depending on its operating system.

   Many targets require "start files" such as `crt0.o' and `crtn.o'
which are linked into each executable; these too should be placed in
`/usr/local/TARGET/lib'.  There may be several alternatives for
`crt0.o', for use with profiling or other compilation options.  Check
your target's definition of `STARTFILE_SPEC' to find out what start
files it uses.  Here's an example of copying these files from a target
machine:

     ftp TARGET-MACHINE
     lcd /usr/local/TARGET/lib
     prompt
     cd /lib
     mget *crt*.o
     cd /usr/lib
     mget *crt*.o
     quit

`libgcc.a' and Cross-Compilers
------------------------------

   Code compiled by GNU CC uses certain runtime support functions
implicitly.  Some of these functions can be compiled successfully with
GNU CC itself, but a few cannot be.  These problem functions are in the
source file `libgcc1.c'; the library made from them is called
`libgcc1.a'.

   When you build a native compiler, these functions are compiled with
some other compiler-the one that you use for bootstrapping GNU CC.
Presumably it knows how to open code these operations, or else knows how
to call the run-time emulation facilities that the machine comes with.
But this approach doesn't work for building a cross-compiler.  The
compiler that you use for building knows about the host system, not the
target system.

   So, when you build a cross-compiler you have to supply a suitable
library `libgcc1.a' that does the job it is expected to do.

   To compile `libgcc1.c' with the cross-compiler itself does not work.
The functions in this file are supposed to implement arithmetic
operations that GNU CC does not know how to open code for your target
machine.  If these functions are compiled with GNU CC itself, they will
compile into infinite recursion.

   On any given target, most of these functions are not needed.  If GNU
CC can open code an arithmetic operation, it will not call these
functions to perform the operation.  It is possible that on your target
machine, none of these functions is needed.  If so, you can supply an
empty library as `libgcc1.a'.

   Many targets need library support only for multiplication and
division.  If you are linking with a library that contains functions for
multiplication and division, you can tell GNU CC to call them directly
by defining the macros `MULSI3_LIBCALL', and the like.  These macros
need to be defined in the target description macro file.  For some
targets, they are defined already.  This may be sufficient to avoid the
need for libgcc1.a; if so, you can supply an empty library.

   Some targets do not have floating point instructions; they need other
functions in `libgcc1.a', which do floating arithmetic.  Recent
versions of GNU CC have a file which emulates floating point.  With a
certain amount of work, you should be able to construct a floating
point emulator that can be used as `libgcc1.a'.  Perhaps future
versions will contain code to do this automatically and conveniently.
That depends on whether someone wants to implement it.

   Some embedded targets come with all the necessary `libgcc1.a'
routines written in C or assembler.  These targets build `libgcc1.a'
automatically and you do not need to do anything special for them.
Other embedded targets do not need any `libgcc1.a' routines since all
the necessary operations are supported by the hardware.

   If your target system has another C compiler, you can configure GNU
CC as a native compiler on that machine, build just `libgcc1.a' with
`make libgcc1.a' on that machine, and use the resulting file with the
cross-compiler.  To do this, execute the following on the target
machine:

     cd TARGET-BUILD-DIR
     ./configure --host=sparc --target=sun3
     make libgcc1.a

And then this on the host machine:

     ftp TARGET-MACHINE
     binary
     cd TARGET-BUILD-DIR
     get libgcc1.a
     quit

   Another way to provide the functions you need in `libgcc1.a' is to
define the appropriate `perform_...' macros for those functions.  If
these definitions do not use the C arithmetic operators that they are
meant to implement, you should be able to compile them with the
cross-compiler you are building.  (If these definitions already exist
for your target file, then you are all set.)

   To build `libgcc1.a' using the perform macros, use
`LIBGCC1=libgcc1.a OLDCC=./xgcc' when building the compiler.
Otherwise, you should place your replacement library under the name
`libgcc1.a' in the directory in which you will build the
cross-compiler, before you run `make'.

Cross-Compilers and Header Files
--------------------------------

   If you are cross-compiling a standalone program or a program for an
embedded system, then you may not need any header files except the few
that are part of GNU CC (and those of your program).  However, if you
intend to link your program with a standard C library such as `libc.a',
then you probably need to compile with the header files that go with
the library you use.

   The GNU C compiler does not come with these files, because (1) they
are system-specific, and (2) they belong in a C library, not in a
compiler.

   If the GNU C library supports your target machine, then you can get
the header files from there (assuming you actually use the GNU library
when you link your program).

   If your target machine comes with a C compiler, it probably comes
with suitable header files also.  If you make these files accessible
from the host machine, the cross-compiler can use them also.

   Otherwise, you're on your own in finding header files to use when
cross-compiling.

   When you have found suitable header files, put them in the directory
`/usr/local/TARGET/include', before building the cross compiler.  Then
installation will run fixincludes properly and install the corrected
versions of the header files where the compiler will use them.

   Provide the header files before you build the cross-compiler, because
the build stage actually runs the cross-compiler to produce parts of
`libgcc.a'.  (These are the parts that *can* be compiled with GNU CC.)
Some of them need suitable header files.

   Here's an example showing how to copy the header files from a target
machine.  On the target machine, do this:

     (cd /usr/include; tar cf - .) > tarfile

   Then, on the host machine, do this:

     ftp TARGET-MACHINE
     lcd /usr/local/TARGET/include
     get tarfile
     quit
     tar xf tarfile

Actually Building the Cross-Compiler
------------------------------------

   Now you can proceed just as for compiling a single-machine compiler
through the step of building stage 1.  If you have not provided some
sort of `libgcc1.a', then compilation will give up at the point where
it needs that file, printing a suitable error message.  If you do
provide `libgcc1.a', then building the compiler will automatically
compile and link a test program called `libgcc1-test'; if you get
errors in the linking, it means that not all of the necessary routines
in `libgcc1.a' are available.

   You must provide the header file `float.h'.  One way to do this is
to compile `enquire' and run it on your target machine.  The job of
`enquire' is to run on the target machine and figure out by experiment
the nature of its floating point representation.  `enquire' records its
findings in the header file `float.h'.  If you can't produce this file
by running `enquire' on the target machine, then you will need to come
up with a suitable `float.h' in some other way (or else, avoid using it
in your programs).

   Do not try to build stage 2 for a cross-compiler.  It doesn't work to
rebuild GNU CC as a cross-compiler using the cross-compiler, because
that would produce a program that runs on the target machine, not on the
host.  For example, if you compile a 386-to-68030 cross-compiler with
itself, the result will not be right either for the 386 (because it was
compiled into 68030 code) or for the 68030 (because it was configured
for a 386 as the host).  If you want to compile GNU CC into 68030 code,
whether you compile it on a 68030 or with a cross-compiler on a 386, you
must specify a 68030 as the host when you configure it.

   To install the cross-compiler, use `make install', as usual.

Installing GNU CC on the Sun
============================

   On Solaris (version 2.1), do not use the linker or other tools in
`/usr/ucb' to build GNU CC.  Use `/usr/ccs/bin'.

   Make sure the environment variable `FLOAT_OPTION' is not set when
you compile `libgcc.a'.  If this option were set to `f68881' when
`libgcc.a' is compiled, the resulting code would demand to be linked
with a special startup file and would not link properly without special
pains.

   There is a bug in `alloca' in certain versions of the Sun library.
To avoid this bug, install the binaries of GNU CC that were compiled by
GNU CC.  They use `alloca' as a built-in function and never the one in
the library.

   Some versions of the Sun compiler crash when compiling GNU CC.  The
problem is a segmentation fault in cpp.  This problem seems to be due to
the bulk of data in the environment variables.  You may be able to avoid
it by using the following command to compile GNU CC with Sun CC:

     make CC="TERMCAP=x OBJS=x LIBFUNCS=x STAGESTUFF=x cc"

   SunOS 4.1.3 and 4.1.3_U1 have bugs that can cause intermittent core
dumps when compiling GNU CC.  A common symptom is an internal compiler
error which does not recur if you run it again.  To fix the problem,
install Sun recommended patch 100726 (for SunOS 4.1.3) or 101508 (for
SunOS 4.1.3_U1), or upgrade to a later SunOS release.

Installing GNU CC on VMS
========================

   The VMS version of GNU CC is distributed in a backup saveset
containing both source code and precompiled binaries.

   To install the `gcc' command so you can use the compiler easily, in
the same manner as you use the VMS C compiler, you must install the VMS
CLD file for GNU CC as follows:

  1. Define the VMS logical names `GNU_CC' and `GNU_CC_INCLUDE' to
     point to the directories where the GNU CC executables
     (`gcc-cpp.exe', `gcc-cc1.exe', etc.) and the C include files are
     kept respectively.  This should be done with the commands:

          $ assign /system /translation=concealed -
            disk:[gcc.] gnu_cc
          $ assign /system /translation=concealed -
            disk:[gcc.include.] gnu_cc_include

     with the appropriate disk and directory names.  These commands can
     be placed in your system startup file so they will be executed
     whenever the machine is rebooted.  You may, if you choose, do this
     via the `GCC_INSTALL.COM' script in the `[GCC]' directory.

  2. Install the `GCC' command with the command line:

          $ set command /table=sys$common:[syslib]dcltables -
            /output=sys$common:[syslib]dcltables gnu_cc:[000000]gcc
          $ install replace sys$common:[syslib]dcltables

  3. To install the help file, do the following:

          $ library/help sys$library:helplib.hlb gcc.hlp

     Now you can invoke the compiler with a command like `gcc /verbose
     file.c', which is equivalent to the command `gcc -v -c file.c' in
     Unix.

   If you wish to use GNU C++ you must first install GNU CC, and then
perform the following steps:

  1. Define the VMS logical name `GNU_GXX_INCLUDE' to point to the
     directory where the preprocessor will search for the C++ header
     files.  This can be done with the command:

          $ assign /system /translation=concealed -
            disk:[gcc.gxx_include.] gnu_gxx_include

     with the appropriate disk and directory name.  If you are going to
     be using a C++ runtime library, this is where its install
     procedure will install its header files.

  2. Obtain the file `gcc-cc1plus.exe', and place this in the same
     directory that `gcc-cc1.exe' is kept.

     The GNU C++ compiler can be invoked with a command like `gcc /plus
     /verbose file.cc', which is equivalent to the command `g++ -v -c
     file.cc' in Unix.

   We try to put corresponding binaries and sources on the VMS
distribution tape.  But sometimes the binaries will be from an older
version than the sources, because we don't always have time to update
them.  (Use the `/version' option to determine the version number of
the binaries and compare it with the source file `version.c' to tell
whether this is so.)  In this case, you should use the binaries you get
to recompile the sources.  If you must recompile, here is how:

  1. Execute the command procedure `vmsconfig.com' to set up the files
     `tm.h', `config.h', `aux-output.c', and `md.', and to create files
     `tconfig.h' and `hconfig.h'.  This procedure also creates several
     linker option files used by `make-cc1.com' and a data file used by
     `make-l2.com'.

          $ @vmsconfig.com

  2. Setup the logical names and command tables as defined above.  In
     addition, define the VMS logical name `GNU_BISON' to point at the
     to the directories where the Bison executable is kept.  This
     should be done with the command:

          $ assign /system /translation=concealed -
            disk:[bison.] gnu_bison

     You may, if you choose, use the `INSTALL_BISON.COM' script in the
     `[BISON]' directory.

  3. Install the `BISON' command with the command line:

          $ set command /table=sys$common:[syslib]dcltables -
            /output=sys$common:[syslib]dcltables -
            gnu_bison:[000000]bison
          $ install replace sys$common:[syslib]dcltables

  4. Type `@make-gcc' to recompile everything (alternatively, submit
     the file `make-gcc.com' to a batch queue).  If you wish to build
     the GNU C++ compiler as well as the GNU CC compiler, you must
     first edit `make-gcc.com' and follow the instructions that appear
     in the comments.

  5. In order to use GCC, you need a library of functions which GCC
     compiled code will call to perform certain tasks, and these
     functions are defined in the file `libgcc2.c'.  To compile this
     you should use the command procedure `make-l2.com', which will
     generate the library `libgcc2.olb'.  `libgcc2.olb' should be built
     using the compiler built from the same distribution that
     `libgcc2.c' came from, and `make-gcc.com' will automatically do
     all of this for you.

     To install the library, use the following commands:

          $ library gnu_cc:[000000]gcclib/delete=(new,eprintf)
          $ library gnu_cc:[000000]gcclib/delete=L_*
          $ library libgcc2/extract=*/output=libgcc2.obj
          $ library gnu_cc:[000000]gcclib libgcc2.obj

     The first command simply removes old modules that will be replaced
     with modules from `libgcc2' under different module names.  The
     modules `new' and `eprintf' may not actually be present in your
     `gcclib.olb'--if the VMS librarian complains about those modules
     not being present, simply ignore the message and continue on with
     the next command.  The second command removes the modules that
     came from the previous version of the library `libgcc2.c'.

     Whenever you update the compiler on your system, you should also
     update the library with the above procedure.

  6. You may wish to build GCC in such a way that no files are written
     to the directory where the source files reside.  An example would
     be the when the source files are on a read-only disk.  In these
     cases, execute the following DCL commands (substituting your
     actual path names):

          $ assign dua0:[gcc.build_dir.]/translation=concealed, -
                   dua1:[gcc.source_dir.]/translation=concealed  gcc_build
          $ set default gcc_build:[000000]

     where the directory `dua1:[gcc.source_dir]' contains the source
     code, and the directory `dua0:[gcc.build_dir]' is meant to contain
     all of the generated object files and executables.  Once you have
     done this, you can proceed building GCC as described above.  (Keep
     in mind that `gcc_build' is a rooted logical name, and thus the
     device names in each element of the search list must be an actual
     physical device name rather than another rooted logical name).

  7. *If you are building GNU CC with a previous version of GNU CC, you
     also should check to see that you have the newest version of the
     assembler*.  In particular, GNU CC version 2 treats global constant
     variables slightly differently from GNU CC version 1, and GAS
     version 1.38.1 does not have the patches required to work with GCC
     version 2.  If you use GAS 1.38.1, then `extern const' variables
     will not have the read-only bit set, and the linker will generate
     warning messages about mismatched psect attributes for these
     variables.  These warning messages are merely a nuisance, and can
     safely be ignored.

     If you are compiling with a version of GNU CC older than 1.33,
     specify `/DEFINE=("inline=")' as an option in all the
     compilations.  This requires editing all the `gcc' commands in
     `make-cc1.com'.  (The older versions had problems supporting
     `inline'.)  Once you have a working 1.33 or newer GNU CC, you can
     change this file back.

  8. If you want to build GNU CC with the VAX C compiler, you will need
     to make minor changes in `make-cccp.com' and `make-cc1.com' to
     choose alternate definitions of `CC', `CFLAGS', and `LIBS'.  See
     comments in those files.  However, you must also have a working
     version of the GNU assembler (GNU as, aka GAS) as it is used as
     the back-end for GNU CC to produce binary object modules and is
     not included in the GNU CC sources.  GAS is also needed to compile
     `libgcc2' in order to build `gcclib' (see above); `make-l2.com'
     expects to be able to find it operational in
     `gnu_cc:[000000]gnu-as.exe'.

     To use GNU CC on VMS, you need the VMS driver programs `gcc.exe',
     `gcc.com', and `gcc.cld'.  They are distributed with the VMS
     binaries (`gcc-vms') rather than the GNU CC sources.  GAS is also
     included in `gcc-vms', as is Bison.

     Once you have successfully built GNU CC with VAX C, you should use
     the resulting compiler to rebuild itself.  Before doing this, be
     sure to restore the `CC', `CFLAGS', and `LIBS' definitions in
     `make-cccp.com' and `make-cc1.com'.  The second generation
     compiler will be able to take advantage of many optimizations that
     must be suppressed when building with other compilers.

   Under previous versions of GNU CC, the generated code would
occasionally give strange results when linked with the sharable
`VAXCRTL' library.  Now this should work.

   Even with this version, however, GNU CC itself should not be linked
with the sharable `VAXCRTL'.  The version of `qsort' in `VAXCRTL' has a
bug (known to be present in VMS versions V4.6 through V5.5) which
causes the compiler to fail.

   The executables are generated by `make-cc1.com' and `make-cccp.com'
use the object library version of `VAXCRTL' in order to make use of the
`qsort' routine in `gcclib.olb'.  If you wish to link the compiler
executables with the shareable image version of `VAXCRTL', you should
edit the file `tm.h' (created by `vmsconfig.com') to define the macro
`QSORT_WORKAROUND'.

   `QSORT_WORKAROUND' is always defined when GNU CC is compiled with
VAX C, to avoid a problem in case `gcclib.olb' is not yet available.

`collect2'
==========

   Many target systems do not have support in the assembler and linker
for "constructors"--initialization functions to be called before the
official "start" of `main'.  On such systems, GNU CC uses a utility
called `collect2' to arrange to call these functions at start time.

   The program `collect2' works by linking the program once and looking
through the linker output file for symbols with particular names
indicating they are constructor functions.  If it finds any, it creates
a new temporary `.c' file containing a table of them, compiles it, and
links the program a second time including that file.

   The actual calls to the constructors are carried out by a subroutine
called `__main', which is called (automatically) at the beginning of
the body of `main' (provided `main' was compiled with GNU CC).  Calling
`__main' is necessary, even when compiling C code, to allow linking C
and C++ object code together.  (If you use `-nostdlib', you get an
unresolved reference to `__main', since it's defined in the standard
GCC library.  Include `-lgcc' at the end of your compiler command line
to resolve this reference.)

   The program `collect2' is installed as `ld' in the directory where
the passes of the compiler are installed.  When `collect2' needs to
find the *real* `ld', it tries the following file names:

   * `real-ld' in the directories listed in the compiler's search
     directories.

   * `real-ld' in the directories listed in the environment variable
     `PATH'.

   * The file specified in the `REAL_LD_FILE_NAME' configuration macro,
     if specified.

   * `ld' in the compiler's search directories, except that `collect2'
     will not execute itself recursively.

   * `ld' in `PATH'.

   "The compiler's search directories" means all the directories where
`gcc' searches for passes of the compiler.  This includes directories
that you specify with `-B'.

   Cross-compilers search a little differently:

   * `real-ld' in the compiler's search directories.

   * `TARGET-real-ld' in `PATH'.

   * The file specified in the `REAL_LD_FILE_NAME' configuration macro,
     if specified.

   * `ld' in the compiler's search directories.

   * `TARGET-ld' in `PATH'.

   `collect2' explicitly avoids running `ld' using the file name under
which `collect2' itself was invoked.  In fact, it remembers up a list
of such names--in case one copy of `collect2' finds another copy (or
version) of `collect2' installed as `ld' in a second place in the
search path.

   `collect2' searches for the utilities `nm' and `strip' using the
same algorithm as above for `ld'.

Standard Header File Directories
================================

   `GCC_INCLUDE_DIR' means the same thing for native and cross.  It is
where GNU CC stores its private include files, and also where GNU CC
stores the fixed include files.  A cross compiled GNU CC runs
`fixincludes' on the header files in `$(tooldir)/include'.  (If the
cross compilation header files need to be fixed, they must be installed
before GNU CC is built.  If the cross compilation header files are
already suitable for ANSI C and GNU CC, nothing special need be done).

   `GPLUS_INCLUDE_DIR' means the same thing for native and cross.  It
is where `g++' looks first for header files.  The C++ library installs
only target independent header files in that directory.

   `LOCAL_INCLUDE_DIR' is used only for a native compiler.  It is
normally `/usr/local/include'.  GNU CC searches this directory so that
users can install header files in `/usr/local/include'.

   `CROSS_INCLUDE_DIR' is used only for a cross compiler.  GNU CC
doesn't install anything there.

   `TOOL_INCLUDE_DIR' is used for both native and cross compilers.  It
is the place for other packages to install header files that GNU CC will
use.  For a cross-compiler, this is the equivalent of `/usr/include'.
When you build a cross-compiler, `fixincludes' processes any header
files in this directory.

